实验三 游戏场景的交互控制

实验三 游戏场景的交互控制

实验内容:

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这个方法,改进

clip_image002

之前由于旋转相机,都未显示过鼠标,而CeGUI需要鼠标,参照SDK做了个改进(即拖拽时不显示,正常情况下显示)

clip_image004

clip_image006

效果好多了。可中间也发现ogre对中文的支持确实很糟糕,utf8,没用unicode,暂时先放着,但这问题一定得解决~

2, 天空盒,地形

稍整代码,上路

A:

修改如下:

clip_image008

terrain.cfg:

clip_image010

看注释,easy work,但其中的四叉树场景管理却是大有门道,在上个学期所完做的一个项目中,为了实现巨型场景的模拟,对OCTTREE算法做了相当的扩展与更新,头疼一月余。。。

B:

一鼓作气,再加入天空盒

clip_image012

效果么~~~我需要美工!

clip_image014

问题也随之而来了,只是随着教程走,却是小和尚念经有口无心,Archive是怎么实现的?这是一个大大的问号

修改

clip_image016

clip_image018

clip_image020

说明清了一个问题:

clip_image022

结果发现指向的就是这个文件

clip_image024

修改资源文件

clip_image025

很神奇的一片白色:

clip_image027

还是老实看资料,原来是Ogre采用了script的机制:

clip_image029

clip_image031

答案明了,动手解决:

clip_image033

成功,嘿嘿

再加入雾化效果:

clip_image035

3, CeGUI

渲染循环,Ogre程序的基本工作原理,帧监听,OIS现在都有所了解了。现在就开始大名鼎鼎的CEGUI!

(1),由于没有按课上讲的旧版,Ogre1.7.1+CeGUI0.7.1,于是就跟着中文Wiki上的0.7.1的教程做:前面的工作程都很顺利,CeGUI配置也没问题,

clip_image037

clip_image039
但是用了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);

};

然后进行注册

clip_image041

对按钮进行响应:

clip_image043

将OIS输入的信息注入CeGUI:

clip_image045

终于解决,小小的感动了一把:

clip_image047

四、实验数据及处理结果

结果均以截图给出,代码,工程附带。。。

五、思考讨论题或体会或对改进实验的建议

遇到再棘手的问题也不要轻易放弃,也许成功就在你再坚持的一分钟后!

posted @ 2011-01-29 16:19  Zephyroal  阅读(1387)  评论(0编辑  收藏  举报