Om dit probleem te voorkomen dat alle nieuwe en verwijderde objecten worden opgeslagen in het tijdelijke collecties newObjects en deletedObjects (via de AddCollisionObject en RemoveCollisionObject functies), met de nieuwe en verwijderde objecten worden gesynchroniseerd met de belangrijkste collectie (via de AddNewObjects en RemoveDeletedObjects functies) voordat we beginnen met een lus over het in de FrameEnded functie.
Dit is hetzelfde proces gebruikt met FrameListeners en een neveneffect is dat verwijderde objecten blijven in de belangrijkste verzameling nadat ze "verwijderd" en hebben hun functies genoemd.
Door de uitbreiding van de klasse PersistentFrameListener en de resterende in een zwembad in een gedeactiveerde staat (dat is wat de vijanden en wapens al doen), objecten die de klasse CollisionObject breiden bestaan nog steeds en hebben hun functies opgeroepen zonder te crashen van het systeem.
De CollisionManager zal alleen noemen het Collision functie als de CollisionObject actief is, ervoor te zorgen dat stilgelegd objecten niet deelnemen aan botsingen.
De reden waarom de collision detection code staat in de FrameEnded functie is omdat we willen dat al onze objecten te detecteren voordat botsingen hebben aangepast aan hun nieuwe posities.
Omdat het moeilijk zou zijn om ervoor te zorgen dat de CollisionManagers FrameStarted functie voor of na alle andere spel voorwerpen werd genoemd, het doen van de botsing detectie in de FrameStarted functie zou kunnen leiden tot een inconsistente situatie waar de helft van het spel objecten bijgewerkt zelf, de botsing detectie . werd berekend, en dan de laatste helft van andere objecten bijgewerkt zichzelf
ongeldig CollisionManager :: AddCollisionObject (CollisionObject * object) {newObjects.push_back (object);} leegte CollisionManager :: RemoveCollisionObject (CollisionObject * object) { deletedObjects.push_back (object);} leegte CollisionManager :: AddNewObjects () {voor (CollisionObjectList :: iterator iter = newObjects.begin (); iter = newObjects.end ();! ++ iter) {collisionObjectList.push_back (* iter ); } NewObjects.clear ();} leegte CollisionManager :: RemoveDeletedObjects () {voor (CollisionObjectList :: iterator iter = deletedObjects.begin ();! Iter = deletedObjects.end (); ++ iter) {collisionObjectList.remove (* iter ); } DeletedObjects.
clear ();} bool CollisionManager :: FrameEnded (const FrameEvent & evt) {AddNewObjects (); RemoveDeletedObjects (); voor (CollisionObjectList :: iterator iter1 = collisionObjectList.begin ();! iter1 = collisionObjectList.end (); ++ iter1) {CollisionObjectList :: iterator iter2 = iter1; ++ iter2; voor (;! iter2 = collisionObjectList.
end (); ++ iter2) {CollisionObject * const Object1 = * iter1; CollisionObject * const object2 = * iter2; if (object1-> IsStarted () && object2-> IsStarted ()) {const Sphere & object1Sphere = object1-> GetBoundingSphere (); const Sphere & object2Sphere = object2-> GetBoundingSphere (); if (object1Sphere.intersects (object2Sphere)) {object1-> Collision (object2); object2->
Aan de slag met Activeperl
- Draad Framing een Key Web Designing Tool:
- PushButton Tutorial Series - Tracking & amp; amp; Jumping
- C # - Het bouwen van een Fahrenheit /Celsius Converter
- Hoe je het MAC-adres van onze machine met behulp van VB .net krijgen?
- Network Security Management voor Grote Overheid, School, bedrijven en Homes
- C Object Identifiers
- Mobile Video Game Development: Een Quick Overview
- De C ++ String Class
- ASP.NET - C # - Met behulp van UserControls als Mail Templates
- Eenvoudige welkom en Print Console toepassing in C # ( C scherp) ( Dot Net )