hge source explor 0x6 input module

Input Module

  封装与输入相关的属性,函数。

input.h

struct CInputEventList
{
    GEInputEvent        event;
    CInputEventList*    next;
};

class Input
{
public:
    Input();

    void    GetMousePos(float* x, float* y);
    void    SetMousePos(float x, float y);
    int        GetMouseWheel();
    bool    IsMouseOver();
    bool    KeyDown(int key);
    bool    KeyUp(int key);
    bool    GetKeyState(int key);
    char*    GetKeyName(int key);
    int        GetKey();
    int        GetChar();
    bool    GetEvent(GEInputEvent* event);

    void    UpdateMouse();
    void    Init();
    void    ClearQueue();
    void    BuildEvent(int type, int key, int scan, int flags, int x, int y);

public:
    int        VKey;
    int        Char;
    int        Zpos;
    float    Xpos;
    float    Ypos;
    bool    bMouseOver;
    bool    bCaptured;
    char    keyz[256];

    CInputEventList*    queue;

};

class Input


input.cpp

//************* 输入系统内部接口 *****************

Input::Input()
{
    queue = 0;
    Char = VKey = Zpos = 0;
    Xpos = Ypos = 0;
    bMouseOver = false;
    bCaptured = false;

    // keyz保存着现在键盘的信息,在同一帧可以实现多按键
    memset(&keyz, 0, sizeof(keyz));
}

void Input::Init()
{
    POINT    pt;
    GetCursorPos(&pt);
    ScreenToClient(pge->win->hwnd, &pt);
    Xpos = (float)pt.x;
    Ypos = (float)pt.y;

}

// 创建输入事件
void Input::BuildEvent(int type, int key, int scan, int flags, int x, int y)
{
    CInputEventList    *last, *eptr = new CInputEventList;
    unsigned char kbstate[256];
    POINT pt;

    eptr->event.type = type;
    eptr->event.chr = 0;
    pt.x = x;    pt.y = y;

    GetKeyboardState(kbstate);

    if (type == INPUT_KEYDOWN)
    {
        if ((flags&GEINP_REPEAT) == 0)    keyz[key] |= 1;
        ToAscii(key, scan, kbstate, (unsigned short*)&eptr->event.chr, 0);
    }

    if (type == INPUT_KEYUP)
    {
        keyz[key] |= 2;
        ToAscii(key, scan, kbstate, (unsigned short*)&eptr->event.chr, 0);
    }

    if (type == INPUT_MOUSEWHEEL)
    {
        eptr->event.key = 0;    eptr->event.wheel = key;
        ScreenToClient(pge->win->hwnd, &pt);        // 这里把位置设为(0,0),其实可以不用
    }
    else
    {
        eptr->event.key = key;    eptr->event.wheel = 0;
    }

    if (type == INPUT_MBUTTONDOWN)            // 鼠标按键按下,要设置成焦点
    {
        keyz[key] |= 1;
        SetCapture(pge->win->hwnd);
        bCaptured = true;
    }

    if (type == INPUT_MBUTTONUP)            // 鼠标弹起,释放焦点
    {
        keyz[key] |= 2;
        ReleaseCapture();
        SetMousePos(Xpos, Ypos);
        pt.x = (int)Xpos;    pt.y = (int)Ypos;
        bCaptured = false;
    }

    // 检测功能键
    if (kbstate[VK_SHIFT] & 0x80) flags |= GEINP_SHIFT;
    if (kbstate[VK_CONTROL] & 0x80) flags |= GEINP_CTRL;
    if (kbstate[VK_MENU] & 0x80) flags |= GEINP_ALT;
    if (kbstate[VK_CAPITAL] & 0x1) flags |= GEINP_CAPSLOCK;
    if (kbstate[VK_SCROLL] & 0x1) flags |= GEINP_SCROLLLOCK;
    if (kbstate[VK_NUMLOCK] & 0x1) flags |= GEINP_NUMLOCK;

    // 设置输入时间标志
    eptr->event.flags = flags;

    if (pt.x == -1)        // 这里表示非鼠标事件
    {
        eptr->event.x = Xpos;
        eptr->event.y = Ypos;
    }
    else    // 鼠标是否出界判定
    {
        if (pt.x < 0)    pt.x = 0;
        if (pt.y < 0)    pt.y = 0;
        if (pt.x >= pge->win->nScreenWidth)        pt.x = pge->win->nScreenWidth - 1;
        if (pt.y >= pge->win->nScreenHeight)    pt.y = pge->win->nScreenHeight - 1;

        eptr->event.x = (float)pt.x;
        eptr->event.y = (float)pt.y;
    }

    eptr->next = 0;

    // 加入输入事件的队列
    if (!queue)        queue = eptr;
    else
    {
        last = queue;
        while (last->next)    last = last->next;
        last->next = eptr;
    }

    if (eptr->event.type == INPUT_KEYDOWN || eptr->event.type == INPUT_MBUTTONDOWN)
    {
        VKey = eptr->event.key;    Char = eptr->event.chr;
    }
    else if (eptr->event.type == INPUT_MOUSEMOVE)
    {
        Xpos = eptr->event.x;    Ypos = eptr->event.y;
    }
    else if (eptr->event.type == INPUT_MOUSEWHEEL)
    {
        Zpos += eptr->event.wheel;
    }
}

// 获得事件,事件队列的第一件事情
bool Input::GetEvent(GEInputEvent* event)
{
    CInputEventList* eptr;

    if (queue)
    {
        eptr = queue;
        memcpy(event, &eptr->event, sizeof(GEInputEvent));
        queue = eptr->next;
        delete eptr;
        return true;
    }

    return false;
}

void Input::ClearQueue()
{
    CInputEventList    *nexteptr, *eptr = queue;

    memset(&keyz, 0, sizeof(keyz));

    while (eptr)
    {
        nexteptr = eptr->next;
        delete eptr;
        eptr = nexteptr;
    }

    queue = 0;    VKey = 0;    Char = 0;    Zpos = 0;
}

//*********  鼠标 **************

void Input::UpdateMouse()
{
    POINT        pt;
    RECT        rc;

    GetCursorPos(&pt);
    GetClientRect(pge->win->hwnd, &rc);
    MapWindowPoints(pge->win->hwnd, NULL, (LPPOINT)&rc, 2);

    if (bCaptured || (PtInRect(&rc, pt) && WindowFromPoint(pt) == pge->win->hwnd))
        bMouseOver = true;
    else
        bMouseOver = false;
}

void Input::GetMousePos(float* x, float *y)
{
    *x = Xpos;    *y = Ypos;
}

void Input::SetMousePos(float x, float y)
{
    POINT    pt;
    pt.x = (long)x;    pt.y = (long)y;
    ClientToScreen(pge->win->hwnd, &pt);
    SetCursorPos(pt.x, pt.y);
}

int Input::GetMouseWheel()
{
    return Zpos;
}

bool Input::IsMouseOver()
{
    return bMouseOver;
}

//************* 键盘 ******************

bool Input::KeyDown(int key)
{
    return (keyz[key] & 1) != 0;
}

bool Input::KeyUp(int key)
{
    return (keyz[key] & 2) != 0;
}

bool Input::GetKeyState(int key)
{
    return ((::GetKeyState(key) & 0x8000) != 0);        // ::GetKeyState(key) 调用window中的
}

char* Input::GetKeyName(int key)
{
    return KeyNames[key];
}

int Input::GetKey()
{
    return VKey;
}

int Input::GetChar()
{
    return Char;
}

input.cpp



  在主循环中测试输入,如图:

时间: 2024-10-16 11:52:05

hge source explor 0x6 input module的相关文章

hge source explor 0x5 input module

Input Module 前面提到输入事件,那么对输入事件分类,分类如下 /* ** HGE Input Event type constants */ #define INPUT_KEYDOWN 1 #define INPUT_KEYUP 2 #define INPUT_MBUTTONDOWN 3 #define INPUT_MBUTTONUP 4 #define INPUT_MOUSEMOVE 5 #define INPUT_MOUSEWHEEL 6 接下来看每个函数 _InputInit

hge source explor 0x4 input module

Input Module hge中的输入并没有用到Direct Input,在window消息构造输入信息. 对于鼠标和键盘,输入信息用一个结构来处理,hge中的信息事件的结构 /* ** HGE Input Event structure */ struct hgeInputEvent { int type; // event type int key; // key code int flags; // event flags int chr; // character code int w

hge source explor 0x3 windows module

Windows窗口 在这里继续看窗口相关的函数,前面看到的部分能够生成一个窗口.在hge的代码中,我们可以看到别的函数处理窗口相关的事情,当然不是指的消息处理函数. 在hge中消息处理函数是最主要的函数之一,完成了整个游戏的信息输入. 另外的和窗口相关的函数是 graphics.cpp void HGE_Impl::_AdjustWindow() void HGE_Impl::_Resize(int width, int height) 从函数的名字中可以看到都是处理窗口的变化的函数   实现

hge source explor 0xC graphics Ⅲ

这里关于图形模块的内部接口部分 内部调用接口 内部接口主要完成:关于固定流水线的设置:dx的初始化:dx的结束 可以说内部接口已经完成了左右工作,只要进行组合调用即可 _GfxInit() DX的初始化函数 Direct3DCreate8 创建接口 GetAdapterIdentifier 获得设备信息,在这里可以查询设备能够做到什么 PRESENT_PARAMETER 参数的填写 CreateDevice 创建设备 _AdjustWindow 这个函数原来在window模块里已经考虑过,在这里

hge source explor 0x8 timer

Timer 时间部分,在hge中提供对于fps的控制,时间的控制等. 其中会用到的参数有. hge_impl.h // Timer float fTime; float fDeltaTime; DWORD nFixedDelta; int nFPS; DWORD t0, t0fps, dt; int cfps; 在system.cpp中使用到,用来控制帧率 if(dt >= nFixedDelta) { // fDeltaTime = time step in seconds returned

HGE source explor 0x0

本文准备开始HGE游戏引擎的代码阅读,其实我已经阅读完HGE的代码了,这里将准备再重新阅读代码.阅读代码将准备将代码拆开阅读,按每种功能分开来阅读,分别准备如下: 游戏的窗口 对于任意一个程序来说,一个窗口都是必须的,所以游戏的最基本的也是一个窗口.那么我们找到HGE关于游戏窗口的部分,详细了解这部分.(窗口君:我是一切的基础哦.) 游戏的输入信息 对于一个游戏来说,互动也是必须的,既然要互动那玩家的输入必不可少.在这里我们可以看到HGE关于输入的部分,创建输入的事件然后,当然是等处理.(输入君

hge source explor 0xA graphics Ⅰ

Graphics 在这一部分完成初始化DX,并且完成固定流水线,然后在进行渲染. 在这一部分会用到的数据结构和参数有: 参数: D3DPRESENT_PARAMETERS* d3dpp; D3DPRESENT_PARAMETERS d3dppW; D3DPRESENT_PARAMETERS d3dppFS; IDirect3D8* pD3D; IDirect3DDevice8* pD3DDevice; IDirect3DVertexBuffer8* pVB; IDirect3DIndexBuff

hge source explor 0x9 Power &amp; Random &amp; Ini

Power 电源管理部分,会用到的参数为: // Power int nPowerStatus; HMODULE hKrnl32; GetSystemPowerStatusFunc lpfnGetSystemPowerStatus; _InitPowerStatus() 初始化电源信息: LoadLibrary("kernel32.dll") 获得函数GetSystemPowerStatus地址 调用_UpdatePowerStatus void HGE_Impl::_InitPowe

hge source explor 0xB graphics Ⅱ

整个graphics.cpp文件可以分成4个部分:内部接口:纹理相关:渲染对象相关:DX初始化等. Texture & Target 关于纹理的部分: CTextureList struct CTextureList { HTEXTURE tex; int width; int height; CTextureList* next; };   Texture_Create(int width, int height) 创建纹理 D3DXCreateTexture创建一个纹理 HTEXTURE C