Sample_Tutorial01_Initialization,作为Ogre2.1的一个入门例子,该例子创建一个空场景,可以说是一个Ogre应用程序简单框架,以下介绍下这个例子:
主要类介绍:
MainEntryPoints类: 系统的入口点,该类定义了静态的方法,需要具体实例自己实现createSystems和destroySystems方法,以此完成初始化、卸载、线程模式等工作:
主要方法:
createSystems();
destroySystems();
mainAppMultiThreaded();
mainAppSingleThreaded();
GameState类:
派生自:MouseListener, KeyboardListener, JoystickListener,处理外部输入事件,同时完成场景的创建、更新、数据提交等,具体声明如下:
class GameState : public MouseListener, public KeyboardListener, public JoystickListener
{
public:
virtual ~GameState() {}
virtual void initialize(void) {}
virtual void deinitialize(void) {}
virtual void createScene01(void) {}
virtual void createScene02(void) {}
virtual void destroyScene(void) {}
virtual void update( float timeSinceLast ) {}
virtual void finishFrameParallel(void) {}
virtual void finishFrame(void) {}
};
程序入口函数:
WinMainApp( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR strCmdLine, INT nCmdShow )
{
GameState gameState;
MyGraphicsSystem graphicsSystem( &gameState );
graphicsSystem.initialize( "Tutorial 01: Initialization" );
if( graphicsSystem.getQuit() )
{
graphicsSystem.deinitialize();
return 0; //User cancelled config
}
Ogre::RenderWindow *renderWindow = graphicsSystem.getRenderWindow();
// 创建场景
graphicsSystem.createScene01();
graphicsSystem.createScene02();
// 计时器
Ogre::Timer timer;
unsigned long startTime = timer.getMicroseconds();
double timeSinceLast = 1.0 / 60.0;
// 渲染循环
while( !graphicsSystem.getQuit() )
{
graphicsSystem.beginFrameParallel();
graphicsSystem.update( static_cast<float>( timeSinceLast ) );
graphicsSystem.finishFrameParallel();
graphicsSystem.finishFrame();
if( !renderWindow->isVisible() )
{
//Don't burn CPU cycles unnecessary when we're minimized.
Ogre::Threads::Sleep( 500 );
}
unsigned long endTime = timer.getMicroseconds();
timeSinceLast = (endTime - startTime) / 1000000.0;
timeSinceLast = std::min( 1.0, timeSinceLast ); //Prevent from going haywire.
startTime = endTime;
}
// 销毁资源
graphicsSystem.destroyScene();
graphicsSystem.deinitialize();
return 0;
}