Detecta como plataforma los objetos sólidos.
CREATE:
//Variables
max_gravedad = 12
h_aceleracion = 2
h_velocidad = 8
var_salto = 5
STEP:
//Aplicando gravedad
gravity = 1.5
if (!place_free(x, y+vspeed+2) && vspeed>=0) {
gravity = 0;
move_contact_solid (90, max_gravedad);
vspeed = 0;
}
//Límites de velocidad
if (vspeed>max_gravedad) {
vspeed = max_gravedad;
}
//Ningún movimiento
if (keyboard_check(vk_nokey) || keyboard_check(vk_left) && keyboard_check(vk_right)) {
hspeed=0;
}
//Ir a la derecha
if (keyboard_check(vk_right)) {
if (place_free(x+hspeed+h_aceleracion,y)) {
hspeed+=h_aceleracion
if (hspeed > h_velocidad) {hspeed=h_velocidad}
} else {
hspeed=0;
move_contact_solid ( 0 ,h_velocidad );
}
}
//Ir a la izquierda
if (keyboard_check(vk_left)) {
if (place_free(x+hspeed-h_aceleracion,y)) {
hspeed-=h_aceleracion
if (hspeed < -h_velocidad) {hspeed=-h_velocidad}
} else {
hspeed=0;
move_contact_solid ( 180 ,h_velocidad );
}
}
//Saltar
if (keyboard_check_pressed(vk_up) && place_free(x,y-var_salto) && !place_free(x,y+vspeed+1)) {
vspeed=-var_salto;
}
No va del todo mal, solo que a veces se atasca en alguna plataforma y se queda enganchado. Y no se muy bien por qué.
Necesito arreglar este código como sea o bien encontrar otro que vaya bien.
Comprueba mascara de collision ponla en redonda y vuelve a probar.
No, pasa lo mismo.
Concretamente los problemas son dos:
1. Se queda parado en las esquinas sobresalientes sin poder avanzar o ir abajo.
2. Cuando se topa con una plataforma mirando hacia el lado contrario (por la aceleración) atraviesa la plataforma.
El error es éste
[gml]
move_contact_solid (90, max_gravedad);
[/gml]
quieres hacer contacto con el sólido hacia abajo, ¿o no?, y la dirección 90 es hacia arriba, deberías poner 270.
Lo mejor es no usar move_contact_solid, esa función siempre causa atascamiento.
En estos temas aparecen soluciones similares:
http://www.comunidadgm.org/preguntas-y-respuestas/colision-en-juego-de-plataformas/ (http://www.comunidadgm.org/preguntas-y-respuestas/colision-en-juego-de-plataformas/)
http://www.comunidadgm.org/preguntas-y-respuestas/bugs-comunes-en-mis-juegos-de-plataformas/ (http://www.comunidadgm.org/preguntas-y-respuestas/bugs-comunes-en-mis-juegos-de-plataformas/)
http://www.comunidadgm.org/preguntas-y-respuestas/problemas-con-colisiones-en-juego-de-plataformas/ (http://www.comunidadgm.org/preguntas-y-respuestas/problemas-con-colisiones-en-juego-de-plataformas/)
Eso estaba bien, pero me he equivocado al sustituir la variable. Para que se entendiera.
He cambiado algunas cosas y ahora tan solo queda el primer problema. Que es que en los bordes se queda parado. Pero solo si vas hacia abajo. Voy a probar a juntar el código de la gravedad con el otro.
Gracias por las referencias.
No da resultado. Y he intentado sustituir move_contact_solid pero nada. ¿Alguna idea?
Mira el ejemplo adjunto.