Abril 26, 2014, 12:04:18 AM Ultima modificación: Abril 26, 2014, 12:15:33 AM por kriss8725
Hola buenas tardes, tengo la siguiente duda, en mi juego tengo un personaje que se mueve mediante las flechas de dirección del teclado pero el problema biene cuando presiono al mimo tiempo por ejemplo la tecla izquierda - arriba, el jugador se va en diagonal y eso es lo que deseo evitar que aunque un usuario presione esas dos teclas al mismo tiempo no realice ningun movimiento. De antemano gracias.

ami me pasa que al disparar y saltar al mismo tiempo mi personaje volaba  XD
todavia no lo solucione o tambien hacia un tipo paso makel jakson

kriss8725   Puedes usar este codigo, en un evento step, a mi me funcionó.

if (keyboard_check(vk_up) && keyboard_check(vk_right))   //si se aprieta la flecha derecha y a la vez la de arriba
    {ispeed=0;}                                                              //la velocidad se anula
    else ispeed=5;                                                         //si no se aprietan los dos, la velocidad no se anula

if keyboard_check(vk_right)
    x+=ispeed;
if keyboard_check(vk_left)
    x-=ispeed;
if keyboard_check(vk_up)
    y-=ispeed;
if keyboard_check(vk_down)
    y+=ispeed;


Ojo! el código debe estar en ese orden, puesto que si primero defines los movimientos horizontales y verticales y luego haces la condición If, no va a funcionar... No se muy bien como es tu juego, pero el codigo general sería asi... y esto lo puedes extender para cuando se aprieta izquierda y arriba, abajo y derecha

#3 Abril 28, 2014, 05:59:44 AM Ultima modificación: Abril 28, 2014, 06:15:50 AM por vampy09
hspeed = keyboard_check( vk_right ) - keyboard_check( vk_left );

Esta linea asigna el valor a hspeed dependiendo del resultado de la expresión.
La función keyboard_check, que puede ser true (1) o false (0).

Entonces por ejemplo si vk_right esta siendo presionada mientras que vk_left no el resultado sería 1 - 0 = 1

Pero si vk_left esta siendo presionada y vk_right no el resultado sería 0 - 1 = -1

Si ninguna esta siendo presionada el resultado sería 0 - 0 = 0

Y si ambas son presionadas el resultado sería 1 - 1 = 0

Ejemplo:
hspeed = keyboard_check( vk_right ) - keyboard_check( vk_left );

vspeed = keyboard_check( vk_down ) - keyboard( vk_up );

if ( hspeed != 0 )
    {
     vspeed = 0;
     speed *= 5;
    }
The next best thing to knowing something,
is knowing where to find it.

hola a todos como seria con este código que al dejar de pulsar las teclas, el personaje se quede parado no como si estuviera corriendo gracias
wilkinson escapes

Las variables locales hspeed , vspeed son las que "simulan" el movimiento de un objeto.
Por tanto mientras que estas variables tengan un valor igual a 0 podemos entonces decir que el objeto no se esta moviendo.
The next best thing to knowing something,
is knowing where to find it.

el ejemplo de yor funciona bien

if (keyboard_check(vk_up) && keyboard_check(vk_right))   //si se aprieta la flecha derecha y a la vez la de arriba
    {ispeed=0;}                                                              //la velocidad se anula
    else ispeed=5;                                                         //si no se aprietan los dos, la velocidad no se anula

if keyboard_check(vk_right)
    x+=ispeed;
if keyboard_check(vk_left)
    x-=ispeed;
if keyboard_check(vk_up)
    y-=ispeed;
if keyboard_check(vk_down)
    y+=ispeed;

el problema es al poner las otras direciones osea

if (keyboard_check(vk_up) && keyboard_check(vk_left))
if (keyboard_check(vk_down) && keyboard_check(vk_right))
if (keyboard_check(vk_down) && keyboard_check(vk_left))

no se como hacerlo he probado de varias maneras pero no funca, en la direcion que puso yor no se mueve pero las otras 3 si

vampy09 he probado tu código pero no me funciono se movía muy deprisa para los lados y muy lento arriba y abajo, pero seguía moviéndose en diagonal, lo que se detenga cuando no pulsas teclas antes lo tenia con D&D y funcionaba, ahora con GML no se como ponerlo en el código para que funcione, perdón por mi ignorancia.
wilkinson escapes

Prueba con esto:

var key_right,key_left,key_up,key_down,keys;

key_right = keyboard_check(vk_right);
key_left = keyboard_check(vk_left);
key_up = keyboard_check(vk_up);
key_down = keyboard_check(vk_down);

keys = key_right + key_left + key_up + key_down;

if (keys == 1){
  x += (key_right - key_left) * 5;
  y += (key_down - key_up) * 5;
}


Usando keyboard_check el código asigna el estado de cada tecla a una variable, siendo el estado 0 si no está presionada y 1 si lo está, luego suma todas las variables en otra variable de control. Con un if se verifica si dicha variable contiene un 1, que significa que solo una tecla se está presionando, para ejecutar el código de movimiento.

Cita de: Killer en Abril 28, 2014, 08:44:13 AM
Prueba con esto:

var key_right,key_left,key_up,key_down,keys;

key_right = keyboard_check(vk_right);
key_left = keyboard_check(vk_left);
key_up = keyboard_check(vk_up);
key_down = keyboard_check(vk_down);

keys = key_right + key_left + key_up + key_down;

if (keys == 1){
  x += (key_right - key_left) * 5;
  y += (key_down - key_up) * 5;
}


Usando keyboard_check el código asigna el estado de cada tecla a una variable, siendo el estado 0 si no está presionada y 1 si lo está, luego suma todas las variables en otra variable de control. Con un if se verifica si dicha variable contiene un 1, que significa que solo una tecla se está presionando, para ejecutar el código de movimiento.


killer gracias con esto va perfecto lo del movimiento, lo que pasa que si pulsas por ejemplo derecha y después arriba, el personaje cambia el sprite hacia arriba luego sueltas arriba y el personaje se desplaza ala derecha bien, pero con el sprite de arriba tienes que soltar y apretar de nuevo la tecla derecha para que ponga el sprite de ir ala derecha, pasa en todas las direcciones, es un mal menor pero como va a ser un juego para android abecés igual es inevitable pulsar dos teclas sin querer, tendría solución?, y solo me quedaría eso y que se pare por completo cuando suelto las teclas.
wilkinson escapes

El código que he puesto hace que el objeto se detenga por completo si no se están presionando las teclas de dirección, si contigo no lo hace probablemente estas usando directa o indirectamente alguna de las variables speed en alguna parte.

Para evitar que el objeto se mueva con el sprite equivocado haz que el cambio de sprites dependa del movimiento, no de las teclas presionadas.

Cita de: Killer en Abril 28, 2014, 08:52:59 PM
El código que he puesto hace que el objeto se detenga por completo si no se están presionando las teclas de dirección, si contigo no lo hace probablemente estas usando directa o indirectamente alguna de las variables speed en alguna parte.

Para evitar que el objeto se mueva con el sprite equivocado haz que el cambio de sprites dependa del movimiento, no de las teclas presionadas.


Tienes razón killer tengo puesto que cambien de sprite al pulsar una tecla, seria mucha molestia decirme como hacer, como dices tu que dependa del movimiento y no de las teclas, gracias
wilkinson escapes

Fantastico por eso me gusta esta comunidad por que hay mucha gente dispuesta a ayudarte en tus dudas, me sirvieron mucho su respuestas sobre todo la de killer fue el método que utilice, de antemano gracias.

Cancerbero666 compara las coordenadas actuales del objeto con las anteriores, preferiblemente después del código que puse anteriormente:

if x>xprevious sprite_index = spr_Derecha;
if x<xprevious sprite_index = spr_Izquierda;
if y>yprevious sprite_index = spr_Abajo;
if y<yprevious sprite_index = spr_Arriba;


Cita de: Killer en Abril 29, 2014, 03:04:16 AM
Cancerbero666 compara las coordenadas actuales del objeto con las anteriores, preferiblemente después del código que puse anteriormente:

if x>xprevious sprite_index = spr_Derecha;
if x<xprevious sprite_index = spr_Izquierda;
if y>yprevious sprite_index = spr_Abajo;
if y<yprevious sprite_index = spr_Arriba;



killer he añadido esto al código y si cambia de dirección si se desplaza a la velocidad pero va flotando ya no hace la animación de correr, he mirado he probado unas cuantas cosas antes de postear de nuevo pero no lo consigo, si serias tan amable de decirme como y de disculpar mi torpeza gracias.
wilkinson escapes

#14 Abril 29, 2014, 09:32:22 AM Ultima modificación: Abril 29, 2014, 09:34:57 AM por Killer
He probado ambos códigos juntos y funcionan como deberian, si no te estan mostrando animaciones es por algo que tu haz puesto, por lo tanto solo puedo adivinar cual seria el problema. ¿Eliminaste lo que tenias antes para mover al objeto y cambiar su sprite?

Tambien a tener en cuenta es que el código asi como esta mantiene el sprite animado aún cuando no se mueve, así que si nisiquiera muestra esa animación probablemente cambiaste la variable image_speed a 0.