Bueno, ya tengo otro lío otra vez. Cuando me empiece a meter con los plataformas ya será para temblar...

El personaje dependiendo de la room donde se encuentre tiene una determinada velocidad. Osea:

speed = 4

Y el código completo de movimiento a la izquierda es:

EVENT STEP

if place_snapped(32,32)
{
    if keyboard_check(vk_left)
    {
        sprite_index = spr_heroe_left;
        direction = 180;
        speed = 4;
    }
}


Pues iluso de mí, había pensado utilizar la sentencia switch de esta manera:

EVENT CREATE

switch (room)

{
    case PLAYA : obj_heroe.speed = 8;break;
    case Nivel_3: obj_heroe.speed = 16; break;
    default: obj_heroe.speed = 4;break;
}


Echo esto, ¿Nuestro código en el evento step lo deberíamos modificar a?:

speed = obj_heroe.speed;

ó

speed = obj_heroe.room;

He probado varias combinaciones. Pero nuestro personaje se mueve muy lento. No a la velocidad de 8 ó 16 del switch

¡¡¡Ya la tengo otra vez liada!!!  >:( XD

El evento CREATE se ejecuta una sola vez, y ahí estás escogiendo entre varias velocidades. Esto se hace una sola vez

En STEP, que se ejecuta continuamente mientras no mueras, estás indicando que la velocidad es 4, sin importar si en CREATE elegiste 8 o 16.

Cada habitación tiene un evento CREATION CODE que se ejecuta al crear el room. Yo ahí pondría una condición para revisar si existe el jugador. De ser cierta, pondría una variable velocidad_local = 8, por ejemplo.

En el STEP del jugador pones speed = velocidad_local y eso debería hacer que la velocidad cambie con la habitación



Algo tan sencillo como poner en step del personaje...

[gml]if (room == room0) objPersonaje.velo = 5;
else if (room == room1) objPersonaje.velo = 8;
etc...[/gml]

donde velo es una variable creada en el evento CREATE y, a la hora de moverte, usarás la variable velo (por ejemplo... speed = velo, o x += velo) Es parecido al switch, pero debes usar la variable velo, te será más fácil.

Y cosas como speed = obj_heroe.room; no tienen sentido, a menos que room sea una variable de obj_heroe xD

Cita de: DarkKRuleR en Febrero 02, 2014, 09:22:34 PM
Algo tan sencillo como poner en step del personaje...

[gml]if (room == room0) objPersonaje.velo = 5;
else if (room == room1) objPersonaje.velo = 8;
etc...[/gml]



Es que de esa manera ya lo tenía antes (bueno, parecido). Pero imagina que hay 40 rooms. Hay que encadenar muchos IFs. Pensé que poniendo un switch se resumiría mas.

Cita de: DarkKRuleR en Febrero 02, 2014, 09:22:34 PM
Algo tan sencillo como poner en step del personaje...

[gml]if (room == room0) objPersonaje.velo = 5;
else if (room == room1) objPersonaje.velo = 8;
etc...[/gml]

Eso funciona, pero si por ejemplo, el juego tiene 100 rooms, tienes que poner 99 ifs. COn el switch también ocuparías poner un montón de casos.

[gml]if (room == room0 or room == room1 or room == room2...[/gml]

si hay tantas rooms y cada una tiene una velocidad distinta, de alguna forma hay que decírselo, y el if (.. or ... or ..) es lo más rápido. El switch es peor, ocupa más y tienes que hacer igualmente case para cada caso

#6 Febrero 02, 2014, 10:30:51 PM Ultima modificación: Febrero 02, 2014, 10:43:39 PM por penumbra
Switch es más rápido que IF. Switch está optimizado para elegir entre distintas opciones. No sólo en GML, creo que en cualquier otro lenguaje es asi.

Acá hay un test de velocidad entre Switch e IF en Game maker. http://gmc.yoyogames.com/index.php?showtopic=490446 Pongo un ejemplo:

if-statments:2960ns
Switch:620ns

if-statments:2650ns
Switch:630ns

Ahora, en el caso del juego de Jangse, la diferencia de velocidad entre IF y Switch me parece secundaria. Es cierto que de algún modo hay que dercírselo, pero con IF o con SWITCh, tienes que preguntar antes de decírselo (probar una condición o caso), en cambio con el código en CREATION CODE del room, no preguntas nada, símplemente le dices la velocidad que es y ya. Y otra cosa, el evento CREATION CODE se ejecuta una vez, durante un solo STEP por cada habitación, en cambio el SWITCH o IF en STEP se ejecutaría continuamente todo el rato, siendo innecesario ya que generalmente duras mucho tiempo en una misma habitación.





Extracto del manual del GM
"So, for example, the room-start events can use variables set by the creation code for the room..." ( Entonces, por ejemlo, el evento Room Start puede USAR variables inicialisadas por el Creation Code del room...)
Por lo cual segundo a penumbra, deverias inicialisar la variable en el Creation Code del room con la velocidad que deses que el obj_jugador tenga en ese room, esto debes hacerlo con cada room:
velacidad_local = 8; // uso el mismo ejemplo de penumbra :-P

Luego en el evento Other / Room Start del obj_jugador pones:
speed = velocidad_local;

De esta forma la variable speed tomara el valor que tu le hayas asignado a la variable velocidad_local en el Creation Code del room.
The next best thing to knowing something,
is knowing where to find it.

Cita de: vampy09 en Febrero 03, 2014, 04:38:59 AM
Extracto del manual del GM
"So, for example, the room-start events can use variables set by the creation code for the room..." ( Entonces, por ejemlo, el evento Room Start puede USAR variables inicialisadas por el Creation Code del room...)
Por lo cual segundo a penumbra, deverias inicialisar la variable en el Creation Code del room con la velocidad que deses que el obj_jugador tenga en ese room, esto debes hacerlo con cada room:
velacidad_local = 8; // uso el mismo ejemplo de penumbra :-P

Luego en el evento Other / Room Start del obj_jugador pones:
speed = velocidad_local;

De esta forma la variable speed tomara el valor que tu le hayas asignado a la variable velocidad_local en el Creation Code del room.

He puesto el código que comentas y me sale este error (no reconoce la variable):

ERROR in
action number 1
of Other Event: Room Start
for object obj_heroe:

Error in code at line 1:
   speed = velocidad;
          ^
at position 9: Unknown variable velocidad


Y en creation code de la room he puesto:

velocidad = 4;

Haz la variable velocidad global:

Creation Code Room

global.velocidad =4;


Evento Other Room Start obj_jugador

speed = global.velacidad;

De esta forma ahora si speed tendra acceso al valor que tenga velocidad.
The next best thing to knowing something,
is knowing where to find it.

Cita de: vampy09 en Febrero 03, 2014, 10:05:18 PM
Haz la variable velocidad global:

Creation Code Room

global.velocidad =4;


Evento Other Room Start obj_jugador

speed = global.velacidad;

De esta forma ahora si speed tendra acceso al valor que tenga velocidad.

Gracias! Ahora sí funciona. Aunque si pongo speed = velocidad en el evento create del jugador no la reconoce. Cosa que no entiendo por que también la estamos declarando. Que para eso sirve el create. Pero en el evento Room Start, sí funciona como tu comentabas.

Supongo que el Room Start, inicializa antes esta variable. Y que quizás, el evento create lo hace mas tarde ¿No?

Tampoco puse global.velocidad. Puse obj_heroe.velocidad = 4, en el código de la room. Pero a efectos es lo mismo.

Bueno segun tengo entendido el evento Create sucede ANTES que el evento Room Start. En MI opinion, creo que el evento Room Start esta "relacionado" con el Creation Code del room.
Aunque aclaro: no es su unico proposito.
Pero si has logrado que funcione como tu deseas, pues Enhorabuena! Eso es lo que importa!
Saludos!
The next best thing to knowing something,
is knowing where to find it.

#12 Febrero 04, 2014, 10:15:52 PM Ultima modificación: Febrero 04, 2014, 10:45:20 PM por penumbra
Por eso puse esto:

Cita de: penumbra en Febrero 02, 2014, 09:20:11 PM
Yo ahí pondría una condición para revisar si existe el jugador. De ser cierta, pondría una variable velocidad_local = 8, por ejemplo.

Para evitar esto:

Cita de: Jangse en Febrero 04, 2014, 07:44:19 PM
en el evento create del jugador no la reconoce.

Es decir, hacer que la global.velocidad sólo cambie/se ajuste si existe el objeto jugador. El cambio de velocidad en el objeto jugador debería ser en STEP, no en CREATE, a menos que el jugador se cree cada vez que se entra a una nueva habitación. Si el objeto jugador es persistente, En CREATE del jugador se puede poner un valor de speed cualquiera que sea, sólo para iniciar la variable y luego en STEP se podría poner

if (speed != global.velocidad)
     speed = global.velocidad                            //Ajustar la velocidad en STEP sólamente si global.velocidad no coincide con la velocidad anterior