Я занимаюсь разработкой небольшого 2D игрового движка. У персонажей есть метод рисования, который в настоящее время делает следующее:
- Рассчитать новую позицию персонажа по скорости и т. Д.
- Обновить ячейку сетки столкновений **
- Нарисуйте персонажа на новой позиции
** Я создал сетку столкновений, чтобы уменьшить количество проверок пересечения
Теперь основной алгоритм, который я подумал для обнаружения столкновения:
For Each Character
Check intersection with characters in surrounding 8 cells
Я могу просто поместить этот код в метод рисования. Но вот проблема, которую я ожидаю.
Предположим, что два символа A и B лежат в соседних ячейках сетки столкновений. Теперь согласно вышеупомянутому алгоритму в итерации символа A он обнаружит, что он столкнулся с B. В итерации для символа B он обнаружит, что он столкнулся с A.
Но у меня есть идея, что, когда A обнаруживает, что он столкнулся с B, он должен сообщить B, что он столкнулся с A. Это спасло бы много сравнений, когда сталкиваются более двух действующих лиц. Но я не уверен, как справиться с этим. Я думаю, что вместо каждого персонажа, проверяющего его столкновение, я должен проверять наличие столкновения внутри игрового цикла.
Будет ли этот подход правильным? Как вы справились с такой проблемой? Я сам думал о решетке столкновений. Есть ли альтернативы логике коллизионной сетки?
Ответы:
Обычный подход для обнаружения столкновений состоит в том, чтобы не иметь ни A, ни B самостоятельно обнаруживать столкновения.
Вместо этого вы сначала перемещаете все объекты, затем имеете отдельную систему столкновений, которая ищет столкновения между всеми парами объектов, сообщает каждому объекту о вещах, с которыми он столкнулся, а затем, наконец, отображает все объекты.
Таким образом, по сути, вместо того, чтобы выполнять «перемещение, проверку на столкновение, рисование» внутри функции Paint (), вы разделяете «перемещение» и «рисование» на отдельные функции, которые вы вызываете отдельно (сначала «перемещение» для каждого объекта, затем «рисовать» для каждого объекта). И между этими, проверьте на столкновения.
Расширенное примечание: если какой-либо из ваших объектов перемещается в ответ на обнаруженные столкновения, вам может потребоваться повторить шаг «поиск столкновений между всеми парами объектов», если ответ объекта на столкновение вызывает другое столкновение.
источник
Я запускаю цикл для всех моих персонажей в игровом цикле, как вы говорите.
Я делаю это с состоянием каждого из моих персонажей, поэтому, если A и B сталкиваются, когда A проверяет столкновение, A и B устанавливаются на попадание. в начале цикла B он проверяет, ударил ли он, если так, то id не запускает цикл.
Я поместил код аффекта в цикл, чтобы любое действие, которое должно быть выполнено с B, происходило в цикле A, поэтому у B не должно быть оснований для проверки, так как это может испортить исход столкновения, хотя для вас это может отличаться ,
источник