Game Maker Al cambiar de room no se mantiene la velocidad

OP

RagBoy

Jr. Member
Mensajes
26
Reacciones
21
Puntos
72
Hola muy buenas, me alegra ver que el foro aun sigue en funcionamiento, un foro que he conocido gente que me ha ayudado muchisimo, espero que ahora puedan volver a hacerlo, cabe decir que como siempre si acabo el juego que estoy haciendo ahora mismo siempre lo publicaré en este foro para apoyarlo, como hice con mis otros juegos
thump_up.


Bueno empiezo estoy haciendo un juego tipo castlevania, he puesto el personaje persistente para que no haya que crearlo en cada room, pasa que cuando me teletransporto de un room a otro, como que no registra que tengo el boton de izquierda o derecha pulsado y me detiene la velocidad del personaje, si lo dejo de pulsar y lo vuelvo a pulsar sigue funcionando bien, no se si me explico, normalmente en un castlevania cuando pasas de un room a otro dejando pulsado el botón de izquierda o derecha el personaje sigue caminando en la otra habitación sin problemas, pero parece ser que en GM 8.0 no pasa eso, no registra que estas pulsando el botón y te pone el hspeed a 0 o nose, pregunté en el foro oficial de gamemaker y me dieron una posible solución pero no funcionó del todo bien era la siguiente:

-En el warp puse:
obj_warpcastillo:


//Char collision:
global.warp=6

if(keyboard_check(vk_right)) {
global.presionandoLateral = 1;
}
else if(keyboard_check(vk_left)) {
global.presionandoLateral = 2;
}

room_goto(roomCastilloCampo)



-Y en el codigo del room:
//room code:
if global.presionandoLateral == 1{
keyboard_key_press(vk_right)
}
else
if global.presionandoLateral == 2{
keyboard_key_press(vk_left)
global.presionandoLateral = 0;
}
if global.warp=6{
with (drk_obj){
x=12;
y=112;
}
}

-Eso hace que funcione bien y si toco el warp y me cambia el room dejando pulsado el botón de izquierda o derecha el personaje se siga moviendo si problemas, pero ocurre un bug y esque si toco el warp sin dejar el botón pulsado, cuando me cambia el room el personaje se mueve solo, porque para tocar el room tengo que pulsar o mantener pulsado el botón de iz o der y eso hace que la variable siempre la ponga en 1 o 2 y nunca en 0 para que detenga la velocidad.

Bueno no se si me han entendido bien, pero si a alguien se le ocurre otra forma de hacerlo o arreglar esta que he puesto bienvenido sea, un saludo y gracias de antemano!
 

YoshiFanGM

雲寶
Moderador
Mensajes
1.141
Reacciones
617
Puntos
816
Ubicación
Mitras
Hola muy buenas, me alegra ver que el foro aun sigue en funcionamiento, un foro que he conocido gente que me ha ayudado muchisimo, espero que ahora puedan volver a hacerlo, cabe decir que como siempre si acabo el juego que estoy haciendo ahora mismo siempre lo publicaré en este foro para apoyarlo, como hice con mis otros juegos
thump_up.


Bueno empiezo estoy haciendo un juego tipo castlevania, he puesto el personaje persistente para que no haya que crearlo en cada room, pasa que cuando me teletransporto de un room a otro, como que no registra que tengo el boton de izquierda o derecha pulsado y me detiene la velocidad del personaje, si lo dejo de pulsar y lo vuelvo a pulsar sigue funcionando bien, no se si me explico, normalmente en un castlevania cuando pasas de un room a otro dejando pulsado el botón de izquierda o derecha el personaje sigue caminando en la otra habitación sin problemas, pero parece ser que en GM 8.0 no pasa eso, no registra que estas pulsando el botón y te pone el hspeed a 0 o nose, pregunté en el foro oficial de gamemaker y me dieron una posible solución pero no funcionó del todo bien era la siguiente:

-En el warp puse:
obj_warpcastillo:


//Char collision:
global.warp=6

if(keyboard_check(vk_right)) {
global.presionandoLateral = 1;
}
else if(keyboard_check(vk_left)) {
global.presionandoLateral = 2;
}

room_goto(roomCastilloCampo)



-Y en el codigo del room:
//room code:
if global.presionandoLateral == 1{
keyboard_key_press(vk_right)
}
else
if global.presionandoLateral == 2{
keyboard_key_press(vk_left)
global.presionandoLateral = 0;
}
if global.warp=6{
with (drk_obj){
x=12;
y=112;
}
}

-Eso hace que funcione bien y si toco el warp y me cambia el room dejando pulsado el botón de izquierda o derecha el personaje se siga moviendo si problemas, pero ocurre un bug y esque si toco el warp sin dejar el botón pulsado, cuando me cambia el room el personaje se mueve solo, porque para tocar el room tengo que pulsar o mantener pulsado el botón de iz o der y eso hace que la variable siempre la ponga en 1 o 2 y nunca en 0 para que detenga la velocidad.

Bueno no se si me han entendido bien, pero si a alguien se le ocurre otra forma de hacerlo o arreglar esta que he puesto bienvenido sea, un saludo y gracias de antemano!

Hola!

Traté de reproducir el bug pero no salió, tal vez sea porque usé el GameMaker 8.1... Se me hace muy extraño que te suceda eso. Intenté probar con un objeto persistente que se teletransportara a otro room al tocar un objeto, y el botón seguía funcionando.

¿No tienes nada en el evento Create que esté interfiriendo con la velocidad del personaje, o en algún otro objeto?
 
OP

RagBoy

Jr. Member
Mensajes
26
Reacciones
21
Puntos
72
Hola!

Traté de reproducir el bug pero no salió, tal vez sea porque usé el GameMaker 8.1... Se me hace muy extraño que te suceda eso. Intenté probar con un objeto persistente que se teletransportara a otro room al tocar un objeto, y el botón seguía funcionando.

¿No tienes nada en el evento Create que esté interfiriendo con la velocidad del personaje, o en algún otro objeto?
Deja tienes razón debe de ser algo del personaje porque he probado en otro engine que descarge en internet de otra cosa y funciona bien, aunque es en el 1.4 pero bueno, el codigo de movimiento del personaje me lo hizo un amigo porque yo no tenia ni idea de como hacerlo y puede ser cualquier cosa.
 
Última edición:

YoshiFanGM

雲寶
Moderador
Mensajes
1.141
Reacciones
617
Puntos
816
Ubicación
Mitras
Deja tienes razón debe de ser algo del personaje porque he probado en otro engine que descarge en internet de otra cosa y funciona bien, aunque es en el 1.4 pero bueno, el codigo de movimiento del personaje me lo hizo un amigo porque yo no tenia ni idea de como hacerlo y puede ser cualquier cosa.
OK... creo que ya supe cuál es el problema.

Parece ser que la función "keyboard_check()" se pone en 0 cuando se cambia de room. Ví que todo el código que mueve al personaje usa esa función, y es por eso que lo afecta.

Lo que se puede hacer es crear una variable en el evento “Create” que se llame "tecla" (o como tú prefieras) y ponerla en 0
Código:
tecla = 0;

Luego agregas el evento de “Room End” y ahí haces que se guarde el botón de movimiento en esa variable
Código:
if (keyboard_check(vk_left)) {
   tecla = vk_left;
} else if (keyboard_check(vk_right)) {
   tecla = vk_right;
} else {
   tecla = 0;
}

Por último, agregas el evento “Room Start” y pones la función para simular una tecla pulsada con la variable
Código:
if (tecla != 0) {
   keyboard_key_press(tecla);
   tecla = 0;
}

Lo agregué al engine que me pasaste y me funcionó sin problema.
 
OP

RagBoy

Jr. Member
Mensajes
26
Reacciones
21
Puntos
72
OK... creo que ya supe cuál es el problema.

Parece ser que la función "keyboard_check()" se pone en 0 cuando se cambia de room. Ví que todo el código que mueve al personaje usa esa función, y es por eso que lo afecta.

Lo que se puede hacer es crear una variable en el evento “Create” que se llame "tecla" (o como tú prefieras) y ponerla en 0
Código:
tecla = 0;

Luego agregas el evento de “Room End” y ahí haces que se guarde el botón de movimiento en esa variable
Código:
if (keyboard_check(vk_left)) {
   tecla = vk_left;
} else if (keyboard_check(vk_right)) {
   tecla = vk_right;
} else {
   tecla = 0;
}

Por último, agregas el evento “Room Start” y pones la función para simular una tecla pulsada con la variable
Código:
if (tecla != 0) {
   keyboard_key_press(tecla);
   tecla = 0;
}

Lo agregué al engine que me pasaste y me funcionó sin problema.
Listo con esto se arregló muchisimas gracias, me solucionaste algo que ni en el foro oficial sabían, si sale algo raro te aviso. Un saludo!
 
OP

RagBoy

Jr. Member
Mensajes
26
Reacciones
21
Puntos
72
Listo con esto se arregló muchisimas gracias, me solucionaste algo que ni en el foro oficial sabían, si sale algo raro te aviso. Un saludo!
Perdona me he precipitado al contestar en realidad no se ha solucionado del todo, me pasa lo mismo que la solución que me dieron en el foro oficial, lo que pasa es que ocurre con menos frecuencia, por ejemplo pasa 3 veces de cada 50 veces que lo haces y es que si tocas el warp sin dejar pulsado el botón, el personaje se teletransporta al otro room y se mueve solo, y no se para hasta que no vuelves a pulsar la tecla. Es como si no pusiera la variable en 0.

Intenté solucionarlo yo pero sin éxito poniendo en room end:

if (keyboard_check(vk_left)) && (!keyboard_key_release(vk_left)){
tecla = vk_left;
} else if (keyboard_check(vk_right)) && (!keyboard_key_release(vk_right)) {
tecla = vk_right;
} else {
tecla = 0;
}

Como diciéndole que si tienes la tecla pulsada y no la has quitado se mueva, pero no se soluciona.
 

YoshiFanGM

雲寶
Moderador
Mensajes
1.141
Reacciones
617
Puntos
816
Ubicación
Mitras
Perdona me he precipitado al contestar en realidad no se ha solucionado del todo, me pasa lo mismo que la solución que me dieron en el foro oficial, lo que pasa es que ocurre con menos frecuencia, por ejemplo pasa 3 veces de cada 50 veces que lo haces y es que si tocas el warp sin dejar pulsado el botón, el personaje se teletransporta al otro room y se mueve solo, y no se para hasta que no vuelves a pulsar la tecla. Es como si no pusiera la variable en 0.

Intenté solucionarlo yo pero sin éxito poniendo en room end:

if (keyboard_check(vk_left)) && (!keyboard_key_release(vk_left)){
tecla = vk_left;
} else if (keyboard_check(vk_right)) && (!keyboard_key_release(vk_right)) {
tecla = vk_right;
} else {
tecla = 0;
}

Como diciéndole que si tienes la tecla pulsada y no la has quitado se mueva, pero no se soluciona.
Prueba poniento este código al final del evento Room End:
Código:
io_clear();

De tal modo que se vea así:
Código:
if (keyboard_check(vk_left)) {
   tecla = vk_left;
} else if (keyboard_check(vk_right)) {
   tecla = vk_right;
} else {
   tecla = 0;
}

io_clear();
 
OP

RagBoy

Jr. Member
Mensajes
26
Reacciones
21
Puntos
72
Prueba poniento este código al final del evento Room End:
Código:
io_clear();

De tal modo que se vea así:
Código:
if (keyboard_check(vk_left)) {
   tecla = vk_left;
} else if (keyboard_check(vk_right)) {
   tecla = vk_right;
} else {
   tecla = 0;
}

io_clear();
Probado, sigue pasando lo mismo no hace nada eso.
 
Mensajes
5
Reacciones
2
Puntos
3
Entiendo el problema que estás experimentando. Parece que el desafío radica en mantener el estado del botón de izquierda o derecha al cambiar de habitación. Una posible solución sería almacenar el estado del botón en una variable global y luego restaurarlo en el nuevo cuarto. Aquí hay un enfoque alternativo que podrías probar:

En el objeto del jugador:

```gml
// Evento Step
if (keyboard_check(vk_right)) {
global.presionandoLateral = 1;
} else if (keyboard_check(vk_left)) {
global.presionandoLateral = -1;
} else {
global.presionandoLateral = 0;
}
```

En el evento de colisión con el teletransportador:

```gml
// Evento Collision with obj_warpcastillo
global.warp = 6;
global.presionandoLateralAnterior = global.presionandoLateral;
room_goto(roomCastilloCampo);
```

Y en el código del cuarto:

```gml
// Evento Creation
if (global.warp == 6) {
global.presionandoLateral = global.presionandoLateralAnterior;
if (global.presionandoLateral == 1) {
keyboard_key_press(vk_right);
} else if (global.presionandoLateral == -1) {
keyboard_key_press(vk_left);
}
}
```

Este enfoque debería restaurar el estado del botón después de cambiar de habitación, permitiendo que el personaje continúe moviéndose sin problemas. ¿Qué piensas de esta solución?
 
Arriba Pie