Files
Sun1602/Client/GameClient/Input.h
T
2022-10-26 12:25:11 +08:00

207 lines
4.4 KiB
C++

/*!
* \file Input.h
* \brief Input class
* \note 마우스 스테이트와 키보드 스테이트 분리
* \bug
* \todo - Input::Update(BOOL bRet, BOOL bPreData) 에서 BOOL bRet 는 불필요한 인자 (멤버변수를 그대로 넘겨받아 자기대입하고 있음)
- Input::UpdateEx() 사용안됨
* \author 재영
*/
#ifndef _INPUT_H
#define _INPUT_H
#ifndef DIRECTINPUT_VERSION
#define DIRECTINPUT_VERSION 0x0800
#endif // DIRECTINPUT_VERSION
#include <dinput.h>
#include <dxerr9.h>
typedef std::map<DWORD, util::_tstring> KEY_SET_MAP;
typedef KEY_SET_MAP::iterator KEY_SET_ITR;
typedef std::pair<DWORD, util::_tstring> KEY_SET_PAIR;
typedef std::vector<WORD> KeyCodeVec;
#define MAX_KEY_BUFFER 256
// 키보드 버튼의 상태
enum
{
IKS_NONE = 0x01,
IKS_DOWN = 0x02,
IKS_KEY = 0x04,
IKS_UP = 0x08,
KS_NONE = 0x10,
KS_DOWN = 0x20,
KS_KEY = 0x40,
KS_UP = 0x80,
};
// 마우스 버튼의 상태
enum
{
IKS_MOUSE_NONE = 0x0100,
IKS_MOUSE_DOWN = 0x0200,
IKS_MOUSE_KEY = 0x0400,
IKS_MOUSE_UP = 0x0800,
KS_MOUSE_NONE = 0x1000,
KS_MOUSE_DOWN = 0x2000,
KS_MOUSE_KEY = 0x4000,
KS_MOUSE_UP = 0x8000,
};
enum
{
ID_MOUSE_LBUTTON = 0,
ID_MOUSE_RBUTTON = 1,
ID_MOUSE_MBUTTON = 2,
ID_MOUSE_BUTTON4 = 3,
ID_MOUSE_BUTTON5 = 4,
ID_MOUSE_BUTTON6 = 5,
ID_MOUSE_BUTTON7 = 6,
ID_MOUSE_BUTTON8 = 7,
MAX_MOUSE_BUTTON,
};
// 마우스 클릭 시간 검사용
enum
{
EXT_MOUSE_BUTTON_NONE = 0,
EXT_MOUSE_BUTTON_CLICK_SHORT = 1,
EXT_MOUSE_BUTTON_CLICK_MID = 2,
EXT_MOUSE_BUTTON_CLICK_LONG = 3,
};
#define MOUSE_CLICK_TIME_SHORT 250
#define MOUSE_CLICK_TIME_MID 500
#define MOUSE_CLICK_TIME_LONG 1000
#define MOUSE_WHEEL_NONE 0
#define MOUSE_WHEEL_UP 1
#define MOUSE_WHEEL_DOWN 2
enum
{
MOUSE_LBUTTON = ID_MOUSE_LBUTTON + MAX_KEY_BUFFER,
MOUSE_RBUTTON,
MOUSE_MBUTTON,
MOUSE_BUTTON4,
MOUSE_BUTTON5,
MOUSE_BUTTON6,
MOUSE_BUTTON7,
MOUSE_BUTTON8,
MOUSE_WHEEL_BUTTON_UP = MOUSE_WHEEL_UP + MOUSE_BUTTON8,
MOUSE_WHEEL_BUTTON_DOWN,
};
enum
{
INPUT_SUCCESS_ALL = 0,
INPUT_ERROR_KEY = 1,
INPUT_ERROR_MOUSE = 2,
};
class Input
{
protected:
LPDIRECTINPUT8 m_pDI; // DirectInput object
LPDIRECTINPUTDEVICE8 m_pKeyboard; // DirectInput keyboard device
LPDIRECTINPUTDEVICE8 m_pMouse; // DirectInput mouse device
BOOL m_bMouseChange;
public:
BYTE m_Key[MAX_KEY_BUFFER];
BYTE m_PreKey[MAX_KEY_BUFFER];
WORD m_Event[MAX_KEY_BUFFER];
DIMOUSESTATE2 m_MouseState;
DIMOUSESTATE2 m_PreMouseState;
BOOL m_bUIMouseInput;
int m_MouseX;
int m_MouseY;
int m_MouseZ;
DWORD m_dwClickTimer_Start[MAX_MOUSE_BUTTON];
int m_iClickState[MAX_MOUSE_BUTTON];
DWORD m_dwLockKeyboard;
protected:
BOOL IsValidDevice();
public:
/*!
Input 을 생성한다. GlobalData에서 전역변수로 선언 g_Input
*/
Input( void );
~Input( void );
/*!
DirectInput 객체 및 장치를 생성한다.
Application::Create() 에서 호출됨
*/
HRESULT Create( HWND hWnd );
void Destroy( void );
void Reset();
void ResetKeyBuffer();
/*!
키보드와 마우스의 상태를 읽어와 버퍼에 저장한다.
Application::HeartBeat() 에서 호출됨
*/
int Update( BOOL bRet, BOOL bPreData = TRUE );
int UpdateEx( BOOL bRet, BYTE *pKey, DWORD dwBufferSize );
BOOL IsPressShiftKey();
BOOL IsPressCtrlKey();
BOOL IsPressAltKey();
BOOL IsPressAnyExtKey();
BOOL IsPressAnyKey();
BOOL IsPressAnyKeyExceptExt();
BOOL IsPressQuickExtKey();
BOOL IsDownAltKey();
BOOL ScanCurKeyInfo(KeyCodeVec & IN rVecCode);
BOOL GetInterfaceInputMouseFlag() { return m_bUIMouseInput; }
BYTE* GetKeyBuffer( void ) { return (BYTE*)m_Key; }
BYTE* GetPreKeyBuffer( void ) { return (BYTE*)m_PreKey; }
LPDIMOUSESTATE2 GetMouseBuffer( void ) { return &m_MouseState; }
BOOL GetState( int Key, int iKeyState , BOOL bForceInput = FALSE);
char GetState( BYTE *pKey, BYTE *pPreKey, int Key );
void InvalidateState( int Key );
int GetMouseX() { return m_MouseX; }
int GetMouseY() { return m_MouseY; }
int GetMouseWheel() { return m_MouseZ; }
void SetMouseChange(BOOL val);
BOOL GetMouseChange();
int GetMouseClickState( int iKey );
BOOL ConvertCodeToStr(KeyCodeVec & IN rVecCode, util::_tstring & OUT rKeyStrInfo);
BOOL ConvertStrToCode(util::_tstring & IN KeyStrInfo, KeyCodeVec & OUT rVecCode );
};
#endif // _INPUT_H