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

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

[email protected] * Nettside: https://www.brighthub.com/hubfolio/matthew-casperson.aspx * /# ifndef COLLISIONMANAGER_H_ # definere COLLISIONMANAGER_H_ # include "PersistentFrameListener. h "# include" CollisionObject.h "#include" liste "#define COLLISIONMANAGER CollisionManager :: Instance () typedef std :: liste CollisionObjectList; klasse CollisionManager: public PersistentFrameListener {public: ~ CollisionManager (); statisk CollisionManager & Instance () {statisk CollisionManager eksempel; returnere eksempel; } Void Startup (); void Shutdown (); ugyldig AddCollisionObject (CollisionObject * objekt); ugyldig RemoveCollisionObject (CollisionObject * objekt); bool FrameEnded (konst FrameEvent & evt), beskyttet: CollisionManager (); void AddNewObjects (); void RemoveDeletedObjects (); CollisionObjectList collisionObjectList; CollisionObjectList newObjects; CollisionObjectList deletedObjects;}; # endif

CollisionManager.

cpp

 # Include "CollisionManager.h"CollisionManager::CollisionManager(){}CollisionManager::~CollisionManager(){}void CollisionManager :: Startup () {PersistentFrameListener :: Startup ();} void CollisionManager :: Shutdown () {newObjects.clear (); deletedObjects.clear (); collisionObjectList.

clear (); PersistentFrameListener :: Shutdown ();}

En av grunnene for å skape den PersistentFrameListener klassen var å omgå et problem i Ogre hvor FrameListeners kan fortsatt ha sin event funksjon kalt selv etter at de ble fjernet fra samlingen vedlikeholdes av OgreRoot objektet med removeFrameListener funksjon. Den CollisionManager viser hvorfor dette er tilfellet.

I FrameEnded fungere CollisionManager looper gjennom alle CollisionObjects sjekke for kollisjoner. Hvis en kollisjon er funnet, er Kollisjon funksjonen på de kolliderende CollisionObjects kalt.

Som tidligere nevnt, kan en av resultatene av en kollisjon være at en av de kolliderende gjenstandene blir fjernet ved å kalle dens avslutning funksjon. Uten en liten løsningen blir Shutdown funksjon fjerne CollisionObject fra samlingen vedlikeholdes av CollisionManager - den samme som vi ble looping over til oppdage kollisjonen i første omgang. Dette er et problem fordi hvis du endrer en samling (ved å si å fjerne et element fra det) mens looping over det søknaden ville krasje.


For å unngå dette problemet helt nye og fjernet objekter blir lagret i midlertidige samlinger newObjects og deletedObjects (via AddCollisionObject og RemoveCollisionObject funksjoner)

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