【游戏程序设计】Direct 3D 图形用户界面

运行结果:

D3DGUIClass.h:

#pragma once
//====================================================
//一个游戏GUI系统类的头文件
//====================================================

#include <d3d9.h>
#include <d3dx9.h>
#include "D3DUtil.h"

//所支持的空间类型宏
#define UGP_GUI_STATICTEXT 1
#define UGP_GUI_BUTTON 2
#define UGP_GUI_BACKGROUND 3
//鼠标按键状态宏
#define UGP_BUTTON_UP 1
#define UGP_BUTTON_DOWN 2
#define UGP_BUTTON_OVER 3
//设置一些GUI用到的控件ID
#define STATIC_TEXT_ID 1
#define BUTTON_START_ID 2
#define BUTTON_LOAD_ID 3
#define BUTTON_OPTION_ID 4
#define BUTTON_QUIT_ID 5
#define BUTTON_BACK_ID 6
#define BUTTON_LEVEL_1_ID 7
//菜单页面的宏定义
#define GUI_MAIN_SCREEN 1
#define GUI_START_SCREEN 2
#define GUI_LOAD_SCREEN 3
#define GUI_OPTION_SCREEN 4

//FVF灵活顶点格式的结构体
struct GUIVERTEX
{
	float x, y, z;
	float rhw;
	unsigned long color;
	float u, v;
};
#define D3DFVF_GUIVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
//控件属性结构体
struct GUICONTROL
{
	int m_id;																	//控件id
	int m_type;																	//操作类型
	unsigned long m_color;														//控件颜色
	int m_listID;																//如果是文字的话,表示字体,否则表示顶点缓存
	float m_xPos;																//控件的起始位置
	float m_yPos; 
	float m_width;																//控件的宽度与高度
	float m_height;
	wchar_t *m_text;															//文字内容
	LPDIRECT3DTEXTURE9 m_Background;											//控件背景的填充图像
	LPDIRECT3DTEXTURE9 m_upTex, m_downTex, m_overTex;							//存放按钮弹起,按下和鼠标经过时的纹理图
};

class D3DGUIClass
{
private:
	LPDIRECT3DDEVICE9 m_pd3dDevice;												//D3D设备对象
	LPD3DXFONT *m_pFonts;														//D3D字体对象
	LPDIRECT3DVERTEXBUFFER9 *m_pVertexBuffers;									//顶点缓存对象指针
	GUICONTROL *m_pControls;													//控件对象
	GUICONTROL m_Background;													//背景图对象
	LPDIRECT3DVERTEXBUFFER9 m_pBackgroundBuffer;								//背景图缓冲区对象
	bool m_bIsBackgroundUsed;													//一个标识,用于标识是否用了背景
	int m_nTotalControlNum;														//控件数目计数器
	int m_nTotalFontNum;														//字体数目计数器
	int m_nTotalBufferNum;														//缓冲区数目计数器
	int m_nWindowHeight;														//窗口宽度
	int m_nWindowWidth;															//窗口高度
public:
	D3DGUIClass(LPDIRECT3DDEVICE9 device, int w, int h);						//构造函数
	~D3DGUIClass(void);															//析构函数
	LPDIRECT3DDEVICE9 GetD3DDevice() {return m_pd3dDevice;}						//返回D3D设备对象的函数
	GUICONTROL *GetBackground() {return &m_Background;}							//返回背景的函数 
	LPDIRECT3DVERTEXBUFFER9 GetBackgroundBuffer() {return m_pBackgroundBuffer;} //返回背景缓冲区对象的函数
	int GetTotalFontNum() {return m_nTotalFontNum;}								//返回所有字体数目的函数
	int GetTotalControlNum() {return m_nTotalControlNum;}						//返回所有控件数目的函数
	int GetTotalBufferNun() {return m_nTotalBufferNum;}							//返回总的缓冲区数目的函数
	int GetWindowWidth() {return m_nWindowWidth;}								//返回窗口宽度的函数
	int GetWindowHeight() {return m_nWindowHeight;}								//返回窗口高度的函数
	bool IsBackgroundUsed() {return m_bIsBackgroundUsed;}						//返回背景是否在使用的bool值的函数
	void SetWindowSize(int w, int h) {m_nWindowWidth = w; m_nWindowHeight = h;} //设置窗口宽度和高度的函数
	LPD3DXFONT GetFont(int id)													//返回字体ID函数
	{
		if(id < 0 || id >= m_nTotalFontNum)
			return NULL;
		return m_pFonts[id];
	}

	GUICONTROL *GetGUIControl(int id)											//返回GUI控件函数
	{
		if(id < 0 || id >= m_nTotalControlNum)
			return NULL;
		return &m_pControls[id];
	}

	LPDIRECT3DVERTEXBUFFER9 GetVertexBuffer(int id)								//返回顶点缓存ID函数
	{
		if(id < 0 || id >= m_nTotalBufferNum)
			return NULL;
		return m_pVertexBuffers[id];
	}

	HRESULT CreateTextFont(wchar_t *fontName, int size);						//字体创建函数
	HRESULT AddBackground(wchar_t *filename);									//GUI背景添加函数
	void AddStaticText(int id, wchar_t *text, float x, float y, unsigned long color, int fontID);					//添加静态文本
	HRESULT AddButton(int id, float x, float y, wchar_t *up, wchar_t *over, wchar_t *down);							//添加按钮函数
};

void ProcessGUI(D3DGUIClass *gui, bool LMBDown, int MouseX, int MouseY, void (*funcPtr)(int id, int state));		//回调函数

D3DGUIClass.cpp:

//====================================================
//一个游戏GUI系统的类的源文件
//====================================================
#include "D3DGUIClass.h"
//-----------------------------------------------------------------------------
//构造函数
//-----------------------------------------------------------------------------
D3DGUIClass::D3DGUIClass(LPDIRECT3DDEVICE9 device, int w, int h)
{
	m_pd3dDevice = device;
	m_nWindowWidth = w;
	m_nWindowHeight = h;
	m_pFonts = NULL;
	m_pControls = NULL;
	m_pVertexBuffers = NULL;
	memset(&m_Background, 0, sizeof(m_Background)); 
	m_bIsBackgroundUsed = false;
	m_nTotalFontNum = 0;
	m_nTotalControlNum = 0;
	m_nTotalBufferNum = 0;
	m_pBackgroundBuffer = NULL;
}
//-----------------------------------------------------------------------------
//析构函数
//-----------------------------------------------------------------------------
D3DGUIClass::~D3DGUIClass(void)
{
	for(int i = 0; i < m_nTotalFontNum; ++i)
		SAFE_RELEASE(m_pFonts[i]);
	SAFE_DELETE_ARRAY(m_pFonts);
	for(int i = 0; i < m_nTotalControlNum; ++i)
	{
		SAFE_DELETE_ARRAY(m_pControls[i].m_text);
		SAFE_RELEASE(m_pControls[i].m_Background);
		SAFE_RELEASE(m_pControls[i].m_upTex);
		SAFE_RELEASE(m_pControls[i].m_downTex);
		SAFE_RELEASE(m_pControls[i].m_overTex);
	}
	SAFE_DELETE_ARRAY(m_pControls);
	for(int i = 0; i < m_nTotalBufferNum; ++i)
		SAFE_RELEASE(m_pVertexBuffers[i]);
	SAFE_DELETE_ARRAY(m_pVertexBuffers);
	SAFE_RELEASE(m_Background.m_Background);
	SAFE_RELEASE(m_pBackgroundBuffer);
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值