*   >> Lese Utdanning Artikler >> science >> programming

Å gjøre en 3D-spill med Ogre - Collision Detection

, med de nye og slettede objekter blir synkronisert med hoved samlingen (via AddNewObjects og RemoveDeletedObjects funksjoner) før vi starter looping over det i FrameEnded funksjonen. Dette er den samme prosessen som brukes med FrameListeners, og en bivirkning er at fjernede objekter forblir i hoved samlingen etter å ha blitt "fjernet", og har sine funksjoner kalt.


Ved å utvide PersistentFrameListener klasse og igjen i et basseng i upåvirket tilstand (som er hva fiender og våpen allerede gjør), gjenstander som utvider CollisionObject klassen fortsatt eksisterer og kan ha sine funksjoner kalt uten å krasje systemet. Den CollisionManager vil bare kalle Kollisjon funksjon hvis CollisionObject er aktiv, slik at stenge gjenstander ikke deltar i kollisjoner.

Grunnen til at dueller kode er i FrameEnded funksjonen er fordi vi ønsker alle våre objekter for å ha oppdatert til sine nye posisjoner før detektere kollisjoner.

Fordi det ville være vanskelig å sikre at CollisionManagers FrameStarted funksjonen ble kalt før eller etter alle de andre spillobjektene, gjør dueller i FrameStarted funksjonen kan føre til en inkonsekvent situasjon hvor halvparten av spillobjektene oppdatert seg selv, dueller . ble beregnet, og deretter i siste halvdel av andre objekter oppdatert seg

 annullere CollisionManager :: AddCollisionObject (CollisionObject * objekt) {newObjects.push_back (objekt);} void CollisionManager :: RemoveCollisionObject (CollisionObject * objekt) { deletedObjects.

push_back (objekt);} void CollisionManager :: AddNewObjects () {for (CollisionObjectList :: iterator ITER = newObjects.begin (); ITER = newObjects.end ();! ++ ITER) {collisionObjectList.push_back (* ITER ); } NewObjects.clear ();} void CollisionManager :: RemoveDeletedObjects () {for (CollisionObjectList :: iterator ITER = deletedObjects.begin ();! ITER = deletedObjects.end (); ++ ITER) {collisionObjectList.remove (* ITER ); } DeletedObjects.

clear ();} bool CollisionManager :: FrameEnded (konst FrameEvent & evt) {AddNewObjects (); RemoveDeletedObjects (); for (CollisionObjectList :: iterator iter1 = collisionObjectList.begin ();! iter1 = collisionObjectList.end (); ++ iter1) {CollisionObjectList :: iterator iter2 = iter1; ++ iter2; for (;! iter2 = collisionObjectList.

end (); ++ iter2) {CollisionObject * konst object1 = * iter1; CollisionObject * konst object2 = * iter2; if (object1-> IsStarted () && object2-> IsStarted ()) {konst Sphere & object1Sphere = object1-> GetBoundingSphere (); konst Sphere & object2Sphere = object2-> GetBoundingSphere (); if (object1Sphere.intersects (object2Sphere)) {object1-> Collision (object2); object2->

Page   <<  [1] [2] [3] [4] [5] [6] >>
Copyright © 2008 - 2016 Lese Utdanning Artikler,https://utdanning.nmjjxx.com All rights reserved.