Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: kriss8725 en Abril 26, 2014, 12:04:18 AM

Título: Evitar presionar dos teclas de dirección.
Publicado por: kriss8725 en Abril 26, 2014, 12:04:18 AM
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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: juanbustos en Abril 26, 2014, 01:56:40 AM
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
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: YOR en Abril 26, 2014, 05:16:42 AM
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
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: vampy09 en Abril 28, 2014, 05:59:44 AM
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;
    }
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: cancerbero666 en Abril 28, 2014, 07:10:07 AM
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
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: vampy09 en Abril 28, 2014, 07:28:53 AM
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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: cancerbero666 en Abril 28, 2014, 08:26:21 AM
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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: 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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: cancerbero666 en Abril 28, 2014, 09:50:33 AM
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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: 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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: cancerbero666 en Abril 28, 2014, 10:21:32 PM
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
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: kriss8725 en Abril 29, 2014, 12:43:04 AM
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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: 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;

Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: cancerbero666 en Abril 29, 2014, 08:13:59 AM
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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: Killer en Abril 29, 2014, 09:32:22 AM
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.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: cancerbero666 en Abril 29, 2014, 12:00:06 PM
Cita de: Killer en Abril 29, 2014, 09:32:22 AM
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.


killer gracias si que funca, fallo mio tenia puesto algo en el create, si que se mueve incluso cuando esta parado, lo que pregunte antes mas arriba, era como hacer que el personaje empiece quieto sin animación, y que cuando dejes de pulsar las teclas también se quede quieto del todo sin animación, si se puede se agradece mucho la ayuda y el interés prestado.
Otra cosa he intentado probar el ejemplo que pusiste y me da error el de: exception reading asset from GMLfiles "config:: configs\default
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: kriss8725 en Abril 29, 2014, 04:25:44 PM
Ahora tengo el siguiente problema, cuando estoy presionando alguna tecla de dirección por ejemplo la derecha mi personaje comienza a caminar pero si inmediatamente suelto esa tecla y presiono la tecla hacia arriba el personaje continua con el movimiento hacia la derecha.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: Killer en Abril 29, 2014, 06:42:06 PM
Cita de: cancerbero666 en Abril 29, 2014, 12:00:06 PM
killer gracias si que funca, fallo mio tenia puesto algo en el create, si que se mueve incluso cuando esta parado, lo que pregunte antes mas arriba, era como hacer que el personaje empiece quieto sin animación, y que cuando dejes de pulsar las teclas también se quede quieto del todo sin animación, si se puede se agradece mucho la ayuda y el interés prestado.
Otra cosa he intentado probar el ejemplo que pusiste y me da error el de: exception reading asset from GMLfiles "config:: configs\default

El ejemplo fue creado con la versión 1.3.1307, y al menos puede abrirse desde la versión 1.2.1224, no puedo garantizar nada para versiones anteriores a esa. Si tienes una versión entre las que he puesto, asegúrate de que el archivo fue descargado por completo sin interrupciones.

Sobre quitar la animación cuando esta quieto, al if de movimiento agrégale un image_speed = 1 y un else con image_speed = 0 y image_index = 0



Cita de: kriss8725 en Abril 29, 2014, 04:25:44 PM
Ahora tengo el siguiente problema, cuando estoy presionando alguna tecla de dirección por ejemplo la derecha mi personaje comienza a caminar pero si inmediatamente suelto esa tecla y presiono la tecla hacia arriba el personaje continua con el movimiento hacia la derecha.

La naturaleza del código impide esa clase de comportamiento, el estado de cada tecla esta atado a su dirección específica y se actualiza en cada step, en tanto lo hayas puesto en el evento step.

Me temo que el problema es de tu lado, y sin más información no tengo como saber que lo causa.
Título: Re:Evitar presionar dos teclas de dirección.
Publicado por: cancerbero666 en Abril 29, 2014, 11:13:50 PM
 killer muchísimas gracias ya me va perfecto, perdón por mi torpeza, eres una maquina