Buenas aqui está mi sistema de colisiones

var spd = 5;

if keyboard_check(vk_up){
   
    ya = -spd

} else if keyboard_check(vk_down){

    ya = spd

} else ya = 0

if keyboard_check(vk_right){

    xa = spd

} else if keyboard_check(vk_left){

    xa = -spd

} else xa = 0

if place_meeting(x+xa,y,oWall){
    while !place_meeting(x+sign(xa),y,oWall){
        x += sign(xa)
    }
    xa = 0
}

if place_meeting(x,y+ya,oWall){
    while !place_meeting(x,y+sign(ya),oWall){
        y += sign(ya)
    }
    ya = 0
}

x += xa
y += ya


xa y ya es como un hspeed y vspeed simplemente, quiero saber pq cuando yo muevo mi rectangulo a otro rectangulo hacia la esquina, lo traspasa, si me podrian ayudar se los agradeceria, y por favor si cambian algo expliquenme sobre eso que cambiaron y por que.

Cita de: vitail en Octubre 14, 2015, 01:27:01 AM
quiero saber pq cuando yo muevo mi rectangulo a otro rectangulo hacia la esquina, lo traspasa
¿Un rectángulo a otro rectángulo?  ???

Probé el código, traté de colisionar contra objetos pared en todas las direcciones y el jugador nunca traspasó ningún objeto pared. No sé exactamente qué error te suceda, ya que la descripción no es muy clara.

Cita de: penumbra en Octubre 14, 2015, 02:10:46 AM
Cita de: vitail en Octubre 14, 2015, 01:27:01 AM
quiero saber pq cuando yo muevo mi rectangulo a otro rectangulo hacia la esquina, lo traspasa
¿Un rectángulo a otro rectángulo?  ???

Probé el código, traté de colisionar contra objetos pared en todas las direcciones y el jugador nunca traspasó ningún objeto pared. No sé exactamente qué error te suceda, ya que la descripción no es muy clara.

hay 2 objetos, un jugador y una pared, los dos son rectangulos y cuando colisiono a veces por las esquinas de la pared se ve que lo traspasa.

http://prntscr.com/8r1rc7

Cita de: penumbra en Octubre 14, 2015, 02:10:46 AM
Cita de: vitail en Octubre 14, 2015, 01:27:01 AM
quiero saber pq cuando yo muevo mi rectangulo a otro rectangulo hacia la esquina, lo traspasa
¿Un rectángulo a otro rectángulo?  ???

Probé el código, traté de colisionar contra objetos pared en todas las direcciones y el jugador nunca traspasó ningún objeto pared. No sé exactamente qué error te suceda, ya que la descripción no es muy clara.

vi que con este orden funcionan viendo otro código pero por qué?

var spd = 5;

if keyboard_check(vk_up){
   
    ya = -spd

} else if keyboard_check(vk_down){

    ya = spd

} else ya = 0

if keyboard_check(vk_right){

    xa = spd

} else if keyboard_check(vk_left){

    xa = -spd

} else xa = 0

if place_meeting(x+xa,y,oWall){
    while !place_meeting(x+sign(xa),y,oWall){
        x += sign(xa)
    }
    xa = 0
}
x += xa

if place_meeting(x,y+ya,oWall){
    while !place_meeting(x,y+sign(ya),oWall){
        y += sign(ya)
    }
    ya = 0
}
y += ya


#4 Octubre 14, 2015, 02:59:08 AM Ultima modificación: Octubre 14, 2015, 03:01:52 AM por penumbra
Ya vi a lo que te refieres. Lo que pasa es que tal como está el código, la detección y resolución de colisiones lo hace por partes, primero en una dirección, (x) y luego en la otra(y). Este lógica funciona cuando el jugador se mueve en ángulos múltiplos de 90° (arriba, abajo, izquierda, derecha), pero no funciona (bien) cuando el jugador se mueve en ángulos múltiplo de 45° (diagonales). En este último caso, la detección se debería hacer al mismo tiempo para las dos direcciones.

Para poder detectar una colisión correctamente cuando hay movimiento diagonal, entonces la función place_meeting debe incluír tanto el incremento xa como el incremento ya (en el código original sólo se incluye uno de los dos y por eso falla).

Aquí me estoy moviendo en diagonal, y ahora ya no se empalman los objetos:


El código modificado es este:
http://pastebin.com/1LQGcTHw

NOTA: Yo modificqué el nombre del objeto pared, así que tienes que cambiarlo al nombre de tu objeto o habrá un error.