Autor Tema: Escaleras en GML  (Leído 123 veces)

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

Desconectado javixblack

Escaleras en GML
« en: Septiembre 14, 2018, 04:20:54 am »
Buenas, gente. Estoy renegando con hacer escaleras.

Estuve navegando en la comunidad en busca de información, descargué unos ejemplos pero la verdad es que las anotaciones que tienen me resultan carentes de ayuda. No son detalladas para ser consideradas un ejemplo. Incluso algunos ejemplos son buenos pero no son precisamente lo que estoy buscando.

Voy a detallar completamente todo, desde el inicio hasta el final, por más sencillo que parezca, dividiendo cada situación en items, y debajo de los cuales planteo mi hipótesis para resolverlo.

1) La escalera va a comenzar desde la altura del piso, pero quiero que el jugador pueda pasarla por delante de ella cuando simplemente esté caminando por alli.

Mi posible solución: Para que el personaje pase por delante de ella, la escalera tendrá que tener mayor profundidad, o sea, la depth. Y no debe estar mercada la casilla "SOLID" por ningún motivo.

----------------------------------------------------------------------------------------------------------------------------------------------

2) Me gustaría lograr es que la condición para treparse a la misma sea que la coordenada X del jugador esté dentro de los límites de la escalera (es decir, entre la X1 (el lateral izquierdo) y X2 (el lateral derecho) de la misma) y que, además, pulse la tecla "arriba" (con pulsarla sólo un instante alcance para que quede trepado y quieto).

Mi posible solución: En el evento CREATE del jugador, creé una variable booleana establecida en false.

Código: [Seleccionar]
escalera = false

Luego, en el evento COLISIÓN CON ESCALERA del jugador, puse un bloque de código con lo siguiente:

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 ((obj_escalera.x) - 7) < x < ((obj_escalera.x) + 7) and keyboard_check(vk_up)
    {
        escalera = true
    }
           
       
           
if escalera = true
    {
        x = obj_escalera.x
        sprite_index = spr_prota_escalera     //Sprite del jugador trepado
        image_index = 0
        gravity = 0   
    }
   

if escalera = true and 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)
    }


if escalera = true and keyboard_check (vk_down)
    {
        y = y+4
        image_speed = 0.1
    }   
 

/////////También, para que el jugador se suelte de la escalera, puse:

   
if keyboard_check (vk_space)
    {
        escalera = false
    }


---------------------------------------------------------------------------------------------------------------------------------

3) Ahora lo que falta aclarar es qué sucede cuando la variable ESCALERA está en FALSE. La gravedad entrará en vigencia si el jugador no está en contacto con el piso, activando su respectivo sprite de caída y su velocidad de animación. Si está en contacto con el piso, la gravedad valdrá cero.

Código: [Seleccionar]
if escalera = false
    {
        if place_free(x,y+1)

            {
                gravity = 0.7
                sprite_index = spr_prota_cayendo
                image_speed = 0.3
            }

        else
   
            {
       
                gravity = 0
            }
    }



Pero todo este código me anda mal, cuando subo a una escalera, se teletransporta a otra (supongo que por eso de las prioridades de las instancias, de cuál ubiqué primero en la room). Y la animación de trepado no se reproduce y no sé cuántos más errores tiene.

Espero puedan ayudame. Desde ya, muchas gracias. :)
« última modificación: Septiembre 15, 2018, 03:10:48 am por javixblack »


 
No Tienes Permisos Para Dar Puntos
point 10 Puntos

Usuarios que puntuaron el tema » Clamud (10 Pts) 


Desconectado BssString

Re:Escaleras en GML
« Respuesta #1 en: Septiembre 14, 2018, 04:48:53 am »
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)
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
« última modificación: Septiembre 14, 2018, 04:55:23 am por BssString »
 
Los siguientes usuarios dieron las gracias a este tema: Yuzo, javixblack


Desconectado javixblack

Re:Escaleras en GML
« Respuesta #2 en: Septiembre 14, 2018, 05:21:22 am »

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

Funcionó de manera maravillosa. ¡Mil gracias! He notado unos pequeños detalles que sucedes desde la primera vez que intenté hacer una escalera, y es que si estoy cayendo desde un nivel superior y me trepo a mitad de la escalera, el personaje se agarra, pero la vspeed se activa y me lo hace descender, hasta que colisiona con el suelo y se hace cero, permitiéndome trepar con normalidad, por lo que debí establecer "vspeed = 0" cuando "escalera = true".
Dentro de este mismo problema, cuando estoy en caída libre atravieso la escalera (o sea, si estoy cayendo y presiono las teclas de movimiento lateral hasta toparme con la escalera), el personaje se acelera horizontalmente. He dibujado los valores de la "hspeed" en pantalla y cambia de "0" a "0.00" lo que no tiene mucho sentido a decir verdad.

Por último, tu primera sugerencia funcionó de manera exitosa. La segunda no entendí bien a qué te referiste, pues cuando llego abajo de todo, puedo colisionar con el piso y conseguir "escalera = false" para quedarme de pie.

La tercera la implementaré más adelante (quiero intentar animar al personaje al llegar al tope de la escalera, como para ponerse de pie sobre ella).

Ah, me olvidaba. La animación de trepar no se muestra correctamente, ésta consta de 4 subimágenes, pero sólo muestra las dos primeras (es decir, la 0 y la 1). ¿Se debe a que mi sprite de escalera, por ser pequeño y obligarme a juntar uno sobre otro para armar una escalera más larga, la animación se reinicie tras el contacto con cada instancia? ¿Me recomendás hacer una única escalera más larga y ya? Porque no todas las escaleras del juego serán del mismo tamaño :/

Muchas gracias nuevamente
Saludos!
« última modificación: Septiembre 14, 2018, 05:25:14 am por javixblack »
 

Conectado 3dgeminis

Re:Escaleras en GML
« Respuesta #3 en: Septiembre 14, 2018, 08:08:06 pm »
En juegos como Castlevania el personaje esta ajustado a una cuadrilla cuando esta en una escalera y cuando se presiona hacia adelante automaticamente se mueve cierta cantidad de pixels y se reproduce la animacion.
Tambien podrias hacer que la velocidad de imagen sea 0 (image_speed=0) y cuando presiona la tecla para avanzar aumentas el valor de la imagen image_index+=0.2
 
Los siguientes usuarios dieron las gracias a este tema: Yuzo, javixblack