Есть ли хорошо известный способ (или, возможно, многократно используемый фрагмент кода) для идеального пиксельного обнаружения столкновений в XNA?
Я предполагаю, что это также использовало бы полигоны (прямоугольники / треугольники / круги) для первого прохода, быстрого теста на столкновения, и если этот тест показал столкновение, то тогда он будет искать столкновение на пиксель.
Это может быть сложно, потому что мы должны учитывать масштаб, вращение и прозрачность.
ВНИМАНИЕ: Если вы используете пример кода по ссылке из ответа ниже, помните, что масштабирование матрицы закомментировано по уважительной причине. Вам не нужно раскомментировать его, чтобы масштабирование работало.
xna
2d
collision-detection
ashes999
источник
источник
Ответы:
Я вижу, что вы пометили вопрос как 2d, поэтому я продолжу и дам свой код:
Редактировать : Хотя этот код почти не требует пояснений, я чувствовал себя плохо из-за отсутствия комментариев, поэтому я добавил некоторые;) Я также избавился от побитовых операций, поскольку он делал в основном то, что свойство Color.A делает более сложным способом. ;)
источник
Bounds
?CollidesWith(Sprite other, bool calcPerPixel = true);
:)В App Hub есть очень старый пример, который проведет вас через 2D обнаружение столкновений от простых ограничительных рамок до проверенных пикселей на повернутых и масштабированных спрайтах. Он был полностью обновлен до 4.0. Целую серию стоит прочитать, если вы новичок в теме.
http://xbox.create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel_transformed
Я также нашел подход Riemer Grootjans интересным в его игре 2D-шутеры. http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php
(Ему требуется некоторое время, чтобы добраться до него ... http://www.riemers.net/rus/Tutorials/XNA/Csharp/Series2D/Coll_Detection_Overview.php ... но вы можете проследить, чтобы увидеть проблему он решает)
Но я предупреждаю вас, что образец Riemers не является XNA 4.0, и вам, возможно, придется немного поработать, чтобы запустить его. Однако это не сложная или таинственная работа.
источник
Я рекомендую создать черно-белую карту столкновений. Запрограммируйте так, чтобы черные пиксели были точками столкновения. Дайте персонажу карту столкновений; При обработке карт используйте алгоритм, который превратит большие квадраты черных пикселей в прямоугольники столкновений. Сохраните эти данные прямоугольника в массиве. Вы можете использовать функцию Rectangle intersects для поиска столкновений. Вы также можете преобразовать карту столкновений с помощью текстуры.
Это очень похоже на использование матрицы столкновений, но более продвинутый, и вы можете преобразовать его! подумайте о создании инструмента генератора карт столкновений, если он вам нужен. Если вы сделаете это, пожалуйста, поделитесь кодом с другими!
источник