¡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.
-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, 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);
}
nada sigue fallando respecto a lo del valor 100 es para pasar los mensajes no para el tiempo que tarda en quitarse :'(