2010-07-07 2 views
6

Прежде всего, мой вопрос не имеет особого отношения к C# или XNA, но мои примеры кода будут использовать их.Обнаружение столкновения движущегося объекта с неподвижным

В настоящее время я пытаюсь создать клон-понг, и у меня возникла проблема с обнаружением столкновения.

Каждый объект имеет определенную скорость (которая является Vector2), Position (Vector2, также) и Speed ​​(просто поплавок). На каждом Update() вызова объекта, положение изменяется таким образом:

Velocity.Normalize(); 
Position += Velocity * Speed; 

На первом, я только проверил, если в настоящее время произошло столкновение между двумя объектами с простым пересекающими() вызов из прямоугольников объекты. Я быстро понял, что могу не только проверить, был ли объект в настоящее время, столкнувшись с другим, а скорее, если объект столкнулся с с объектом на своем пути. Только проверка того, что два объекта в настоящее время сталкиваются, заставил мяч пройти через весло, когда скорость была слишком высокой.

Я пробовал разные вещи, чтобы исправить проблему, но никто из них, похоже, не работал. Мне нужен только способ проверить, столкнулись ли два объекта на своем пути, и если они это сделают, если это было из горизонтального, вертикального или обоих (чтобы соответственно изменить скорость мяча).

Мне не обязательно нужно решение сразу, может быть, просто основная идея о том, как реализовать это, и я сам его закодирую.

Спасибо за ваше время.

ответ

0

Если две точечные объекты имеют ту же позицию, то они столкнулись.

+0

Я не думаю, что это так просто. Очень немного графики - это всего лишь одно очко. – Adkins

+0

Если два объекта окружности находятся в пределах суммы их радиусов, то они столкнулись. – mcandre

+0

Я действительно ищу решение, если в ходе вызова Update() столкнулись два объекта с определенной шириной и высотой. –

2

Я думаю, что эта ссылка: http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php может быть то, что вы ищете. Он описывает тест развертки с плоскостью плоскости, полезный, когда у вас есть быстро движущиеся объекты, которые могут проходить через плоскость в пределах интервала в один кадр.

Он также дает вам точку пересечения, которую вы можете использовать, чтобы отразить траекторию полета относительно плоскости и продолжить путь к объекту.

+0

Спасибо за ссылку. –

1

У вас возникла проблема с тем, что если один объект слишком быстр, он может передать неподвижный объект до того, как будет вызван Update() с обнаружением (например, он проходит через неподвижный объект).

удлиняет форму объекта вдоль вектора перемещения с размером скорости: площадью [0,0][2,2] со скоростью [1,0] и скоростью 10 создаст форму прямоугольника [0,0][12,2] => он теперь находятся в [0,0] с координатами размером [12,2].

Теперь пересек прямоугольник с неподвижным объектом. Теперь вы знаете, столкнулись ли они.