#events #game-physics #box2d
Вопрос:
Часто мне нужно обнаруживать произвольные «события» в Box2D.
Я пытаюсь выяснить, каков рекомендуемый способ выполнения обнаружения. Два основных способа, которые я могу придумать, — это либо опрос после каждого шага, либо использование взаимодействия с дополнительными физическими элементами.
Пример
Мне нужно создать несколько объектов с кнопками и определить, когда один из них нажат достаточно, чтобы вызвать его.
Я подумал о том, чтобы постоянно нажимать каждую кнопку наружу с усилием пружины (например, призматический шарнир со слабым двигателем) и обнаруживать, когда она вдавливается достаточно сильно.
Я могу придумать два способа определить, достаточно ли нажата кнопка:
- После каждого шага проверяйте, не выходит ли положение корпуса кнопки за определенную точку.
- Поместите дополнительное тело (датчик) где-нибудь за кнопкой, затем дождитесь столкновения между кнопкой и датчиком.
Каков рекомендуемый подход? Есть ли другие способы?
- Первый метод кажется более простым, но он требует повторения каждой кнопки после каждого шага, что кажется расточительным: большинство кнопок будут спать на большинстве кадров.
- Второй способ кажется более оптимальным: никаких ненужных вычислений, если только что-то не происходит с кнопкой. Однако это предполагает добавление дополнительных тел в мир и увеличит нагрузку на двигатель.
Дальнейший вопрос, связанный с первым подходом
Является ли хорошей практикой повторять каждое тело после каждого шага? Делает ли Box2D это внутренне? Я предполагаю, что это не так.
Я всегда старался избегать этого, потому что это звучит как плохая идея-перебирать тонны тел 60 раз в секунду, большинство из которых будут инертными или спящими. Даже если я составлю список «интересных тел» и буду перебирать только их, их все равно будет много, и большинство из них большую часть времени будут спать. Из-за этого мне кажется, что это плохая практика.
Моя симуляция насчитывает десятки тысяч тел: большинство из них пассивны (например, стены), и только несколько тысяч «интересны». Большинство интересных из них большую часть времени спят и просыпаются только тогда, когда пользователь взаимодействует с ними. Несколько сотен могут все время бодрствовать, поскольку они активируются по своей собственной логике; Мне все еще нужно найти способ отключить их, когда они будут достаточно далеко от места происшествия. Я планирую расширить мир еще больше, чтобы я мог достичь в 10 или 100 раз этих цифр, если производительность не упадет слишком сильно.