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

  在引擎中初始化鼠标和键盘信息,在引擎 的初始化过程(构造函数)中会遇到(system.cpp:hge_impl)。


void HGE_Impl::_InputInit()
{
    POINT    pt;
    GetCursorPos(&pt);
    ScreenToClient(hwnd, &pt);
    Xpos = (float)pt.x;
    Ypos = (float)pt.y;

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

_InputInit


_UpdateMouse

  这个函数会在主循环(system.cpp:system_start)中被调用,每一帧都更新鼠标的信息。

  1.更新获得鼠标的位置;2.判断如果鼠标被按下(bCaptured==true)同时在游戏窗口内,则设置标志bMouseOver(鼠标是否在游戏窗口内)。


void HGE_Impl::_UpdateMouse()
{
    POINT    pt;
    RECT    rc;

    GetCursorPos(&pt);
    GetClientRect(hwnd, &rc);
    MapWindowPoints(hwnd, NULL, (LPPOINT)&rc, 2);

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

_UpdateMouse


_BuildEvent(int type, int key, int scan, int flags, int x, int y)  核心!核心!核心!

  在这个函数中,根据type的不同选填不同的参数,创建不同的事件,填写事件结构,在window的消息处理函数中调用。(system.cpp:WindowProc)

  • 将事件类型设置为传递过来的类型;键码设置为0;鼠标位置更新为传递进来的x,y
  • GetKeyboardState(kbstate)获取当时的键盘信息
  • 按键按下类型:如果重复按下则不更新,否则更新引擎所管理的按键信息(全局)
  • 按键弹起类型:更新按键信息弹起信息
  • 滚轮类型:是的情况下,按键设置为0,将滚轮属性定位key值;否的情况下,则将按键属性更新为key值,否则为0
  • 鼠标按键按下类型:设置按键信息;设置焦点
  • 鼠标按键弹起类型:设置按键信息,取消焦点;重新设置鼠标坐标,更新鼠标位置信息
  • 对于功能键的属性的按键的更新
  • 如果传递进来的x=-1,则为按键类型的事件,现在讲事件的鼠标信息更新;否则判断鼠标是否出界,并更新鼠标位置
  • 将事件加入输入事件队列
  • 更新引擎所掌握的鼠标位置、按键信息

void HGE_Impl::_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 & HGEINP_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(hwnd,&pt);
    }
    else { eptr->event.key=key; eptr->event.wheel=0; }

    if(type==INPUT_MBUTTONDOWN)
    {
        keyz[key] |= 1;
        SetCapture(hwnd);
        bCaptured=true;
    }
    if(type==INPUT_MBUTTONUP)
    {
        keyz[key] |= 2;
        ReleaseCapture();
        Input_SetMousePos(Xpos, Ypos);
        pt.x=(int)Xpos; pt.y=(int)Ypos;
        bCaptured=false;
    }

    if(kbstate[VK_SHIFT] & 0x80) flags|=HGEINP_SHIFT;
    if(kbstate[VK_CONTROL] & 0x80) flags|=HGEINP_CTRL;
    if(kbstate[VK_MENU] & 0x80) flags|=HGEINP_ALT;
    if(kbstate[VK_CAPITAL] & 0x1) flags|=HGEINP_CAPSLOCK;
    if(kbstate[VK_SCROLL] & 0x1) flags|=HGEINP_SCROLLLOCK;
    if(kbstate[VK_NUMLOCK] & 0x1) flags|=HGEINP_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>=nScreenWidth) pt.x=nScreenWidth-1;
        if(pt.y>=nScreenHeight) pt.y=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;
    }
}

_BuildEvent


_ClearQueue

  清理输入事件队列,清理键盘,在主循环中会被调用。


void HGE_Impl::_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;
}

_ClearQueue


Input_GetEvent(hgeInputEvent *event)

  获取输入事件队列的第一个事件。


bool CALL HGE_Impl::Input_GetEvent(hgeInputEvent *event)
{
    CInputEventList *eptr;

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

    return false;
}

Input_GetEvent


 Input_GetMousePos(float *x, float *y)

  获取鼠标当前的位置信息。


void CALL HGE_Impl::Input_GetMousePos(float *x, float *y)
{
    *x=Xpos; *y=Ypos;
}

Input_GetMousePos


 Input_SetMousePos(float x, float y)

  设置鼠标位置:需要先ClientToScreen,再SetCursorPos。


void CALL HGE_Impl::Input_SetMousePos(float x, float y)
{
    POINT pt;
    pt.x=(long)x; pt.y=(long)y;
    ClientToScreen(hwnd, &pt);
    SetCursorPos(pt.x,pt.y);
}

Input_SetMousePos


 Input_GetMouseWheel

  获取鼠标的滚轮信息。


int CALL HGE_Impl::Input_GetMouseWheel()
{
    return Zpos;
}

Input_GetMouseWheel


 Input_IsMouseOver

  返回鼠标是否在游戏窗口上。


bool CALL HGE_Impl::Input_IsMouseOver()
{
    return bMouseOver;
}

Input_IsMouseOver


Input_GetKeyState(int key)

  返回键盘按键key是否被按键,在这里并没有调用引擎管理的当前键盘的状态来获取,而是直接通过GetKeyState(key)&0x8000来获取即时信息。


bool CALL HGE_Impl::Input_GetKeyState(int key)
{
    return ((GetKeyState(key) & 0x8000) != 0);
}

Input_GetKeyState


 Input_KeyDown

  按键是否被按下,这里按键按下是通过查看引擎管理的键盘信息来查看。


bool CALL HGE_Impl::Input_KeyDown(int key)
{
    return (keyz[key] & 1) != 0;
}

Input_KeyDown


 Input_KeyUp

  按键是否弹起,这里也是通过引擎管理的键盘信息来查看。


bool CALL HGE_Impl::Input_KeyUp(int key)
{
    return (keyz[key] & 2) != 0;
}

Input_KeyUp


 Input_GetKeyName

  获取某一个按键的名字。


char* CALL HGE_Impl::Input_GetKeyName(int key)
{
    return KeyNames[key];
}

Input_GetKeyName


 Input_GetKey

  获取当前被触发的按键。   


int CALL HGE_Impl::Input_GetKey()
{
    return VKey;
}

Input_GetKey


 Input_GetChar

  获取当前被触发按键的键码 。


int CALL HGE_Impl::Input_GetChar()
{
    return Char;
}

Input_GetChar



hge source explor 0x5 input module

时间: 2024-11-08 20:14:27

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

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

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