Hola javixblack
Está bien pensada tu lógica pero estás cometiendo unos errores con la forma en que Game Maker gestiona los objetos.
Primero, cuando trepas la escalera estás haciendo que el player se ajuste a la "x" de la escalera: obj_escalera.x
Pero Game Maker no sabe a cual "objeto escalera" te refieres porque todos se llaman igual, así que elige la primera escalera que has creado en la room y por eso te teletransporta a esa escalera.
Game Maker tiene la particularidad que cuando ocurre un evento de colisión, "id" es el objeto que está revisando la colisión y "other" es el objeto con el que estás colisionando, así que puedes tomar fácilmente la posición de la escalera usando "other.x".
Lo que no me gustó del código, es que repetiste mucho el "if escalera = true", mejor dejar todo dentro de la misma condición.
Lo último, cuando al principio revisas "if escalera = true" haces que la image_index sea cero para que se vea el personaje quieto cuando no estás subiendo, el problema es que no tienes forma de animar el sprite (ni siquiera ajustando la velocidad de la animación), porque independientemente de si estás apretando arriba o abajo en la escalera, la condición "escalera = true" siempre se cumple y tu sprite se verá siempre en el primer frame. Te eliminé esa línea y la cree en una condición más abajo que te regresa al frame 0 de la animación sólo si no pulsas ni arriba ni abajo.
Intenta con este código en el evento de colisión, es el mismo tuyo, solo cambie lo que mencioné arriba
(y cambié un poco el orden, perdón, ahí ya lo ordenas con los espacios y saltos de línea que tu gustes)
Sugerencia: Si pulsas la tecla abajo hasta que tocas el suelo, deberías hacer escalera = false, para que el personaje se baje de la escalera y que no sea sólo con espacio... así es más fácil de controlar para la persona que esté jugando.
Sugerencia2: Noté que tu código no detecta colisiones (no sé si tienes colisión en otro lado), así que lo que puedo ver aquí es que puedes atravezar terreno mientras estás trepando o bajando la escalera, incluso atravezar el suelo.
Sugerencia3: Si bajas o subes de la escalera hasta que dejas de colisionar con ella, no tendrás forma de detectar que ya no estás colisionando y tu variable escalera seguirá siendo "true", creará una inconsistencia. Deberías usar un "place_meeting(x,y,other)" justo después de ajustar el "y" para ver si después de moverte, aún estás tocando la escalera, si ya no, deberías hacer "escalera = false".
Saludos
Está bien pensada tu lógica pero estás cometiendo unos errores con la forma en que Game Maker gestiona los objetos.
Primero, cuando trepas la escalera estás haciendo que el player se ajuste a la "x" de la escalera: obj_escalera.x
Pero Game Maker no sabe a cual "objeto escalera" te refieres porque todos se llaman igual, así que elige la primera escalera que has creado en la room y por eso te teletransporta a esa escalera.
Game Maker tiene la particularidad que cuando ocurre un evento de colisión, "id" es el objeto que está revisando la colisión y "other" es el objeto con el que estás colisionando, así que puedes tomar fácilmente la posición de la escalera usando "other.x".
Lo que no me gustó del código, es que repetiste mucho el "if escalera = true", mejor dejar todo dentro de la misma condición.
Lo último, cuando al principio revisas "if escalera = true" haces que la image_index sea cero para que se vea el personaje quieto cuando no estás subiendo, el problema es que no tienes forma de animar el sprite (ni siquiera ajustando la velocidad de la animación), porque independientemente de si estás apretando arriba o abajo en la escalera, la condición "escalera = true" siempre se cumple y tu sprite se verá siempre en el primer frame. Te eliminé esa línea y la cree en una condición más abajo que te regresa al frame 0 de la animación sólo si no pulsas ni arriba ni abajo.
Intenta con este código en el evento de colisión, es el mismo tuyo, solo cambie lo que mencioné arriba
(y cambié un poco el orden, perdón, ahí ya lo ordenas con los espacios y saltos de línea que tu gustes)
Código [Seleccionar]
///////Hay que aclarar que el sprite de la escalera tiene 15 pixeles de ancho, siendo el nº 8 el centro, por eso lo de sumar y restar 7 a X,
para determinar los laterales izquierdo y derecho de la misma.
if ((other.x) - 7) < x < ((other.x) + 7) and keyboard_check(vk_up) {
escalera = true
}
if escalera = true {
x = other.x
sprite_index = spr_prota_escalera //Sprite del jugador trepado
gravity = 0
if keyboard_check(vk_up) {
y = y-4
image_speed = 0.1 //Para que comience la animación de trepar (debería detenerse al dejar de pulsar la tecla)
}
else if keyboard_check(vk_down) {
y = y+4
image_speed = 0.1
}
else if !keyboard_check(vk_up) && !keyboard_check(vk_down) {
image_index = 0
}
/////////También, para que el jugador se suelte de la escalera, puse:
if keyboard_check(vk_space) {
escalera = false
}
}
Sugerencia: Si pulsas la tecla abajo hasta que tocas el suelo, deberías hacer escalera = false, para que el personaje se baje de la escalera y que no sea sólo con espacio... así es más fácil de controlar para la persona que esté jugando.
Sugerencia2: Noté que tu código no detecta colisiones (no sé si tienes colisión en otro lado), así que lo que puedo ver aquí es que puedes atravezar terreno mientras estás trepando o bajando la escalera, incluso atravezar el suelo.
Sugerencia3: Si bajas o subes de la escalera hasta que dejas de colisionar con ella, no tendrás forma de detectar que ya no estás colisionando y tu variable escalera seguirá siendo "true", creará una inconsistencia. Deberías usar un "place_meeting(x,y,other)" justo después de ajustar el "y" para ver si después de moverte, aún estás tocando la escalera, si ya no, deberías hacer "escalera = false".
Saludos