实验三 游戏场景的交互控制
实验三 游戏场景的交互控制
实验内容:
1. 建立一个简单的游戏场景;
2. 通过键盘和鼠标实现游戏场景的交互控制;
3. 采用CEGUI实现游戏程序的基本操作界面;
实验目的:
1. 熟悉渲染循环,了解Ogre程序的基本工作原理。
2. 掌握帧监听其接口的作用及其使用方法。
3. 了解OIS的工作原理及其与OGRE的集成方法,熟悉鼠标、键盘监听器的使用方法。
4. 了解CEGUI的工作原理及其与OGRE的集成方法,掌握CEGUI的界面编程方法。
三、实验步骤
1, 框架建立,改进
看了新教程,才发现自己上一个实验里自己迷迷糊糊用buffered的OIS反向实现了unbuffered的输入,不过也好,完全理解了OIS的工作机理,同时注册了一个FrameListener会在每帧的startRendering进行调用,这里为了简单处理,直接将类全部继承之,省去了很多类间通讯的麻烦:class BaseApplication : public Ogre::FrameListener,, public OIS::KeyListener, public OIS::MouseListener,
首先,做一点小小的改进,因为每次都要确认初始化设备的窗口很是麻烦,查到了Root有restore这个方法,改进
之前由于旋转相机,都未显示过鼠标,而CeGUI需要鼠标,参照SDK做了个改进(即拖拽时不显示,正常情况下显示)
效果好多了。可中间也发现ogre对中文的支持确实很糟糕,utf8,没用unicode,暂时先放着,但这问题一定得解决~
2, 天空盒,地形
稍整代码,上路
A:
修改如下:
terrain.cfg:
看注释,easy work,但其中的四叉树场景管理却是大有门道,在上个学期所完做的一个项目中,为了实现巨型场景的模拟,对OCTTREE算法做了相当的扩展与更新,头疼一月余。。。
B:
一鼓作气,再加入天空盒
效果么~~~我需要美工!
问题也随之而来了,只是随着教程走,却是小和尚念经有口无心,Archive是怎么实现的?这是一个大大的问号
修改
为
说明清了一个问题:
结果发现指向的就是这个文件
修改资源文件
很神奇的一片白色:
还是老实看资料,原来是Ogre采用了script的机制:
答案明了,动手解决:
成功,嘿嘿
再加入雾化效果:
3, CeGUI
渲染循环,Ogre程序的基本工作原理,帧监听,OIS现在都有所了解了。现在就开始大名鼎鼎的CEGUI!
(1),由于没有按课上讲的旧版,Ogre1.7.1+CeGUI0.7.1,于是就跟着中文Wiki上的0.7.1的教程做:前面的工作程都很顺利,CeGUI配置也没问题,
但是用了OgreRender之后麻烦来了:
跟踪:
"sampleApp->initialiseSample();
-> SchemeManager::getSingleton().create("TaharezLook.scheme");
-> U xml_loader(xml_filename, resource_group);
->void ExpatParser::parseXMLFile(XMLHandler& handler, const String& filename, const String& /*schemaName*/, const String& resourceGroup);
-> CEGUI::System::getSingleton().getResourceProvider()->loadRawDataContainer(filename, rawXMLData, resourceGroup); ok, continue step into.
->long const res=*x;
vs报:Unhandled exception at 0x663b14f1 (CEGUIOgreRenderer_d.dll) in Sample_FirstWindow_d.exe: 0xC0000005: Access violation reading location 0xccccccd0.
经检查,资源都成功读入了,但是在多线程下堆破坏,
怀疑两点:1,Boost 2,中文:
Google之,发现有人与我遇到了一模一样的问题(看记录也是华人)
http://www.cegui.org.uk/phpBB2/viewtopic.php?f=10&t=4781那个可怜的兄弟因为没有把Log贴完被CE臭骂一顿,但再看下去,发现他说
"And the error is just because when I compile them I use the latest Ogre with the 0.7.1 which is before.Your post about the new SDK helps me..."
这句话不太理解,按大意立马乐呵呵地跑去下了CeGUI的0.7.4结果问题依旧,在Ogre里的Demo都不能进去调试了。。。
无语,上官网发现了新出的版本,下。。。
(2),
整个过程让人懊丧,谢天谢地,看了坛子里一个想放弃的朋友的牢骚,和众人的鼓励,
我想再坚持一会。。。重新编译
Ogre1.7.2 & CeGUI 0.7.5,
使用了新的框架结构
class BasicTutorial7 : public BaseApplication
{
public:
BasicTutorial7(void);
virtual ~BasicTutorial7(void);
protected:
CEGUI::OgreRenderer* mRenderer;
virtual void createScene(void);
virtual void createFrameListener(void);
// Ogre::FrameListener
virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);
// OIS::KeyListener
virtual bool keyPressed( const OIS::KeyEvent &arg );
virtual bool keyReleased( const OIS::KeyEvent &arg );
// OIS::MouseListener
virtual bool mouseMoved( const OIS::MouseEvent &arg );
virtual bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
virtual bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
bool quit(const CEGUI::EventArgs &e);
};
然后进行注册
对按钮进行响应:
将OIS输入的信息注入CeGUI:
终于解决,小小的感动了一把:
四、实验数据及处理结果
结果均以截图给出,代码,工程附带。。。
五、思考讨论题或体会或对改进实验的建议
遇到再棘手的问题也不要轻易放弃,也许成功就在你再坚持的一分钟后!