在DirectX 3D中使用CEGUI 解析

http://blog.csdn.net/Lodger007/article/details/1675141



一、CEGUI简介

    CEGUI,为Crazy Eddie's GUI的缩写,它是一个用C++开发的面向对象的免费界面库,针对游戏开发者,提供了3D环境中的窗口及其部件的图形API。CEGUI在0.4.1之前(包括0.4.1),使用LGPL授权协议,从0.5版本开始则采用了更为宽松的MIT协议。目前使用CEGUI的项目(摘自http://www.cegui.org.uk):


Project Xenocide


BlitzMax


Plant covered GUI
你可以从下面链接得到更多关于CEGUI的知识:
(1)    http://www.cegui.org.uk/wiki/index.php/Main_Page
(2)    http://sourceforge.net/projects/crayzedsgui/
(3)    http://www.cegui.org.uk/wiki/index.php/FAQ


二、CEGUI结构概览
    从上一小节中给出的链接,你可以下载CEGUI的SDK。该SDK以DLL的形式提供,下面简单介绍一下这些DLL的作用及分类:

三、在DirectX中使用CEGUI
    CEGUI是一个跨平台的图形界面库,其平台无关性是通过对平台的封装实现的。在上一节中我们分析了CEGUI的SDK结构,在其渲染子系统中提供了Windows平台上的DirectX8.1/9.0的支持,因此不难推断在自己写的程序中应该可以使用CEGUI。
3.1 CEGUI的资源组织
    CEGUI的资源目录为datafiles,其组织情况如下:
  • configs:资源配置文件
  • fonts:字体资源
  • imagesets:各种图片资源(如:皮肤图片等)
  • layouts:布局文件(可以利用CEGUILayout得到)
  • lookfeel:皮肤配置文件
  • lua_scripts:Lua脚本文件
  • schemes:xml配置文件的scheme
    我们主要关注的是layouts中的文件,这些xml文件可以由CEGUI的附带界面设计工具CEGUILayout得到。如下图所示:


3.2 程序中使用CEGUI
    在这一小节中,我将使用MFC+DirectX9.0c+CEGUI创建一个DEMO,下面仅列出一些关键代码,在文章最后给出了DEMO的源代码下载链接。如果你对在MFC或者Win32 SDK中使用DirectX 3D还不熟悉,可以参考
Direct3D入门之框架的搭建一文。
(1)    创建DirectX 3D设备m_d3dDevice;
(2)    创建CEGUI::Render对象:
    m_pCEGUIRender = new CEGUI::DirectX9Renderer(m_d3dDevice , 0);    
(3)    创建CEGUI::System对象:
    new CEGUI::System(m_pCEGUIRender);
(4)    渲染CEGUI:
    if(m_d3dDevice) // Only use Device methods if we have a valid device.
    {
        //
        // Draw the Scene:
        //
        m_d3dDevice->BeginScene();
        m_d3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(50 , 0 , 50) , 1.0f, 0);
            /// Render Meshs
            DrawMesh();
            /// Render CEGUI
            CEGUI::System::getSingleton().renderGUI();

        m_d3dDevice->EndScene();
        m_d3dDevice->Present(0, 0, 0, 0);
    }
(
5)    需要引入的头文件
#include <CEGUI.h>
#include <CEGUIDefaultResourceProvider.h>
(6)    需要的引入库
CEGUIBase_d.lib(Debug版本)
DirectX9GUIRenderer_d.lib(Debug版本)
(7)    在程序中设置默认的资源及其路径
    必须设置资源(也就是datafiles)的路径,不然系统运行时就会出现找不到资源的异常。代码如下所示:
    /// 初始化CEGUI的资源缺省路径
    CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>
        (CEGUI::System::getSingleton().getResourceProvider());
    rp->setResourceGroupDirectory("schemes", "../datafiles/schemes/");
    rp->setResourceGroupDirectory("imagesets", "../datafiles/imagesets/");
    rp->setResourceGroupDirectory("fonts", "../datafiles/fonts/");
    rp->setResourceGroupDirectory("layouts", "../datafiles/layouts/");
    rp->setResourceGroupDirectory("looknfeels", "../datafiles/looknfeel/");
    rp->setResourceGroupDirectory("lua_scripts", "../datafiles/lua_scripts/");///< 如果没用Lua脚本就将该行注释掉
    /// 设置使用的缺省资源
    CEGUI::Imageset::setDefaultResourceGroup("imagesets");
    CEGUI::Font::setDefaultResourceGroup("fonts");
    CEGUI::Scheme::setDefaultResourceGroup("schemes");
    CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
    CEGUI::WindowManager::setDefaultResourceGroup("layouts");
    CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");///< 如果没用Lua脚本就将该行注释掉
    注意:这样设置的一个前提是datafiles存在于项目根目录下。
(8)    恢复CEGUI改变的渲染状态
    通过分析CEGUI的源代码得知,CEGUI在渲染时会改变某些渲染状态,特别是与深度有关的状态,所以必须在渲染三维物体之前打开这些状态:
    m_d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    m_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

注意:
1、本项目是用vs2003开发,使用DirectX9.0c August版本,CEGUI SDK 0.5.0b-vc71。
2、将layout下的GameGUI.layout文件copy至CEGUI SDK的datafiles/layouts下
3、本项目只需要CEGUIBase_d.dll、CEGUIExpatParser_d.dll、CEGUIFalagardWRBase_d.dll、DirectX9GUIRender_d.dll(Debug版本)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CEGUI的详细笔记和文档,学习游戏编程的朋友一定要看看 第1章 CEGUI的简介 - 5 - 1.1CEGUI历史和本书使用的版本 - 5 - 1.2 CEGUI的编译和例子介绍 - 5 - 1.2.1CEGUI源代码的简介 - 5 - 1.2.2CEGUI源代码编译 - 7 - 1.3 CEGUI官方编辑器的介绍 - 10 - 1.3.1 CEGUI布局编辑器 - 10 - 1.3.2 图像集编辑器 - 12 - 1.4 CEGUI总体架构 - 13 - 第2章 CEGUI事件系统和属性系统 - 15 - 2.1 CEGUI的事件系统 - 16 - 2.2 CEGUI的属性系统 - 29 - 2.3 属性事件与布局文件 - 32 - 第3章 CEGUI基类的实现 - 39 - 3.1 窗口设计原理 - 39 - 3.2 Window类 - 40 - 3.2.1 Window类的继承关系以及与其相关的函数。 - 40 - 3.2.2 窗口的组织结构 - 41 - 3.2.3 窗口位置和大小 - 45 - 3.2.4窗口渲染 - 51 - 3.2.5 事件响应与处理 - 59 - 3.2.6 窗口状态 - 60 - 3.2.7 窗口与输入系统 - 61 - 3.2.8 窗口的其他功能 - 63 - 3.3 窗口类厂和类厂管理 - 64 - 3.3.1 窗口的类厂和类厂管理 - 64 - 3.3.2 渲染窗口的类厂和类厂管理 - 72 - 3.4 窗口管理系统 - 76 - 第4章 CEGUI核心控制体系 - 80 - 4.1 系统控制 - 80 - 4.1.1 系统变量 - 80 - 4.1.2 初始化和退出流程 - 82 - 4.1.3 输入系统的事件派遣流程 - 87 - 4.2 资源管理 - 96 - 4.2.1资源管理模式 - 96 - 4.2.2 图像集 - 102 - 4.3 系统接口 - 106 - 4.3.1 脚本接口 - 107 - 4.3.2 XML相关接口 - 107 - 4.3.3 图像解码接口 - 108 - 4.3.4 资源提供接口 - 109 - 4.4渲染机制 - 109 - 第5章 CEGUI应用程序框架 - 118 - 5.1 OpenGL程序框架 - 118 - 5.1.1 WIN32应用程序框架 - 118 - 5.1.2 OpenGL应用程序框架 - 122 - 5.1.3 CEGUI应用程序框架 - 124 - 5.2 CEGUI例子程序 - 125 - 5.2.1 加载资源和创建窗口 - 126 - 5.2.2 窗口的逻辑处理 - 127 - 第6章 外观系统 - 131 - .........

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值