00001 #include "GameListener.h" 00002 00003 #include "Timer.h" 00004 00005 #include "OgreRenderWindow.h" 00006 #include "OgrePlatformManager.h" 00007 00008 using Ogre::RenderWindow; 00009 using Ogre::PlatformManager; 00010 00011 00012 template<> ASR::GameListener* Singleton<ASR::GameListener>::ms_Singleton = 0; 00013 00014 namespace ASR 00015 { 00016 // ---------------------------------------------------------------------------- 00017 GameListener::GameListener ( RenderWindow* win ) 00018 : mInputDevice ( NULL ), 00019 mWindow ( win ) 00020 { 00021 mUpdaterList.clear (); 00022 00023 mTimer = new Timer (); 00024 00025 mInputDevice = PlatformManager::getSingleton().createInputReader (); 00026 mInputDevice->initialise ( win, true, true ); 00027 } 00028 00029 00030 // ---------------------------------------------------------------------------- 00031 GameListener::~GameListener(void) 00032 { 00033 PlatformManager::getSingleton().destroyInputReader( mInputDevice ); 00034 00035 delete mTimer; 00036 } 00037 00038 00039 // ---------------------------------------------------------------------------- 00040 void GameListener::addUpdater ( Updater* updateListener ) 00041 { 00042 mUpdaterList.insert ( updateListener ); 00043 } 00044 00045 00046 // ---------------------------------------------------------------------------- 00047 void GameListener::removeUpdater( Updater* updateListener ) 00048 { 00049 // Delayed removal (idea from Ogre::Root::removeFrameListener) 00050 mUpdatersToRemove.insert ( updateListener ); 00051 } 00052 00053 00054 // ---------------------------------------------------------------------------- 00055 bool GameListener::frameStarted ( const FrameEvent& e ) 00056 { 00057 if ( mWindow->isClosed () ) 00058 return false; 00059 00060 mInputDevice->capture (); 00061 mTimer->setTimeSinceLastFrame ( e.timeSinceLastFrame ); 00062 00063 00064 // Remove all the updaters scheduled for removal 00065 UpdaterList::iterator it; 00066 for ( it = mUpdatersToRemove.begin(); it != mUpdatersToRemove.end(); it++ ) 00067 { 00068 mUpdaterList.erase ( *it ); 00069 } 00070 mUpdatersToRemove.clear (); 00071 00072 // Fire off the updaters 00073 for ( it = mUpdaterList.begin(); it != mUpdaterList.end(); it++ ) 00074 { 00075 if ( !(*it)->updateBeforeFrame( e, mInputDevice ) ) 00076 return false; 00077 } 00078 00079 return true; 00080 } 00081 00082 00083 // ---------------------------------------------------------------------------- 00084 bool GameListener::frameEnded ( const FrameEvent& e ) 00085 { 00086 mTimer->setTimeSinceLastFrame ( e.timeSinceLastFrame ); 00087 00088 // Fire off the updaters 00089 UpdaterList::iterator it; 00090 for ( it = mUpdaterList.begin(); it != mUpdaterList.end(); it++ ) 00091 { 00092 if ( !(*it)->updateAfterFrame( e, mInputDevice ) ) 00093 return false; 00094 } 00095 00096 return true; 00097 } 00098 }