ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:21.97KB ,
资源ID:5805749      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5805749.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(OGRE基础教程六.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

OGRE基础教程六.docx

1、OGRE基础教程六教程:基础教程:基础教程六必备知识本教程是在假设你已经拥有c+编程基础并能够成功建立和编译Ogre程序(如果你设置程序方面还存在问题,请参阅SettingUpAnApplication来获取详细信息)。本教程建立在之前的初学者教程的基础上,并且假设你已经学习了它们。 工程设置下面的适用于下载源代码的用户: 添加include文件夹: $(OGRE_HOME)Dependenciesinclude, $(OGRE_HOME)DependenciesincludeCEGUI 添加lib库路径: $(OGRE_HOME)OgreMainDependenciesLibDebug确信已

2、经链接 CEGUIBase 和 OgreGUIRender 库,也就是说将下面一行添加进你的Makefile文件或g+命令行: -L/usr/local/lib -lCEGUIBase -lCEGUIOgreRenderer下面的适用于SDK的用户: 添加include文件夹:$(OGRE_HOME)includeCEGUI确信已经在debug配置的中添加 CEGUIBase_d.lib 和 OgreGUIRenderer_d.lib 库( CEGUIBase.lib 和 OgreGUIRenderer.lib 在release配置中)。在Visual C+中添加依赖,依次点击:项目 - 属性

3、 - 配置属性 - 链接。 CEGUIRender源程序现在是从Ogre CVS下载代码中的一部分,一个示例工程,因此你必须将包含OgreGUIRenderer头文件和lib文件的文件夹路径添加到属性配置中。 另外,下面两个目录是必需的。尽管你在你的安装路径中的文件夹找不到。将其作为约定它就会起作用: 添加Include文件夹: $(OGRE_HOME)SamplesCommonCEGUIRendererinclude 添加 Lib 路径: $(OGRE_HOME)SamplesCommonCEGUIRendererlib介绍Crazy Eddies GUI系统是一个为不具备或缺乏用户界面制作

4、功能的图形API或引擎提供免费用户界面支持的开源的库。这个使用c+编写的库是针对那些想制作优秀的游戏却又没有GUI(图形用户界面)子系统的专业游戏开发者。 开始首先,你需要架构(skeleton)代码来创建具有CEGUI组件的Ogre程序。注意:如果你使用,你必须在之前添加#define NOMINMAX。 #include #include #include #include #include #include #include OgreCEGUIRenderer.h #include OgreCEGUIResourceProvider.h /regular mem handler #inc

5、lude ExampleApplication.h class GuiFrameListener: public ExampleFrameListener private: CEGUI:Renderer* mGUIRenderer; public: GuiFrameListener(RenderWindow* win, Camera* cam, CEGUI:Renderer* renderer) : ExampleFrameListener(win, cam, false, false), mGUIRenderer(renderer) ;仅仅是一个不做任何动作的空帧监听器,但在你按下“Esc”

6、之前会一直循环。 class TutorialApplication: public ExampleApplication private: CEGUI:OgreCEGUIRenderer* mGUIRenderer; CEGUI:System* mGUISystem; CEGUI:Window* mEditorGuiSheet;这些是包含所有CEGUI数据的数据成员。我喜欢显式的调用CEGUI成员,一但你开始对Ogre成员添加调用,这将会明确的说明它们是来自CEGUI。 public: TutorialApplication() : mGUIRenderer(0), mGUISystem(0

7、), mEditorGuiSheet(0) TutorialApplication() if(mEditorGuiSheet) CEGUI:WindowManager:getSingleton().destroyWindow(mEditorGuiSheet); if(mGUISystem) delete mGUISystem; mGUISystem = 0; if(mGUIRenderer) delete mGUIRenderer; mGUIRenderer = 0; 下面是你可以设置任意Ogre场景的地方,使用你在前五章教程学到的方法。在这个Ogre场景中,你仍要为其添加一个独立的相机(ca

8、mera)和视窗(viewport)。 protected: void createScene(void) / Set ambient light mSceneMgr-setAmbientLight(ColourValue(0.5, 0.5, 0.5);下面是创建CEGUI日志的地方,一般都设置为Informative模式的。其具有四种模式:Standard, Errors, Informative 和 Insane。 / Set up GUI system mGUIRenderer = new CEGUI:OgreCEGUIRenderer(mWindow, Ogre:RENDER_QUEU

9、E_OVERLAY, false, 3000, mSceneMgr); mGUISystem = new CEGUI:System(mGUIRenderer); CEGUI:Logger:getSingleton().setLoggingLevel(CEGUI:Informative);创建一个新的CEGUI系统,使用“TaharezLook”来设置图(sheme)与鼠标指针,使用“BlueHighway-12”来设置字体。 CEGUI:SchemeManager:getSingleton().loadScheme(CEGUI:utf8*)TaharezLookSkin.scheme); mG

10、UISystem-setDefaultMouseCursor(CEGUI:utf8*)TaharezLook,(CEGUI:utf8*)MouseArrow); CEGUI:MouseCursor:getSingleton().setImage(TaharezLook,MouseMoveCursor); mGUISystem-setDefaultFont(CEGUI:utf8*)BlueHighway-12); mEditorGuiSheet=CEGUI:WindowManager:getSingleton().createWindow(CEGUI:utf8*)DefaultWindow, (

11、CEGUI:utf8*)Sheet); mGUISystem-setGUISheet(mEditorGuiSheet); 调用自定义的帧监听器,这样我们可以在需要时访问“mGUIRender”。 void createFrameListener(void) mFrameListener = new GuiFrameListener(mWindow, mCamera, mGUIRenderer); mRoot-addFrameListener(mFrameListener); ;下面是主函数也是程序的主循环,在本教程并不需要你修改这段代码。 #if OGRE_PLATFORM = OGRE_PL

12、ATFORM_WIN32 #define WIN32_LEAN_AND_MEAN #include windows.h INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) #else int main(int argc, char *argv) #endif / Create application object TutorialApplication app; try app.go(); catch( Exception& e ) #if OGRE_PLATFORM = OGRE_PLATFORM_W

13、IN32 MessageBox( NULL, e.getFullDescription().c_str(), An exception has occured!, MB_OK | MB_ICONERROR | MB_TASKMODAL); #else fprintf(stderr, An exception has occured:%sn,e.getFullDescription().c_str(); #endif return 0; 完成后,编译程序能得到一个空的窗口。请关掉程序,继续我们的学习。注意:如果实际操作中出现问题,你可以在应用程序所在文件夹中找到“CEGUI.log”文件分析查找

14、错误 CEGUI是如何工作的本质上CEGUI是通过向窗口添加第二个场景,这个场景是在Ogre的基本渲染队列完成后才渲染的。这个场景仅仅是由一系列3D矩形对象组成的。(也就是两个多边形沿着其边压制到一起)。渲染矩阵是为消除矩形的突兀与歪斜而根据他们的位置建立的。使用这些矩形,添加材质和响应就构成了用户界面(GUI)。一般情况下这是很不错的,因为一个3D的用户界面将会自动的缩放其元素来适应屏幕,并且使用硬件材质过滤。其将会比C+标准的2D用户界面更加快速和漂亮。 “So in one sentence: CEGUI renders a 2D gui using 3D methods and har

15、dware so you dont have to.”zeroskill添加退出按钮首先,我们需要为应用程序添加下面的头文件。本例中是“Push Button” #include 我们要在场景底部添加退出按钮。 CEGUI:PushButton* quitButton = (CEGUI:PushButton*)CEGUI:WindowManager:getSingleton().createWindow (TaharezLook/Button, (CEGUI:utf8*)Quit); mEditorGuiSheet-addChildWindow(quitButton); quitButton-

16、setPosition(CEGUI:Point(0.35f, 0.45f); quitButton-setSize(CEGUI:Size(0.3f, 0.1f); quitButton-setText(Quit);完成后执行程序,一个漂亮的按钮将会出现在屏幕中。但请注意,程序此时仍然不做任何事情,因为我们并没有为其添加响应时间。 如果你编译时遇到了setPosition()和setSize()的调用错误: CEGUI:Window:setPosition: cannot convert parameter 1 from CEGUI:Vector2 to const CEGUI:UVector2

17、 & 将setPosition()和setSize()所在行分别用下面的代码替换: quitButton-setPosition(CEGUI:UVector2(cegui_reldim(0.35f), cegui_reldim( 0.45f) ); quitButton-setSize(CEGUI:UVector2(cegui_reldim(0.35f), cegui_reldim( 0.1f) );响应事件将下面函数添加到TutorialApplication的public:中 void setupEventHandlers(void) CEGUI:WindowManager& wmgr =

18、 CEGUI:WindowManager:getSingleton(); wmgr.getWindow(CEGUI:utf8*)Quit)-subscribeEvent(CEGUI:PushButton:EventClicked, CEGUI:Event:Subscriber (&TutorialApplication:handleQuit, this); bool handleQuit(const CEGUI:EventArgs& e) static_cast(mFrameListener)-requestShutdown(); return true; 重写 GuiFrameListene

19、r 类来响应键盘和鼠标输入 class GuiFrameListener: public ExampleFrameListener, public MouseMotionListener, public MouseListener private: CEGUI:Renderer* mGUIRenderer; bool mShutdownRequested; public: / NB using buffered input GuiFrameListener(RenderWindow* win, Camera* cam, CEGUI:Renderer* renderer) : ExampleFr

20、ameListener(win, cam, true, true), mGUIRenderer(renderer), mShutdownRequested(false) mEventProcessor-addMouseMotionListener(this); mEventProcessor-addMouseListener(this); mEventProcessor-addKeyListener(this); / Tell the frame listener to exit at the end of the next frame void requestShutdown(void) m

21、ShutdownRequested = true; bool frameEnded(const FrameEvent& evt) if (mShutdownRequested) return false; else return ExampleFrameListener:frameEnded(evt); void mouseMoved (MouseEvent *e) CEGUI:System:getSingleton().injectMouseMove( e-getRelX() * mGUIRenderer-getWidth(), e-getRelY() * mGUIRenderer-getH

22、eight(); e-consume(); void mouseDragged (MouseEvent *e) mouseMoved(e); void mousePressed (MouseEvent *e) CEGUI:System:getSingleton().injectMouseButtonDown( convertOgreButtonToCegui(e-getButtonID(); e-consume(); void mouseReleased (MouseEvent *e) CEGUI:System:getSingleton().injectMouseButtonUp( conve

23、rtOgreButtonToCegui(e-getButtonID(); e-consume(); void mouseClicked(MouseEvent* e) void mouseEntered(MouseEvent* e) void mouseExited(MouseEvent* e) void keyPressed(KeyEvent* e) if(e-getKey() = KC_ESCAPE) mShutdownRequested = true; e-consume(); return; CEGUI:System:getSingleton().injectKeyDown(e-getK

24、ey(); CEGUI:System:getSingleton().injectChar(e-getKeyChar(); e-consume(); void keyReleased(KeyEvent* e) CEGUI:System:getSingleton().injectKeyUp(e-getKey(); e-consume(); void keyClicked(KeyEvent* e) / Do nothing e-consume(); ;Ogre 1.4.0 如果你使用的是Ogre 1.4.0 你将会要使用OIS。在Ogre3d中使用OIS的更多细节,请参阅使用OIS并且再看一看基础教

25、程5: class GuiFrameListener: public ExampleFrameListener, public OIS:MouseListener, public OIS:KeyListener private: CEGUI:Renderer* mGUIRenderer; bool mShutdownRequested; public: / NB using buffered input GuiFrameListener(RenderWindow* win, Camera* cam, CEGUI:Renderer* renderer) : ExampleFrameListene

26、r(win, cam, true, true), mGUIRenderer(renderer), mShutdownRequested(false) mMouse-setEventCallback( this ); mKeyboard-setEventCallback( this ); / Tell the frame listener to exit at the end of the next frame void requestShutdown(void) mShutdownRequested = true; bool frameEnded(const FrameEvent& evt)

27、if (mShutdownRequested) return false; else return ExampleFrameListener:frameEnded(evt); bool mouseMoved( const OIS:MouseEvent &e ) using namespace OIS; CEGUI:System:getSingleton().injectMouseMove(e.state.X.rel,e.state.Y.rel); return true; bool mousePressed (const OIS:MouseEvent &e, OIS:MouseButtonID

28、 id) CEGUI:System:getSingleton().injectMouseButtonDown(convertOgreButtonToCegui(id); return true; bool mouseReleased( const OIS:MouseEvent &e, OIS:MouseButtonID id ) CEGUI:System:getSingleton().injectMouseButtonUp(convertOgreButtonToCegui(id); return true; bool keyPressed( const OIS:KeyEvent &e ) if

29、(e.key = OIS:KC_ESCAPE) mShutdownRequested = true; return true; CEGUI:System:getSingleton().injectKeyDown(e.key); CEGUI:System:getSingleton().injectChar(e.text); return true; bool keyReleased( const OIS:KeyEvent &e ) CEGUI:System:getSingleton().injectKeyUp(e.key); return true; ;在include语句后GuiFrameListener声明前添加下面代码 CEGUI:MouseButton conv

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1