三、在DirectX中使用CEGUI
CEGUI是一个跨平台的图形界面库,其平台无关性是通过对平台的封装实现的。在上一节中我们分析了CEGUI的SDK结构,在其渲染子系统中提供了Windows平台上的DirectX8.1/9.0的支持,因此不难推断在自己写的程序中应该可以使用CEGUI。
3.1 CEGUI的资源组织
CEGUI的资源目录为datafiles,其组织情况如下:
- imagesets:各种图片资源(如:皮肤图片等)
- layouts:布局文件(可以利用CEGUILayout得到)
我们主要关注的是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版本)