zoukankan      html  css  js  c++  java
  • 游戏UI设计(1.3)Keyboard&Mouse之封装

    1.3 Keyboard & Mouse之封装CXKeyboard & CXMouse

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

    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();

    };

    CXMouseSurface的封装

    为了能制作出动画效果的光标,因此需要一个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);

    };

     

     

  • 相关阅读:
    yellow joke 3
    JavaScript下拉菜单(1)
    Java程序员面试三十二问
    Oracle里时间的应用
    ·Java读取properties文件
    Web 窗体用户控件
    怎么解决层被flash挡住的问题?
    自定义控件
    关于mysql中的DDL,DML,DQL和DCL
    自定义一个简单连接池以及常见连接池的使用
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333301.html
Copyright © 2011-2022 走看看