2013-02-25 2 views
0

Java에서 상당히 간단한 2D 충돌 감지를 구현하고 있는데, 표면 (또는 히트 상자의 측면)에서 충돌이 발생했는지 파악하는 방법에 약간의 걸림돌이 있습니다.충돌이 발생한 쪽을 어떻게 확인할 수 있습니까?

이 사이트에있는 질문을 통해보고 다른 곳에서 광범위한 구글-FU를 시도하고 가장 가까운 나를 이런 식으로 뭔가이었다이라도했습니다

public Side getCollisionSide(Rectangle main, Rectangle incoming) { 
    boolean toTheLeft = main.getX() - incoming.getX() < 0; 
    boolean toTheTop = main.getY() - incoming.getY() < 0; 
    // ...but what can I do from here? 
} 

문제는이 실제로 제공하지 않는다는 것입니다 어느 쪽이 충돌했는지. 어떤 쿼드 충돌이 발생했는지, 원점이 main의 좌표로 설정된 그리드에서 알 수 있습니다. 그러나 객체가 왼쪽에서 main에 도달하면 (그리고 Y 축의 필드에서 더 낮아짐) 충돌이 왼쪽에서 발생했는지 아니면 아래에서 발생했는지를 알 수 없습니다.

누구나 해결책을 알고 있습니까?

나는 속도와 방향 정보를 갖는 것이 어떻게 유익 할 수 있는지를 본다 (또는 객체가 한 번에 한 차원 만 움직일 수있는 경우에도 해결책이 될 수있다). 그러나 사물이 대각선으로 움직일 수 있다면 같은 문제를 피할 수있는 방법은 없습니다.

답변

1

직사각형에는 위치 및 크기 정보 만 있기 때문에 더 많은 인수가 필요합니다. 직사각형이 충돌하면 적어도 하나는 움직여야하지만 속도 데이터는 전달하지 않습니다. 어쩌면 Rectange를 서브 클래스 시도 :

public class MovingRectange extends Rectangle { 

    int xVelocity; 
    int yVelocity; 

    //etc 
} 

그런 다음 다른 대답이 지적 하듯이 ... getCollisionSide에

+0

1에서 충돌하는 사각형을 쉽게 알 수 있습니다. 한 방향으로 하나의 픽셀 만 움직이는 것이 아니라면, 어떻게 든 속도를 가져와야합니다. 그렇지 않으면 방금 두 개의 사각형의 단일 인스턴스 스냅 샷을 처리하는 것입니다. –

+0

답변 해 주셔서 감사합니다. 나는 속도/방향 정보가 확실히 도움이되는 방법을 보았습니다, 그러나 이것은 객체가 한 번에 하나의 차원을 가로 질러 움직일 수있는 해결책 인 것 같습니다. 대각선 방향으로 움직이는 물체 (또는 한 번에 두 방향으로 움직이는 물체)의 경우 같은 문제가 계속 발생합니다. – asteri

+0

그래서 xVelocity와 yVelocity를 넣어 두었습니다. 이것은 2D 충돌을위한 것이라고 말했으므로 속도에 2 가지 구성 요소가 필요합니다. 2D에서의 속도는 2 개의 숫자로 표현 될 수 있습니다. – NickJ

0

을 MovingRectange 인스턴스를 통과, 당신은 정보의 조각을 얻기 위해 더 많은 매개 변수가 필요합니다.

여러 가지 방법으로이 문제를 해결할 수 있습니다.이 두 삼각형은 움직일 수 있으며 적어도 하나는 움직일 수 있으며 크기는 일정하다고 가정합니다. 이 경우 삼각형의 마지막 5-10 위치를 큐에 저장하고 이동을 추적 할 수 있습니다. 단순성과 추상화를 위해 대기열을 사각형 클래스에 저장할 수도 있습니다.

이전 위치를 저장하지 않아도되는 또 다른 솔루션은 더 자주 위치를 확인하거나 위치 변경이 발생할 때 알려주는 트리거를 설정하고 직사각형을 작은 단계로만 이동하도록 제한하는 것입니다. 트리거가 같은 트리거가 포함되어있는 경우 : rectMoved (rectangleId, newPosition는) 당신은 다른 어느 쪽

건배

관련 문제