<Р> Чтобы избежать этой проблемы все новые и удалены объекты хранятся в коллекциях временные newObjects и deletedObjects (через функции AddCollisionObject и RemoveCollisionObject), с новыми и удаленных объектов синхронизируются с основной коллекции (через AddNewObjects и RemoveDeletedObjects функций), прежде чем мы начинаем цикл над ним в функции FrameEnded.
Это тот же самый процесс используется с FrameListeners, и побочный эффект в том, что удаленные объекты остаются в основной коллекции после "удалить" и их функции называется.
<Р>, расширив класс PersistentFrameListener а остальные в бассейне в выключенном состоянии (что враги и оружие уже делают), объекты, которые расширяют класс CollisionObject все еще существуют, и может иметь их функции называется без сбоев системы. CollisionManager только вызвать функцию столкновений, если CollisionObject активен, гарантируя, что закрыли объекты не участвуют в столкновениях.
<Р> Причина, почему код обнаружения столкновений в функции FrameEnded происходит потому, что мы хотим все наши объекты обновили их новых позиций перед обнаружением коллизий. Потому что это было бы трудно гарантировать, что функция CollisionManagers FrameStarted называли до или после всех других игровых объектов, делают обнаружение столкновения в функции FrameStarted может привести к несовместимым ситуации, когда половина игровых объектов обновляются сами, обнаружение столкновений .
была рассчитана, а затем вторая половина других объектов обновляются сами
аннулированию CollisionManager :: AddCollisionObject (CollisionObject * объект) {newObjects.push_back (объект);} недействительным CollisionManager :: RemoveCollisionObject (CollisionObject * объект) { deletedObjects.push_back (объект);} недействительным CollisionManager :: AddNewObjects () {для (CollisionObjectList :: итератор ИТЭР = newObjects.begin (); ИТЭР = newObjects.end (!); ++ ИТЭР) {collisionObjectList.push_back (* ИТЭР ); } NewObjects.clear ();} недействительным CollisionManager :: RemoveDeletedObjects () {для (CollisionObjectList :: итератора ИТЭР = deletedObjects.begin (!), ITER = deletedObjects.end (); ++ ИТЭР) {collisionObjectList.remove (* ИТЭР ); } DeletedObjects.clear ();} BOOL CollisionManager :: FrameEnded (строительства FrameEvent & ЭВТ) {AddNewObjects (); RemoveDeletedObjects (); для (CollisionObjectList :: итератор Iter1 = collisionObjectList.begin (!), Iter1 = collisionObjectList.end (); ++ Iter1) {CollisionObjectList :: итератор iter2 = Iter1; ++ iter2; для (;! iter2 = collisionObjectList.
end (); ++ Iter2) {CollisionObject * сопзЬ object1 = * Iter1; CollisionObject * строительства object2 = * iter2; если (object1-> IsStarted () && object2-> IsStarted ()) {строительства Сфера и object1Sphere = object1-> GetBoundingSphere (); Сфера строительства и object2Sphere = object2-> GetBoundingSphere (); если (object1Sphere.intersects (object2Sphere)) {object1-> Столкновение (object2); object2->