zoukankan      html  css  js  c++  java
  • 实验三 游戏场景的交互控制

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

    实验内容:

    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

    四、实验数据及处理结果

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

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

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

  • 相关阅读:
    向Sql Server数据库插入中文时显示乱码的解决办法 (转)
    自定义控件开发知识点
    Win7旗舰版中的IIS配置asp.net的运行环境
    windows使用
    Visual Studio 2012自动添加注释(如版权信息等)
    3个线程彼此通知
    多线程12_张孝祥 java5读写锁技术的妙用
    多线程11_张孝祥 java5的线程锁技术
    Spring整合hibernate4:事务管理[转]
    HTML界面JQuery ajax 返回200,但走Error方法
  • 原文地址:https://www.cnblogs.com/Zephyroal/p/1947513.html
Copyright © 2011-2022 走看看