Конгер Д.
Физика для разработчиков компьютерных игр
стр. 279

Наиболее сложен случай с перекрытием ограничивающих сфер. В этом случае функция UpdateFrame () вызывает функцию Handl eOve г lapping (). Код функции HandleOverlappingO приведен в строках 96-216 листинга 10.5.

Функция HandleOverlappingO исправляет столкновения с перекрытием, выполняя шаги обратно во времени игры. В строках 122-142 листинга 10.5 она меняет на обратные направления векторов сил, линейных и угловых скоростей, действующих на оба перекрывающихся объекта. Затем выполняется обновление данных в обоих объектах. Эффект от этих действий эквивалентен возврату во времени в момент до столкновения.

В строке 149 функция HandleOverlapping О делит пополам временной шаг. Строки 154-173 восстанавливают исходные направления сил, линейных и угловых скоростей обоих тел. Затем выполняется обновление, и функция HandleOverlappingO проверяет, произошло ли столкновение (строки 183-184). Затем исполнение продолжается со строки 109, с которой начинается цикл for. Оператор switch, начинающийся в строке 114, опять определяет реакцию на столкновение. Если возврат назад во времени приводит к тому, что объекты соприкасаются, функция HandleOverlappingO вычисляет силы, возникающие при столкновении, и завершает цикл. Если тела все еще перекрываются, HandleOver-lapping() еще раз выполняет возврат во времени, уменьшает вдвое временной шаг и повторяет все снова. Это повторяется до тех пор, пока тела будут только соприкасаться, но не перекрываться.

Возможно, в результате возврата тела переместятся назад слишком далеко. В этом случае столкновения не будет, и нужно будет двигаться вперед во времени до тех пор, пока тела не соприкоснуться. Это делает код в строках 196-204.

После того, как функция HandleOverlappingO добьется того, что тела будут соприкасаться, но не перекрываться, и приложит к ним импульсную силу, она вернет управление функции UpdateFrame (), а точнее, в строку 37 листинга 10.5.

Поскольку к телам приложены новые силы, функция UpdateFrame () сбрасывает в false значение переменной forceApplied. Когда выполнение доходит до строки 49, проверяется значение этой переменной. Если оно равно true (то есть силы уже прикладывались к телам, и вновь их прикладывать не нужно), функция UpdateFrame () уменьшает до 0 силы, действующие на тигров. Если силы еще не прикладывались, функция устанавливает переменную forceApplied в значение true в строке 59. При этом силы будут уменьшены до 0 при следующем вызове функции UpdateFrame ().

Завершая работу, функция UpdateFrame () еще раз перебирает всех тигров, обновляя данные о них. Теперь они будут занимать правильные положения, и их можно отображать на экране функцией RenderFrame (). Код функции RenderFrame() здесь не приведен — он вполне тривиален. Если хотите, можете просмотреть его в файле TigerToss. срр на компакт-диске.

Новости
Финальный сезон The Walking Dead закончится в декабре
Создатели интерактивной драмы The Walking Dead из Telltale представили расписание выхода всех эпизодов финального сезона проекта.
Пользователи «ВКонтакте» могут официально поддержать Альянс или Орду
С 15 и до 29 августа каждый пользователь социальной сети может официально поддержать одну из двух противоборствующих сторон: Альянс или Орду.