OneTimeSceneInit
在这里面,首先做的工作就是找到donuts4.ini的位置,然后,确定出当前工作目录。确定了这个,才能保证donuts4可以顺利的找到其他的物体,比如texture或者model。
然后就是读取ini的信息了。读取以后,把ini文件加到了FileWatch中。这样的话,一旦ini文件更新了的话,就reload(还是无法理解为啥要FileWatch这个东西)。
在设置完成过后,就是一些相应的创建了。比如InputManager和3DDrawManager,还调用了它们的成员OneTimeSceneInit。然后,初始化了audio stuff和display stuff。
在创建了菜单以后(我真的没看到菜单……),游戏的State被设定在了LoadSplash上。
准备工作完成,游戏就要开始了。
CreateSoundObjects
在OneTimeSceneInit中,初始化audio stuff的工作是交给CreateSoundObjects()这个函数来完成的。在这个函数中,主要是声明了一个MusicManager的类。我对DX中的声音部分还不是太熟悉,所以这个可以留到以后再看。
InitDeviceObjects
InitDeviceObjects完成了对视频方面的初始化。首先是创建设备。这里要注意的是,IDriect3D9这个东西似乎没啥用,就是在创建设备的时候用一下,创建完就Release了。还有一点有趣的是,donuts在选择显示模式上也很完善:首先是按照从优到差对模式排序,然后逐一尝试,直到能有支持的模式为止。设定完了Presentation Parameter以后,就CreateDevice了。
创建完了设备,第二步是显示那个Loading的画面,自然也少不了声明相关的Font。
第三步是读取。程序Load了Sky,UI,Splash和Particle的Texture以及Sky Dome的mesh,而且还创建了一些vextex buffer。最后是Load了Enemy,Bullet和PlayerShip的model。
最后一步是创建Terrain Engine。另外,程序说把m_pShip加到display list里面去,使用的命令是:g_pTerrain->AddDisplayObject( m_pShip ),难道说,管理显示列表的是地形引擎?迷惑ing。
RestoreDeviceObjects
在Common Framework中,OneTimeSceneInit()和FinalClearup()是一对,用于创建和删除设备无关的东西(比如几何信息)。InitDeviceObjects()和DeleteDeviceObjects()是一对,用于创建和删除设备相关的信息。而RestoreDeviceObjects()和InvalidateDeviceObjects()是一对,不过这对函数的作用我一直都很模糊。
在这个里面,除了设置灯光和为Radar创建Texture外,就是调用其他的对象的RestoreDeviceObjects了。
据说,RestoreDeviceObjects是为了在Device Lost的时候可以很快的恢复。如果Delete再Init的话太费时间了。还是晕晕的,等问问高人们再说吧……
游戏开始
在UpdateScene中,果然看到了一个自动机。UpdateScene会根据当前的状态作出相应的动作。在APP类中,状态转换可以在任何位置进行。这样的话,就更加灵活。
在游戏Active了以后,Update的操作是由调用FrameMove()来完成的。
FrameMove()里面除了调用一些成员的FrameMove()外,比较主要的就是通过计算的方法把速度模拟为60Hz,这和FPS无关,是算出来的。我倒是更习惯于限帧了。在有就是一堆声音的东东,看起来DX Sound和DX Music比DX Graphics还要麻烦……
在RenderScene()中,首先还是看看是否发生了Device Lost。如果发生了的话,就先Reset,再Restore了。然后,就是按照当前状态进行渲染了。比如,当进行到Display Splash时,调用的是RenderSplash(),而要显示Level的时候,调用的是DisplayLevelIntroScreen(),而真正游戏的渲染用的则是RenderFrame()。