工程编译成功后,就可以开始学习了。
1. 分析文件结构
之前熟悉过ogre1.x 的,对这些文件结构都挺熟悉的。
看看 Docs
没有太多的有用信息,可以花时间看一看。
BuildingOgre.txt
如何在各平台编译Ogre-next
NewTips.txt
描述了一些与ogre1.x不同的地方。这对之前使用ogre1.x的同学很有用处。
只是入门ogre,咱也看不懂,咱也不敢说。
由于没有足够的文档,从这里能获取的信息有限。
看看项目解决方案。
大致分为:
也没什么有用信息。缺少了分组,不能像ogre1.x一样,区分功能
直接进入Tutorial
运行 Sampel_Tutorial01_Initialization,只有一个带颜色的全屏窗口。因为使用了两个屏幕,运行时它影响到了另一个屏幕。bug!
看看代码,出现了几个类
GameState
MyGraphicsSystem : GraphicsSystem : BaseSystem : MessageQueueSystem
Ogre 1.x 把创建窗口,初始化的功能称为bites,属于compoents。这里改成了GraphicsSystem,传入参数叫做 GameState,图形系统 / 游戏状态?感觉不太匹配啊。还是1.x的Application更合适一点。GraphicsSystem改为 Game 更匹配一点。GraphicsSystem 属于 Sample,从结构上就没有把它区分开。还是1.x 的bites更优秀一点。namespace 是Demo,GraphicsSystem还没有被收编呀。
1. 创建一个MyGameState myGameState;
class MyGameState : public TutorialGameState
class TutorialGameState : public GameState
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) {}
};
看看GameState,发现一个奇怪的东西
createScene01, createScene02
这种创建场景,还特定标明scene01, scene02,是不可能作为通用基类定义的。
2. 创建graphicsSystem
GraphicsSystem graphicsSystem( &myGameState );
myGameState._notifyGraphicsSystem( &graphicsSystem );
graphicsSystem.initialize( "Tutorial 02: Variable Framerate" );
if( graphicsSystem.getQuit() )
{
graphicsSystem.deinitialize();
return 0; //User cancelled config
}
Ogre::RenderWindow *renderWindow = graphicsSystem.getRenderWindow();
graphicsSystem.createScene01();
graphicsSystem.createScene02();
然后,又发现了在 GraphicSystem里也有 createScene01, createScene02。
所以可以猜测,GraphicsSystem,GameState只能属于Demo级别了。
未来可能也会有类似1.x的bites的东西出现。
3. 游戏循环
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 );
}
Ogre::uint64 endTime = timer.getMicroseconds();
timeSinceLast = (endTime - startTime) / 1000000.0;
timeSinceLast = std::min( 1.0, timeSinceLast ); //Prevent from going haywire.
startTime = endTime;
}
beginFrameParallel, update, finishFrameParallel, finishFrame。至少不是像1.x那样,一个startRending包含一切了。
有过1.x的学习经历,2.x轻车熟路,就不再运行分析每一个sample了。
接下来,直接进入无聊又漫长的画流程图的时刻了。