游戏UI设计

1.1 Surfaces之封装CXSurface

[http://blog.csdn.net/mythma]

1 Surfaces 是什么:
       通俗的讲surfaces就是一个二维的矩形平面。在DX9中,与其对应的com接口为IDirect3DSurface9,LPDIRECT3DSURFACE9。
2 Surfaces 的作用:
       作为一个矩形平面,surfaces用来在屏幕上显示平面图象,即从文件中读取图象数据呈现给用户。
3 IDirect3DSurface9 的使用一般过程:
声明:                LPDIRECT3DSURFACE9
创建:                CreateOffscreenPlainSurface(…)
获取图象信息: D3DXGetImageInfoFromFile(…)
装载到surfaces中: D3DXLoadSurfaceFromFile(…)
获取back buffer地址: GetBackBuffer(…)
显示:                UpdateSurface(…)
释放内存                          Release()
 
       代码段如下:
       LPDIRECT3DSURFACE9 g_Surface =NULL;
         D3DXIMAGE_INFO Info;
D3DXGetImageInfoFromFile ("D:/image.jpg", &Info);
g_pd3dDevice -> CreateOffscreenPlainSurface (Info.Width, Info.Height,
Info.Format, &g_Surface, NULL);
D3DXLoadSurfaceFromFile (g_Surface, NULL, NULL, "D:/image.jpg", NULL,
D3DX_FILTER_NONE, 0xFF000000, NULL);
         //--------------------------------------------------------------------------------------------------
LPDIRECT3DSURFACE9 BackBuffer = NULL;
g_pd3dDevice- > GetBackBuffer (0,0,D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
g_pd3dDevice -> UpdateSurface (g_Surface, NULL, BackBuffer, NULL);
if(BackBuffer != NULL)
BackBuffer-> Release ();
         //---------------------------------------------------------------------------------------------------
if(g_Surface!= NULL)
g_Surface -> Release ();
 
由上述过程可以看到, IDirect3DSurface9的使用虽然不十分复杂,但有点不方便        ——创建和释放总要成对出现,使用过程中还穿插着LPDIRECT3DDEVICE9接口。这些若用一个类封装起来,使用就要方便的多。
4 、如何封装:
       按照 surfaces的功能,创建它就用来显示图象。因此要有读取图象的接口和显示图象的接口。又要与LPDIRECT3DDEVICE9设备接口关联,因此需要一个设置设备的接口。如下所示:
1 声明及释放
声明:            LPDIRECT3DSURFACE9
释放内存                 Release ()
2 、关联图像: LoadFromFile
获取图象信息:     D3DXGetImageInfoFromFile (…)
创建:            CreateOffscreenPlainSurface(…)
装载到 surfaces 中: D3DXLoadSurfaceFromFile(…)
3 、显示 图象 Render
获取缓存地址:     GetBackBuffer(…)
显示:            UpdateSurface(…)
       4 、关联设备接口        SetDevice
 
所以CXSurface的定义如下:
class CXSurface
{
protected:
LPDIRECT3DSURFACE9 m_Surface ;
LPDIRECT3DSURFACE9 m_BackBuffer ;              //Back buffer
LPDIRECT3DDEVICE9 m_pDevice ;           //Direct3D 的设备指针
public:
CXSurface (LPDIRECT3DDEVICE9 pDevice);
~CXSurface ();
HRESULT LoadFromFile(LPCSTR Path);
void Render(void);
};
 
 
1.2 Textures & Sprite 封装CXTexture & CXSprite
1、 何为Textures
Textures是在屏幕上显示的平面图形,它能够提供比 surface 更多的图形处理效果——移动、缩放、旋转及作为纹理皮肤粘贴在3D模型上。在Direct3D中,其封装的接口为IDirect3DTexture9
 
2、 何为Sprite
IDirect3DTexture9从文件中读取纹理数据,但由于Textures不能直接复制到 back buffer,因此在屏幕上绘制Textures之前,需要另一个接口——ID3DXSprite(精灵)。ID3DXSprite能够把若干个Textures 复制给back buffer,因此需要ID3DXSprite的一个实例就可以绘制所有的纹理
 
所以,IDirect3DTexture9用来存放程序所需的纹理,但它本身又不能绘制纹理,需要借助接口ID3DXSprite
 
3、 IDirect3DTexture9ID3DXSprite使用过程
定义:             ~
创建:                   D3DXCreateTextureFromFile
D3DXCreateSprite
   创建变换矩阵:       D3DXMatrixTransformation2D
   变换:                  SetTransform
   绘制图象:              Draw
   释放内存:        ~
 
代码如下:
D3DXCreateTextureFromFile(g_pd3dDevice, "c://image.bmp”, &g_Texture);
D3DXCreateSprite(g_pd3dDevice, &g_Sprite);
//--------------------------------------------------------------------------
            D3DXVECTOR2 Translation;
            Translation.x = 500;
            Translation.y = 500;
            D3DXVECTOR2 Scaling;
            Scaling.x = 1.0;f
            Scaling.y = 1.0f;
            D3DXMATRIX Mat;
            D3DXMatrixTransformation2D(&Mat, NULL, 0, &Scaling, NULL, 0, &
            Translation);
            g_Sprite->Begin(0);
            g_Sprite->SetTransform(&
            g_Sprite->Draw(g_Texture,
            g_Sprite->End();
 
4、 如何封装
从以上的基本过程可以看到,CXTexture需要完成的功能:提供与LPDIRECT3DDEVICE9的接口,与纹理文件文件关联,对纹理进行处理(缩放、旋转……)。
class CXTexture
{
protected:
            LPDIRECT3DTEXTURE9 m_Texture;
            LPDIRECT3DDEVICE9 m_pDevice;
            D3DXVECTOR2 m_RotationCenter;
            D3DXVECTOR2 m_Translation;
            D3DXVECTOR2 m_Scaling;
            FLOAT m_Rotation;
            RECT m_SrcRect;
public:
            CXTexture(LPDIRECT3DDEVICE9 pDevice);
            ~CXTexture();
            LPDIRECT3DTEXTURE9 GetTexture() const {return m_Texture;}
            void SetTexture(LPDIRECT3DTEXTURE9 Texture) const {m_Texture = Texture;}
            LPDIRECT3DDEVICE9 GetDevice() const {return m_pDevice;}
            void SetDevice(LPDIRECT3DDEVICE9 pDevice) const {m_pDevice = pDevice;}
            D3DXVECTOR2 GetRotationCenter() const {return m_RotationCenter;}
            void SetRotationCenter(D3DXVECTOR2 RotationCenter) {m_RotationCenter =
RotationCenter;}
            D3DXVECTOR2 GetTranslation() const {return m_Translation;}
            void SetTranslation (D3DXVECTOR2 Translation) const {m_Translation =
Translation;}
            D3DXVECTOR2 GetScaling() const {return m_Scaling;}
            void SetScaling(D3DXVECTOR2 Scaling) const {m_Scaling = Scaling;}
            FLOAT GetRotation() const {return m_Rotation;}
            void SetRotation (FLOAT Rotation) const {m_Rotation = Rotation;}
            RECT GetRect() const {return m_SrcRect;}
            void SetRect(RECT SrcRect) const {m_SrcRect = SrcRect;}
            HRESULT LoadFromFile(char* Path);
};
 
CXSprite的主要功能就是在屏幕上显示 CXTexture,因此需要有与 LPDIRECT3DDEVICE9 接口和 CXTexture连接的函数。
class CXSprite
{
protected:
            LPD3DXSPRITE m_Sprite;
            LPDIRECT3DDEVICE9 m_pDevice;
public:
            CXSprite (LPDIRECT3DDEVICE9 pDevice);
            ~CXSprite ();
            LPD3DXSPRITE GetSprite() const {return m_Sprite;}
            void SetSprite(LPD3DXSPRITE Sprite) const {m_Sprite = Sprite;}
            LPDIRECT3DDEVICE9 GetDevice() const {return m_pDevice;}
            void SetDevice(LPDIRECT3DDEVICE9 pDevice) const {m_pDevice = pDevice;}
            HRESULT DrawTexture(CXTexture* Texture);
};
 
 
 
1.3 Keyboard & Mouse 之封装 CXKeyboard & CXMouse
 
1、  何为 Keyboard & Mouse
“地球人都知道”。DX9提供的接口 IDirectInputDevice8
 
2、  二者的功能
Keyboard:读取键盘的按键信息
Mouse:读取鼠标的按键、位置信息,设置光标属性(如用图片表示光标)。
 
3、  使用过程
创建 IDirectInput8 对象                     DirectInput8Create
创建 IDirectInput8 设备(键盘、鼠标等)CreateDevice
设置设备属性                                    SetCooperativeLevel
SetDataFormat
获取设备使用权                    Acquire
读取设备传入的数据                            GetDeviceState
释放设备及 IDirectInput8                    Release
 
设置鼠标光标过程
        创建光标图片资源:                      参照surfaces
        设置光标为指定的图片              SetCursorProperties
        设置光标的初始位置                 SetCursorPosition
        显示光标                        ShowCursor
程序段如下
LPDIRECTINPUT8 g_lpDI;
LPDIRECTINPUTDEVICE8 g_Keyboard;
LPDIRECTINPUTDEVICE8 g_Mouse
//========================================================
HRESULT Result = DirectInput8Create(g_hInst, DIRECTINPUT_VERSION,
IID_IDirectInput8, (void**)&g_lpDI, NULL);
if(SUCCEEDED(Result))
{
            // 创建键盘设备
            Result = g_lpDI->CreateDevice(GUID_SysKeyboard, &g_lpDIDevice, NULL);
            if(SUCCEEDED(Result))
            {
                        g_lpDIDevice->SetCooperativeLevel(g_hWnd, DISCL_FOREGROUND |
DISCL_NONEXCLUSIVE);
                        g_lpDIDevice->SetDataFormat(&c_dfDIKeyboard);             }
}
//-------------------------------------------------------------------------------------------
// 获取按键信息
if(SUCCEEDED( g_Keyboard->Acquire() )) //Acquire the device
{
char KeyState[256];
g_Keyboard->GetDeviceState(sizeof(KeyState),(LPVOID)&KeyState);
// 根据 KeyState 返回的数据就可以判断按下何键
}
//====================================================
// 创建鼠标
g_lpDI->CreateDevice( GUID_SysMouse , &g_Mouse , NULL);
g_Mouse ->SetDataFormat( &c_dfDIMouse );
g_Mouse ->SetCooperativeLevel(g_hWnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
//------------------------------------------------------------------------
// 设置鼠标光标
// 获取光标图片
D3DXIMAGE_INFO ImageInfo;
D3DXGetImageInfoFromFile("C://Cursor.jpg”, &ImageInfo);
g_pd3dDevice->CreateOffscreenPlainSurface(ImageInfo.Width,
ImageInfo.Height,
ImageInfo.Format,
D3DPOOL_DEFAULT,
&g_MouseCursor,
NULL);
D3DXLoadSurfaceFromFile(g_MouseCursor, NULL, NULL, ("C://Cursor.jpg”,
NULL, D3DX_FILTER_NONE, 0xFF000000, NULL);
// 设置成指定的光标
g_pd3dDevice->SetCursorProperties(0,0, g_MouseCursor);
// 初试位置
g_pd3dDevice->SetCursorPosition(0,0,D3DCURSOR_IMMEDIATE_UPDATE);
// 显示光标
g_pd3dDevice->ShowCursor(true);
//-------------------------------------------------------------------------
// 获取鼠标信息
if(SUCCEEDED( g_Mouse->Acquire() ))
{
DIMOUSESTATE State;
g_Mouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&State);
// 信息保存在 State 中。
}
//==============================================
// 释放设备
if(g_lpDI != NULL)
g_lpDI->Release();
 
4、  封装
CXKeyboard 的封装
class CXKeyboard
{
private:
            LPDIRECTINPUTDEVICE8 m_pDevice;
            char m_KeyState[256];
public:
            CXKeyboard (LPDIRECTINPUT8 pInput, HWND hWnd);
            ~ CXKeyboard();
            bool IsKeyPressed(int Key);
            HRESULT Update();
};
CXMouse Surface 的封装
为了能制作出动画效果的光标,因此需要一个surfaces列表,因此从CXSurface继承一个CXMouseSurface类,使之能够操作多个图片。
class CXMouseSurface : public CXSurface
{
private:
            CXMouseSurface* m_pNext;
            int MouseSurfaceType;
            UINT HotSpotX;
            UINT HotSpotY;
public:
            CXMouseSurface* GetNext() {return m_pNext;}
            void SetNext(CXMouseSurface* Surf) {m_pNext = Surf;}
            int GetSurfaceType() {return MouseSurfaceType;}
            void SetSurfaceType(int Type) {MouseSurfaceType = Type;}
            UINT GetHotSpotX() {return HotSpotX;}
            UINT GetHotSpotY() {return HotSpotY;}
            void SetHotSpotX (UINT X) {HotSpotX = X;}
            void SetHotSpotY (UINT Y) {HotSpotY = Y;}
            CXMouseSurface(LPDIRECT3DDEVICE9 pDevice) : CXSurface(pDevice)
            {m_pNext = NULL;}
            CXMouseSurface() : CXSurface() {m_pNext = NULL;}
};
CXMouse 的封装
class CXMouse
{
private:
            CXMouseSurface* m_Surface; // 指向光标列表
            CXMouseSurface* m_CurrentCursorSurface; // 当前光标
            LPDIRECTINPUTDEVICE8 m_pDevice;
            LPDIRECT3DDEVICE9 m_p3DDevice;
            DIMOUSESTATE m_State;
            LONG m_iX;
            LONG m_iY;
public:
            CXMouse (LPDIRECT3DDEVICE9 pDevice, LPDIRECTINPUT8 pInput, HWND hWnd,
bool Exclusive);
            ~ CXMouse();
            HRESULT Update();
            LONG GetXPos();
            LONG GetYPos();
            bool IsButtonPressed(int Button);
            HRESULT SetCursorImage();
            HRESULT SetMouseCursor(char* FilePath, UINT HotSpotX, UINT HotSpotY,
int Type);
            void AddCursorSurface(CXMouseSurface* Surface);
            CXMouseSurface* GetFirstSurface() {return m_Surface;}
            bool SetCursor(int Type);
            CXMouseSurface* GetCurrentCursor() {return m_CurrentCursorSurface;}
            void SetCurrentCursor(CXMouseSurface* Surface)
{m_CurrentCursorSurface = Surface;}
            void SetCursorPosition(int X, int Y);
            HRESULT SetCursorVisible(bool Show);
};
 
 
 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
 本课程总体分为七大部分:一: UI框架设计理念       整体简单介绍即将带领大家开发的UI框架的功能设计、核心类设计等,让大家有一个整体、大概的了解。二: 简单版本开发      为了简化框架学习的难度,先带领大家开发一个类似Hello World 的简单版本,以期达到学员快速理解、与减轻学习框架核心思想难度的目的。三: 窗体层级管理       层级管理是UI框架的重点与难点,本章节使用了大量时间,对核心开发理念、与具体实现编码,进行详细的讲解。四: 模态窗体管理     游戏项目中对于重要信息,经常会出现“弹出窗口”。对于此类UI界面,我们设计了多种(模态)窗体的属性,以**限度灵活的适用于不同游戏项目(包括VR/AR)的开发需求五: 日志调试与配置管理    游戏项目开发经常会遇到PC端运行良好,发布移动端(IOS/Android/平板等)出现崩溃、死机、数值与预期不同的调试难题。本章节从高级日志的开发讲解到基于Json 的配置管理的应用。使得学员学会对于经常需要改变数值(或者改变需求),使用基于“低耦合”思想,配合“配置管理”的思想来应对灵活多变的需求开发。六: 消息传递中心      Unity游戏项目中存在多种数值(消息)的传递方式,但是大多数的消息传递方式,耦合性太高造成项目模块的“复用性”降低。本章节讲解采用“消息中心”的思想,开发类似“发邮件”、“收邮件”的机制,来彻底杜绝脚本之间(游戏对象、UI窗体之间)强耦合现象。七: 资源国际化技术     目前国内大多数中大型游戏(VR/AR)公司,都要进行全球发布与营销,如何解决游戏项目中资源的国际化问题,对于开发人员尤其重要。通过本章节学习,结合笔者经验给出基于Json 可配置原理的解决方案。      温馨提示: 进一步详细了解本课程大纲学员,请务必围观课程的第1节“总体介绍”,谢谢大家! 课程温馨提示:      说明1:  本课程《UI界面框架设计》开发环境如下:               Win8.1(Win10)+Unity5.5.1版本+VS2012+UnityVS(支持5.x的版本)插件+Resharp8.0插件。 一、热更新系列(技术含量:中高级):A:《lua热更新技术中级篇》https://edu.csdn.net/course/detail/27087B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136二:框架设计系列(技术含量:中级): A:《游戏UI界面框架设计系列视频课程》https://edu.csdn.net/course/detail/27142B:《Unity客户端框架设计PureMVC篇视频课程(上)》https://edu.csdn.net/course/detail/27172C:《Unity客户端框架设计PureMVC篇视频课程(下)》https://edu.csdn.net/course/detail/27173D:《AssetBundle框架设计_框架篇视频课程》https://edu.csdn.net/course/detail/27169三、Unity脚本从入门到精通(技术含量:初级)A:《C# For Unity系列之入门篇》https://edu.csdn.net/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.csdn.net/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.csdn.net/course/detail/24422D:《C# For Unity系列之进阶篇》https://edu.csdn.net/course/detail/24465四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)A:《虚拟现实之汽车仿真模拟系统 》https://edu.csdn.net/course/detail/26618五、Unity基础课程系列(技术含量:初级) A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》 https://edu.csdn.net/course/detail/24643B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》https://edu.csdn.net/course/detail/24645 C:《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096六、Unity ARPG课程(技术含量:初中级):A:《MMOARPG地下守护神_单机版实战视频课程(上部)》https://edu.csdn.net/course/detail/24965B:《MMOARPG地下守护神_单机版实战视频课程(中部)》https://edu.csdn.net/course/detail/24968C:《MMOARPG地下守护神_单机版实战视频课程(下部)》https://edu.csdn.net/course/detail/24979 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值