在DirectX 3D中使用CEGUI

一、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版本)

没有更多推荐了,返回首页