Octubre 07, 2019, 04:10:07 PM Ultima modificación: Octubre 07, 2019, 11:29:17 PM por Johann
¡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-
[gml]
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);
}[/gml]

OBJETO QUE REALIZA EL TEXTO:

-EVENTO CREATE
[gml]
///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]);


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

}
else
{
instance_deactivate_object(obj_dialogo);
}

[/gml]



Muchas gracias de antemano <3

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;
Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.

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
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

}
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
if ( numero < 1)
{
numero += 1;

}
else
{
instance_deactivate_object(obj_dialogo);
}


DESPUES
if ( numero < 100)
{
numero += 1;

}
else
{
instance_deactivate_object(obj_dialogo);
}
Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.

nada sigue fallando respecto a lo del valor 100 es para pasar los mensajes no para el tiempo que tarda en quitarse  :'(