2013-01-14 4 views
0

나는 AABB 충돌에 대해 읽었습니다. 나는 그 순간을 아주 거칠게 구현했다. 이제 두 개의 직사각형이 X 축과 Y 축에서 교차 할 때를 감지 할 수 있습니다.AABB 충돌 해결

overlapX = (Game1.p[0].boundingBox.halfWidth + Game1.p[1].boundingBox.halfWidth) 
- (Math.Abs(Game1.p[0].boundingBox.center.X - Game1.p[1].boundingBox.center.X)); 

를 내가 어디에 문제가보고 싶은대로 지금 난 그냥 X에 깊이를 테스트입니다 :

나는 기본적으로 수행 X에 교차로의 깊이를 계산합니다. 나는 좌우 방향을 고려하지 않고있다. 나는 p [0] 객체가 p [1]의 왼쪽에 충돌하고 있다고 가정하고 있습니다.

그런 다음 실제 움직임과 충돌 탐지를 위해 : 나는 p[1]와 충돌 할 때

public void Move(float x, float y) 
{ 
    Position.X += x; 
    Position.Y += y; 

    overlapX = (Game1.p[0].boundingBox.halfWidth 
       + Game1.p[1].boundingBox.halfWidth) 
       - (Math.Abs(Game1.p[0].boundingBox.center.X 
       - Game1.p[1].boundingBox.center.X)); 

    overlapY = (Game1.p[0].boundingBox.halfHeight 
       + Game1.p[1].boundingBox.halfHeight) 
       - (Game1.p[1].boundingBox.center.Y 
       - Game1.p[0].boundingBox.center.Y); 

    if (Collision.testAABBAABBX(
      Game1.p[0].boundingBox, Game1.p[1].boundingBox) && 
     Collision.testAABBAABBY(
      Game1.p[0].boundingBox, Game1.p[1].boundingBox)) 
    { 
     if (overlapX < overlapY) Position.X -= overlapX; 
    } 
} 

지금, overlapX 1. 그래서 position.X해야 -= 1을 읽습니다. 그러나 여기에서 문제가 시작됩니다. 겹치는 동안 이미지가 있습니다. 당신은 참으로 수직 노란색 선으로 표시 중복이 있음을 볼 수 있습니다

그래서 Overlap http://s9.postimage.org/495f1fmv3/overlap.png

내 문제는 내가 중복 값으로 다시 이동합니다 position.X을 지시 할 때, 그렇지, 적어도 않는 것을 직사각형을 위 또는 아래로 움직일 때까지. 무슨 일이 일어나고 있는지에

No overlap http://s7.postimage.org/wzg3sixaz/no_overlap.png

모든 단서 : 나는 그렇게 할 경우, 마술 저절로 해결? 어쩌면 그것은 내 앞에 있으며 나는 그것을 보지 않을 것이지만, 그 반응은 다음 운동 후에 만 ​​나타난다.

자세한 정보가 필요한 경우 알려주십시오.

+0

죄송 합니다만 AABB 충돌 감지는 'Rectangle.Intersects()'와 동일합니까? – user1306322

답변

0

충돌 코드가 동작 코드 내에 배치되었으므로 이동하지 않는 한 실행되지 않습니다.

해결 방법은 Move 메서드 외부의 충돌 해결 코드를 모든 프레임에 Update이라는 별도 메서드로 옮기는 것입니다.