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.
Ahora si.

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.
Ahora si.

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/bugs-comunes-en-mis-juegos-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.
Ahora si.

No da resultado. Y he intentado sustituir move_contact_solid pero nada. ¿Alguna idea?
Ahora si.

#6 Mayo 14, 2016, 04:06:04 AM Ultima modificación: Mayo 14, 2016, 04:08:53 AM por Clamud
Mira el ejemplo adjunto.