Hola, no entiendo por que me da un error de que siempre cuando hago un top down shooter o lo que sea siendo top down, tenga un error donde un objeto no colisione bien con el otro objeto.

if(keyboard_check(ord("A")))
{
    x -= 3;
}
if(keyboard_check(ord("D")))
{
    x += 3;
}
if(keyboard_check(ord("W")))
{
    y -= 3;
}
if(keyboard_check(ord("S")))
{
    y += 3;
}


mi juego sera un juego parecido a the binding of isaac, osea que tendre que subir la velocidad y todo eso entonces no necesito problemas cuando suba la velocidad con una futura variable

Ya he probado con place_free(place_empty) move_contact_solid y no funciona, colisiona y se queda pegado y despues de que no colisiona bien queda como medio adentro de el solido y no colisiona bien nunca, si le quito la opcion de solido a el objeto wall no colisiona tampoco.

Buenos días desde Madrid. Creo que el problema es que coincide la posición de movmimiento con el bloque, con la posición de movimiento de tu personaje. Es decir, para asegurarte de que no es por eso, intenta poner un numero más bajo en la colisión, y si queda con un espacio entre tu personaje y el bloque, lo podrás mover aunque no golpee del todo, y sabrás que es por eso. Hay que ir descartando de lo más sencillo, a lo más complejo.
Ya nos comentarás como salió el experimento.  :D

Cita de: n0k en Febrero 27, 2015, 12:47:46 PM
Buenos días desde Madrid. Creo que el problema es que coincide la posición de movmimiento con el bloque, con la posición de movimiento de tu personaje. Es decir, para asegurarte de que no es por eso, intenta poner un numero más bajo en la colisión, y si queda con un espacio entre tu personaje y el bloque, lo podrás mover aunque no golpee del todo, y sabrás que es por eso. Hay que ir descartando de lo más sencillo, a lo más complejo.
Ya nos comentarás como salió el experimento.  :D

Ya he probado eso pero la idea que es que no quiero de que pase eso ya que queda muy feo quiero de que pegue y te puedas mover pegado a la pared y todo eso, una colision buena pues.

Una buena forma para obtener una colision "limpia", es decir, que no quede un espacio en blanco entre la pared y el personaje, se puede hacer con un ciclo:

[GML]

if (keyboard_check(vk_right))
   repeat(3) // velocidad de movimiento
   {
      if (place_free(x+1,y))
         x++;
   }

[/GML]

Eso hace que el ciclo se repita 3 veces, moviendo al personaje instantaneamente 3 pixeles por step, verificando si en cada uno de ellos hubo o no colision, y mover en el caso de que exista espacio libre.