В первую очередь, мой вопрос не действительно характерен для C# или XNA, но мои примеры кода будут использовать их.
Я в настоящее время пытаюсь заставить Вонь клонироваться, и я столкнулся с проблемой с обнаружением коллизий.
Каждый объект basicly имеет определенную Скорость (который является Vector2), Положение (Vector2, также) и Скорость (просто плавание). На каждом Обновлении () вызов объекта, положение сменилось этот путь:
Velocity.Normalize();
Position += Velocity * Speed;
Сначала, я только проверил, была ли в настоящее время коллизия между двумя объектами с простым, Пересекает () вызов от прямоугольников объектов. Я быстро понял, что мог не только проверить, сталкивался ли объект в настоящее время с другим, а скорее если объект столкнулся с продвигающимся объектом. Только проверка, если два объекта в настоящее время сталкивались, заставила шар пройти весло, когда скорость была слишком высока.
Я попробовал разные вещи для решения проблемы, но ни один из них, казалось, не работал. Мне только нужен способ проверить, столкнулись ли два объекта на своем пути, и если они сделали, если это было от горизонтали, вертикальной или оба (для изменения скорости шара соответственно).
Я не обязательно хочу решение сразу же, возможно, просто основная идея о том, как реализовать это, и я кодирую его сам.
Спасибо за внимание.
Теорема о разделяющей оси - ваш друг :)
http://www.codeproject.com/KB/GDI-plus/PolygonCollision.aspx
Думаю, эта ссылка: http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php может быть тем, что вы ищете. Он описывает тест развертки сфера-плоскость, полезный, когда у вас есть быстро движущиеся объекты, которые могут проходить через плоскость с интервалом в один кадр.
Это также дает вам точку пересечения, которую вы можете использовать, чтобы отразить вашу траекторию относительно нормали к плоскости и продолжить путь объекта.
В качестве отправной точки посмотрите здесь.
http://www.flipcode.com/archives/Theory_Practice-Issue_01_Collision_Detection.shtml
Это очень хорошее введение о всех различных способах столкновения. Возможно, ваш случай объясняется здесь.
У вас проблема с тем, что если один объект слишком быстр, он может пройти мимо неподвижного объекта до вызова Update()
с обнаружением (как будто он проходит сквозь неподвижный объект).
Расширьте форму объекта вдоль вектора перемещения с размером скорости:
Квадрат [0,0][2,2]
со скоростью [1,0]
и скоростью 10
создаст форму Прямоугольника [0,0][12,2]
=> теперь он позиционируется по коорд [0,0]
с размером [12,2]
.
Теперь пересекаем прямоугольник с неподвижным объектом. Теперь вы знаете, столкнулись ли они.
Если два точечных объекта имеют одинаковое положение, то они столкнулись.