2012-12-12 4 views
0

기본적으로 첫 번째 xna 게임을하고 있으며 arkanoid 게임입니다. 내 공은 지금 회전하는 사각형입니다.회전 된 사각형과의 충돌

불행히도 xna에서 회전 된 사각형의 충돌을 올바르게 감지하는 것은 불가능합니다. ...

나는 스칼라에 관한 일을 발견하지만 난이 큰 수학 모르는, 그래서 내가 대학에만 컴퓨터 과학에서 오전

사람이 충돌 이런 종류의를 감지 할 수있는 올바른 방법으로 저를 직접 할 수 있나요? 또는 적어도 올바른 방법으로 새 ​​사각형을 가져 와서이 사각형의 충돌을 감지 할 수 있습니까?

편집 난 그냥 그게 가능한 것입니다 외부 사각형 스틸 광장과 테스트 충돌에 내 회전 사각형을 만드는 방법에 대한 생각?

+1

내 이전 코멘트를 개정 .... http://www.gamedev.net/page/resources/_/technical/game-programming/2d-rotated-rectangle- collision-r2604 – Terrance

+2

비슷한 질문 http://stackoverflow.com/questions/641219/how-can-i-perform-collision-detection-on-rotated-rectangles?rq=1 – Terrance

+0

이것은 2 개의 직사각형 사이의 충돌에는 좋지만 그냥 화면에 직사각형을 유지하고 싶다고 ... – AntoineLev

답변

1

외부 사각형과 정사각형 공의 충돌을 감지하려면 공의 네 모퉁이의 좌표를 알아야합니다. 그런 다음이 점들을 외부 직사각형과 간단히 비교하십시오.

s은 사각형의 변의 길이입니다. 모서리는 다음과 같이 계산 될 수있다

double h = 0.707106781 * s; // Half diagonal 
double angle = rotation_angle + 0.25 * Math.PI; // 0.25 * Math.PI = 45 degrees 
               // inclination of the diagonal. 
double x = h * Math.Cos(angle); 
double y = h * Math.Sin(angle); 

// The four points are 
p1x = +x + squareCenterX; 
p1y = +y + squareCenterY; 

p2x = -y + squareCenterX; 
p2y = +x + squareCenterY; 

p3x = -x + squareCenterX; 
p3y = -y + squareCenterY; 

p4x = +y + squareCenterX; 
p4y = -x + squareCenterY; 
0

공이 정사각형이되기를 정말로 원하십니까? 간단한 원이 가능합니까?

대신 충돌 원을 사용할 수 있습니다. 충돌 뒤의 논리는 회전 된 사각형보다 훨씬 간단합니다 ... (정사각형과 픽셀 완전 충돌을 원한다면이 대답을 무시하고 Terrance의 의견을 참조하십시오)

if(circle.Center.X - circle.Radius < ScreenBounds.XMin || 
    circle.Center.X + circle.Radius > ScreenBounds.XMax || 
    circle.Center.Y - circle.Radius < ScreenBounds.YMin || 
    circle.Center.Y + circle.Radius > ScreenBounds.YMax) 
{ 
    //Ball is partly or entirely outside of the screen 
} 

이 정말 귀하의 질문에 직접 대답은 아니지만, 대안

편집 더 :이 코드는 당신의 공의 위치가 중심을 기준으로 가정합니다.

또한 은 회전한 정사각형과 충돌 원 (또는 실제로 회전하지 않은 정사각형)과의 충돌을 대략적으로 나타냅니다. 충돌은 픽셀이 완벽하지는 않지만 거의 눈에 띄지 않을 것입니다. 또한 구현하기가 더 쉬울 것입니다 (이것이 첫 번째 게임이라고 생각하십시오).

관련 문제