*   >> Læs Uddannelse artikler >> science >> programming

Realiseringen af ​​et 3D-spil med Ogre - Collision Detection

nye og fjernet objekter gemmes i de midlertidige samlinger newObjects og deletedObjects (via AddCollisionObject og RemoveCollisionObject funktioner), med de nye og slettede objekter synkroniseres med de vigtigste samling (via AddNewObjects og RemoveDeletedObjects funktioner), før vi begynder looping over det i FrameEnded funktionen. Det er den samme proces, der anvendes med FrameListeners, og en bivirkning er, at fjernede genstande forbliver i den vigtigste samling efter at være blevet "fjernet", og har deres funktioner kaldes.


Ved at udvide PersistentFrameListener klasse og tilbage i en pulje i en deaktiveret tilstand (hvilket er, hvad fjender og våben allerede gør), findes der stadig ting, som udvider CollisionObject klassen og kan have deres funktioner kaldes uden at crashe systemet. Den CollisionManager vil kun kalde Collision funktionen hvis CollisionObject er aktiv, der sikrer, at lukke ned genstande ikke deltager i kollisioner.


Grunden til kollisionen afsløring kode er i FrameEnded funktionen fordi vi ønsker alle vores objekter for at have opdateret til deres nye positioner før afsløring kollisioner. Fordi det ville være vanskeligt at sikre, at CollisionManagers FrameStarted funktionen blev kaldt før eller efter alle de andre spil objekter, gør kollisionsdetektion i FrameStarted funktionen kan føre til en inkonsekvent situation, hvor halvdelen af ​​de spil objekter opdateret selv, kollisionsdetektion .

blev beregnet, og derefter den sidste halvdel af andre genstande opdateret sig

 ugyldiggøre 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 (const 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 * const object1 = * iter1; CollisionObject * const object2 = * iter2; hvis (object1-> IsStarted () && object2-> IsStarted ()) {const Sphere & object1Sphere = object1-> GetBoundingSphere (); const Sphere & object2Sphere = object2-> GetBoundingSphere (); IF (object1Sphere.intersects (object2Sphere)) {object1-> Kollision (object2); object2->

Page   <<  [1] [2] [3] [4] [5] [6] >>
Copyright © 2008 - 2016 Læs Uddannelse artikler,https://uddannelse.nmjjxx.com All rights reserved.