*   >> Lezen Onderwijs artikelen >> science >> programming

Het maken van een 3D-spel met Ogre - Collision Detection

oepassing zou crashen.

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->

Page   <<  [1] [2] [3] [4] [5] [6] >>
Copyright © 2008 - 2016 Lezen Onderwijs artikelen,https://onderwijs.nmjjxx.com All rights reserved.