Noticias

¡Ayuda a la Comunidad GM, haz una donación!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Problema con movimiento  (Leído 288 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cher3

en: Octubre 07, 2019, 04:10:07 pm
¡Buenas!Mi problema consiste en lo siguiente:

He creado 2 objetos, el objeto jugador que se mueve "perfectamente" en 8 direcciones y se para cuando colisiona con x objetos, ademas tambien se para si levanto las teclas de direcciones.
Cuando colisiona con otro objeto el cual sería como un NPC y pulsas la letra "A" el personaje debería quedarse quieto y mostrar un mensaje, cuando vuelves a pulsar "A" vuelve a desaparecer.

Sin embargo el problema reside en que para comenzar cuando levanto la tecla "A" Mi personaje sale corriendo en la dirección que mire y además no se desbloquea hasta que pulso arriba,abajo,izquierda y derecha haciendo que pueda volver a caminar con normalidad.
Ademas el mensaje de texto se quita muy rapidamente.¿Alguien sabe como podría arreglarse?

Dejaré aquí abajo todo el codigo gracias de antemano.

PERSONAJE QUE SE MUEVE:
-EVENTO STEP-
global.objeto = 0 { //Si global objeto es 0 significa que puedo andar
if keyboard_check(vk_left)//SI PRESIONO IZQUIERDA
{
    if keyboard_check(vk_up) //Y ARRIBA
        {hspeed=-2.5 vspeed=-2.5}
    else if keyboard_check(vk_down)//Y ABAJO
        {hspeed=-2.5 vspeed=2.5}
    else if keyboard_check(vk_right) {hspeed=0} //Y DERECHA
    else {hspeed=-4} //SOLO IZQUIERDA
   
}
else if keyboard_check(vk_right)//SI PRESIONO DERECHA
{
    if keyboard_check(vk_up) //Y ARRIBA
        {hspeed=2.5 vspeed=-2.5}
    else if keyboard_check(vk_down) //Y ABAJO
        {hspeed=2.5 vspeed=2.5}
    else if keyboard_check(vk_left) {hspeed=0} ////E IZQUIERDA
    else {hspeed=4} //SOLO DERECHA
}

else if keyboard_check(vk_up) and !keyboard_check(vk_right) and !keyboard_check(vk_left) //SI PRESIONO ARRIBA
{
    if keyboard_check(vk_down) vspeed=0;//Y ABAJO
    else vspeed=-4;//SOLO ARRIBA
}

else if keyboard_check(vk_down) and !keyboard_check(vk_right) and !keyboard_check(vk_left) //SI PRESIONO ABAJO
{
    if keyboard_check(vk_up) vspeed=0;//Y ARRIBA
    else vspeed=4;//SOLO ABAJO
}


if !keyboard_check(vk_left) and !(keyboard_check(vk_right))//SI NO PRESIONO IZQUIERDA NI DERECHA
hspeed=0;
if !keyboard_check(vk_up) and !(keyboard_check(vk_down))//SI NO PRESIONO ARRIBA NI ABAJO
vspeed=0;
}
//AQUI ACABA EL OBJETO.0
//Cambiar sprite
if vspeed > 0 and global.objeto = 0
repeat(6)
{
    contador+= 1
    if contador > 50 { contador = 0 subim+=1}
    if subim < 0  subim= 0
    if subim > 3 subim = 0
}
else if vspeed < 0  and  global.objeto = 0
repeat(6)
{
    contador+= 1
    if contador > 50 { contador = 0 subim+=1}
    if subim < 4  subim= 4
    if subim > 7 subim = 4
}
else if vspeed = 0  and  global.objeto = 0
{
    if hspeed < 0
    repeat(6)
    {
    contador+= 1
    if contador > 50 { contador = 0 subim+=1}
    if subim < 8  subim= 8
    if subim > 11 subim= 8
    }
   
    else if hspeed > 0  and  global.objeto = 0
    repeat(6)
    {
    contador+= 1
    if contador > 50 { contador = 0 subim+=1}
    if subim < 12  subim= 12
    if subim > 15 subim= 12
    }
//Colisión muro
}
if keyboard_check_released(vk_down) and vspeed = 0 and hspeed = 0{
subim = 0}
if keyboard_check_released(vk_up) and vspeed = 0 and hspeed = 0{
subim = 4}
if keyboard_check_released(vk_left) and vspeed = 0 and hspeed = 0{
subim = 8}
if keyboard_check_released(vk_right) and vspeed = 0 and hspeed = 0{
subim = 12}

if instance_place(x + hspeed, y,Colision){hspeed = 0;}
if instance_place(x,y + vspeed ,Colision){vspeed = 0;}

//PARARSE AL HABLAR CON UN OBJETO

if instance_place(x + hspeed, y + vspeed,Colision_2) and keyboard_check_pressed(ord("A")) and global.objeto = 0 {global.objeto = 1;}
if global.objeto = 1 {
    hspeed = 0;
    vspeed = 0;
      if keyboard_check_pressed(ord("A")){
              global.objeto = 0;}
}


//no tocar arriba esta todo bien crea el mensaje

if global.objeto = 1 and subim = 0{
    keyboard_key_press(vk_down);
}
if global.objeto = 1 and subim = 4{
    keyboard_key_press(vk_up);
}
if global.objeto = 1 and subim = 8{
    keyboard_key_press(vk_left);
}
if global.objeto = 1 and subim = 12{
    keyboard_key_press(vk_right);
}

OBJETO QUE REALIZA EL TEXTO:

-EVENTO CREATE
///variables de texto
numero= 0 ;
texto[0] = "EASTEREGG,Este mensaje no debería aparecer en la pantalla.";
texto[1] = "Esta frio, parece que ha nevado hace poco." ;

-EVENTO DRAW
if global.objeto = 1 {

draw_self();
draw_set_color(c_white);
draw_set_halign(fa_left);
draw_set_font(Dialogo);
draw_text(x+100, y+100, texto[numero]);


}
-EVENTO PULSACIÓN DE TECLA A
if ( numero < 1)
{
 numero += 1;

}
else
{
instance_deactivate_object(obj_dialogo);
}




Muchas gracias de antemano <3
« última modificación: Octubre 07, 2019, 11:29:17 pm por Johann »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado dixon

  • Habitual
  • *
  • Puntos: 77
  • Mensajes: 43
  • Agradecido: 4 veces
  • Juegos de educación gratis dixon 2019. Prov. 4:7
    • Ver Perfil
Respuesta #1 en: Octubre 07, 2019, 11:27:39 pm
Hola,

Tu objeto camina con keyboard_check(),  y se detiene con keyboard_check_released(),  cuando aparece el mensaje todo se paraliza durante un tiempo indicado, la cuestión es que también se paralizan las funciones del keyboard, la función keyboard_check_released no es tomada en cuenta porque todo esta congelado inclusive la detección de teclas.

La solución adaptable a tu código es: frenar el movimiento del objeto antes que aparezca el dialogo colocando vspeed=0 y hspeed=0;

 


Desconectado dixon

  • Habitual
  • *
  • Puntos: 77
  • Mensajes: 43
  • Agradecido: 4 veces
  • Juegos de educación gratis dixon 2019. Prov. 4:7
    • Ver Perfil
Respuesta #2 en: Octubre 07, 2019, 11:56:49 pm
Hola, Estoy equivocado, respondí sin pensar y sin analizar.

No usas la keyboard_check_released() para detener el objeto. Pero desactivas el frenado del objeto cuando la global.objeto es igual a uno. Si estoy en lo correcto solo tienes que mover una llave y listo

Antes
Código: [Seleccionar]
if !keyboard_check(vk_left) and !(keyboard_check(vk_right))//SI NO PRESIONO IZQUIERDA NI DERECHA
hspeed=0;
if !keyboard_check(vk_up) and !(keyboard_check(vk_down))//SI NO PRESIONO ARRIBA NI ABAJO
vspeed=0;
}

Despues
Código: [Seleccionar]

}
if !keyboard_check(vk_left) and !(keyboard_check(vk_right))//SI NO PRESIONO IZQUIERDA NI DERECHA
hspeed=0;
if !keyboard_check(vk_up) and !(keyboard_check(vk_down))//SI NO PRESIONO ARRIBA NI ABAJO
vspeed=0;

Si esa es la llave final del if global.objeto=0, entonces tienes que moverla de esa manera.

En cuanto al tiempo que dura el mensaje creo que debes modificar el numero de la variable número por 100

ANTES
Código: [Seleccionar]
if ( numero < 1)
{
 numero += 1;

}
else
{
instance_deactivate_object(obj_dialogo);
}

DESPUES
Código: [Seleccionar]
if ( numero < 100)
{
 numero += 1;

}
else
{
instance_deactivate_object(obj_dialogo);
}

 


Desconectado Cher3

Respuesta #3 en: Octubre 08, 2019, 10:59:46 am
nada sigue fallando respecto a lo del valor 100 es para pasar los mensajes no para el tiempo que tarda en quitarse  :'(