En algunos juegos antiguos, que no usaban el scroll, el personaje cuando llegaba al final de una pantalla (o nivel) aparecía en la siguiente manteniendo su posición. Es decir, si una room tenía unas plataformas (y estabamos en la superior), el personaje en la siguiente room aparecía en esa plataforma (la superior). Nuestro personaje guardaba su posición de la pantalla anterior y la mantenía en la nueva pantalla.

Pongo un ejemplo de un juego MSX que todos conoceréis:

http://www.youtube.com/watch?v=69TpJpqW7D8

Supongo que habrá que crear alguna variable que guarde la posición del jugador de la room o pantalla anterior ¿No?

¿Es complicado hacerlo en GML?

#1 Febrero 08, 2014, 10:00:56 PM Ultima modificación: Febrero 08, 2014, 10:02:32 PM por penumbra
Tener una variable
room_nuevo

que indique si un room es "nuevo" (1, se acaba de entrar) o es "viejo" (0)

Ajustar  una alarma = 1 (un solo paso) solamente cuando se entra a un room, para cambiar la variable room_nuevo de 1 a cero

en SETEP se debe "monitorear" la posición del jugador en todo momento y guardarla, excepto cuando una habitación es nueva
if (!room_nuevo)
{
   pos_previa[0] = obj_player.x
   pos_previa[1] = obj_player.y
}


IF (room_nuevo)
{
    obj_player.x = pos_previa[0]
    obj_player.y = pos_previa[1]
}

Gracias. Pero como todavía me ando peleando con el GML, aún me cuesta entender ese código (me refiero a la lógica que utiliza). Que seguro será super fácil. En mi juego aún no lo voy a aplicar. Era una duda que tenía de cara a futuros proyectos.

Ahora, cuando el personaje cambia de room (o nivel) sitúo yo su posición dentro de la room. Es decir, colocando yo el obj_heroe dentro de la misma. Pero claro, no es lógico que nuestro personaje este en una parte alta de una room y cuando pase a la siguiente, aparezca por el suelo. Es a lo que me refiero.

Según tu ejemplo, bastaría crear la variable: room_nuevo en el evento create del jugador. Y el resto de código en el evento step del mismo ¿No es así?

Cita de: Jangse en Febrero 09, 2014, 06:44:48 PM
Pero claro, no es lógico que nuestro personaje este en una parte alta de una room y cuando pase a la siguiente, aparezca por el suelo. Es a lo que me refiero.

Pues eso es relativo. Depende de cómo imagines tu mundo. No soy mucho de jugar juegos puzzle o maze, pero en la mayoría que recuerdo, si uno entraba por una puerta que está en lo alto, aparecía generalmente en otra habitación en una puerta que también estaba en lo alto, pero no tiene por qué ser así. Si te imaginas las habitaciones como cubos, éstos pueden no estar alineados, a lo mejor la puerta de uno está en lo alto, pero en el otro cubo, la puerta queda al nivel del suelo.

Cita de: Jangse en Febrero 09, 2014, 06:44:48 PM
Según tu ejemplo, bastaría crear la variable: room_nuevo en el evento create del jugador. Y el resto de código en el evento step del mismo ¿No es así?

Sí, sería lo más fácil y natural, aunque la variable puede ir en cualquier objeto persistente, incluso también el código para posicionar al jugador, aunque hacerlo así a lo mejor es revoltoso.

Cita de: penumbra
Pues eso es relativo. Depende de cómo imagines tu mundo. No soy mucho de jugar juegos puzzle o maze, pero en la mayoría que recuerdo, si uno entraba por una puerta que está en lo alto, aparecía generalmente en otra habitación en una puerta que también estaba en lo alto, pero no tiene por qué ser así. Si te imaginas las habitaciones como cubos, éstos pueden no estar alineados, a lo mejor la puerta de uno está en lo alto, pero en el otro cubo, la puerta queda al nivel del suelo.

Eso es cierto. Y claro, las room serían como cubos. Entonces el personaje va caminando y de repente se encuentra unas escaleras que va a una habitación inferior. Lo lógico es que en esa nueva habitación (que queda por debajo de donde estabamos) el personaje aparezca por una coordenada igual. Si no, parecería Matrix.



No sé si se podria hacer de la siguiente forma:

En el evento step del personaje, un case que según la room donde estés te coloque el personaje en su x, y correspondiente, que tu le marcas...

pseudocódigo:

case(room)
rm_1: obj_personaje.x=100; obj_personaje.y=100; break;
rm_2:....
...

saludos

Fan de los retro-juegos 2D, arcades, plataformas. Programador. Amiga and MSX fan

Después de probar algunos códigos he creado este para cambiar de room (aunque luego diré el problema que me surge).

Por ejemplo, si la room tiene unas dimensiones de 640 x 480, en el evento step de nuestro personaje:

if (obj_heroe.x > 640) and (room  = (Nivel_3))
{
    room_goto(Nivel_4);
}


Osea, si estamos en el nivel_3 y nos salimos por la derecha pasamos al nivel_4. Con la coordenada o varible y hacemos algo similar.

if (obj_heroe.y > 480 ) and (room = (Nivel_3))
{
    room_goto(Nivel_5); // Osea, un nivel inferior a donde estamos.
}


Esta claro que luego podemos utilizar un switch para confeccionar todas las rooms.

¿Pero como hacemos que (mediante este código) el personaje cuando entre en la room nueva siga la misma ruta?

No sé si sería bueno aplicar el evento outside room ???