2012-12-12 2 views
0

Так что, в основном, я делаю свою первую игру xna, и это арканоидная игра. Мой мяч прямо сейчас - это квадрат, который вращается.столкновение с поворотным прямоугольником

К сожалению, невозможно правильно обнаружить столкновение повернутого прямоугольника в xna.

я нашел вещь о скалярах, но я только в информатике в колледже, так что я не знаю об этой большой математике ...

Может кто-нибудь направить меня в правильном направлении, чтобы обнаружить такого рода столкновение? или, по крайней мере, иметь возможность получить новый прямоугольник правильно, чтобы я мог обнаружить столкновение на этом?

EDIT Я просто подумал о том, чтобы мой вращающийся квадрат в квадрат и еще испытать при столкновении с внешним квадратом это будет жизнеспособным?

+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

Это хорошо для столкновения двух прямоугольников, но пусть скажем, что я просто хочу сохранить прямоугольник на экране ... – 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

Вы действительно хотите, чтобы ваш шар был квадратом? Или простой круг мог бы сделать?

Вместо этого вы можете использовать круг столкновений, логика столкновения намного проще, чем повернутые квадраты ... (Если вы действительно хотите, чтобы квадрат и идеальное столкновение с пикселями, не обращайте на это ответ и см. Комментарий Терренса)

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 
} 

Это на самом деле не является прямым ответом на ваш вопрос, но больше альтернативного

Edit: Этот код предполагает, что положение вашего шара относительно его центра.

Кроме того, вы, можете приблизиться к столкновению с вращающимся квадратом с кругом столкновений (или, по сути, не вращающимся квадратом). Столкновение не будет идеальным пикселем, но я думаю, что это будет едва заметно. Это также будет проще реализовать (учитывая, что это ваша первая игра).

Смежные вопросы