Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
247 lines
5.8 KiB
C++
247 lines
5.8 KiB
C++
// DeviceInput.cpp: implementation of the CDeviceInput class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "DeviceInput.h"
|
|
#include "GMMemory.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
LPDIRECTINPUT8 CDeviceInput::m_pDI;
|
|
LPDIRECTINPUTDEVICE8 CDeviceInput::m_pMouse;
|
|
LPDIRECTINPUTDEVICE8 CDeviceInput::m_pKeyboard;
|
|
|
|
bool CDeviceInput::m_MouseButton[3];
|
|
POINT CDeviceInput::m_MousePos;
|
|
bool CDeviceInput::m_isMouseMove;
|
|
POINT CDeviceInput::m_MouseMovePos;
|
|
bool CDeviceInput::m_isLeftMouseClick;
|
|
bool CDeviceInput::m_isRightMouseClick;
|
|
|
|
bool CDeviceInput::m_isLeftMouseDown;
|
|
bool CDeviceInput::m_isRightMouseDown;
|
|
|
|
bool CDeviceInput::m_isLeftMousePress;
|
|
bool CDeviceInput::m_isRightMousePress;
|
|
|
|
bool CDeviceInput::m_isRightMouseUp;
|
|
bool CDeviceInput::m_isMidMousePress;
|
|
|
|
float CDeviceInput::m_MouseSpeed;
|
|
int CDeviceInput::m_MouseZPos;
|
|
RECT CDeviceInput::m_rcMouseMove;
|
|
|
|
char CDeviceInput::m_aryKeyState[256];
|
|
char CDeviceInput::m_aryKeyOldState[256];
|
|
|
|
|
|
CDeviceInput::CDeviceInput()
|
|
{
|
|
m_pDI=NULL;
|
|
m_pMouse=NULL;
|
|
m_pKeyboard = NULL;
|
|
m_MouseButton[0]=false;
|
|
m_MouseButton[1]=false;
|
|
m_MouseButton[2]=false;
|
|
|
|
m_MousePos.x=0;
|
|
m_MousePos.y=0;
|
|
m_MouseZPos=0;
|
|
|
|
m_MouseMovePos.x=0;
|
|
m_MouseMovePos.y=0;
|
|
m_isLeftMouseClick=m_isRightMouseClick=false;
|
|
m_isLeftMouseDown=m_isRightMouseDown=false;
|
|
m_isLeftMousePress=m_isRightMousePress=false;
|
|
m_isRightMouseUp=false;
|
|
m_isMouseMove=false;
|
|
m_MouseSpeed=2.0f;
|
|
|
|
SetRect(&m_rcMouseMove,0,0,800-16,600-16);
|
|
|
|
memset(m_aryKeyState, 0, 256);
|
|
memset(m_aryKeyOldState, 0, 256);
|
|
}
|
|
|
|
CDeviceInput::~CDeviceInput()
|
|
{
|
|
if(m_pKeyboard)
|
|
m_pKeyboard->Release();
|
|
if(m_pMouse)
|
|
m_pMouse->Release();
|
|
if(m_pDI)
|
|
m_pDI->Release();
|
|
}
|
|
|
|
void CDeviceInput::Create(HWND hWnd)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if( FAILED(DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
|
|
IID_IDirectInput8, (VOID**)&m_pDI, NULL ) ) )
|
|
{
|
|
|
|
}
|
|
|
|
// Obtain an interface to the system keyboard device.
|
|
if( FAILED(m_pDI->CreateDevice( GUID_SysKeyboard, &m_pKeyboard, NULL ) ) )
|
|
{
|
|
|
|
}
|
|
|
|
if( FAILED( hr = m_pKeyboard->SetDataFormat( &c_dfDIKeyboard ) ) )
|
|
{
|
|
|
|
}
|
|
|
|
if(FAILED(m_pKeyboard->SetCooperativeLevel( hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND )))
|
|
{
|
|
|
|
}
|
|
|
|
m_pKeyboard->Acquire();
|
|
|
|
|
|
// Obtain an interface to the system mouse device.
|
|
if( FAILED(m_pDI->CreateDevice( GUID_SysMouse, &m_pMouse, NULL ) ) )
|
|
{
|
|
|
|
}
|
|
|
|
if( FAILED( hr = m_pMouse->SetDataFormat( &c_dfDIMouse2 ) ) )
|
|
{
|
|
|
|
}
|
|
|
|
m_pMouse->SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
|
|
m_pMouse->Acquire();
|
|
|
|
|
|
/*
|
|
if(FAILED(DirectInputCreate( (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ),
|
|
DIRECTINPUT_VERSION, &m_pDI, NULL )))
|
|
{
|
|
throw CDeviceInputError("CDeviceInput:Create , Create DirectInput Error");
|
|
}
|
|
|
|
if(FAILED(m_pDI->CreateDevice( GUID_SysKeyboard, &m_pKeyboard, NULL )))
|
|
{
|
|
throw CDeviceInputError("CDeviceInput:Create , cannot Get a KeyboardDevice");
|
|
}
|
|
if(FAILED(m_pKeyboard->SetDataFormat( &c_dfDIKeyboard )))
|
|
{
|
|
throw CDeviceInputError("CDeviceInput:Create , Setting DataFormat failed");
|
|
}
|
|
if(FAILED(m_pKeyboard->SetCooperativeLevel( hWnd,DISCL_EXCLUSIVE | DISCL_FOREGROUND )))
|
|
{
|
|
throw CDeviceInputError("CDeviceInput:Create ,SetCooperativeLevel is failed");
|
|
}
|
|
*/
|
|
|
|
}
|
|
|
|
void CDeviceInput::Acquire()
|
|
{
|
|
if(m_pKeyboard)
|
|
m_pKeyboard->Acquire();
|
|
if(m_pMouse)
|
|
m_pMouse->Acquire();
|
|
}
|
|
|
|
void CDeviceInput::UnAcquire()
|
|
{
|
|
}
|
|
void CDeviceInput::UpdateInput()
|
|
{
|
|
HRESULT hr;
|
|
|
|
memcpy(m_aryKeyOldState, m_aryKeyState, 256);
|
|
hr = m_pKeyboard->GetDeviceState(256, (void *)&m_aryKeyState);
|
|
if(FAILED(hr))
|
|
{
|
|
memcpy(m_aryKeyState, m_aryKeyOldState, 256);
|
|
return;
|
|
}
|
|
|
|
DIMOUSESTATE2 dims2; // DirectInput mouse state structure
|
|
ZeroMemory( &dims2, sizeof(dims2) );
|
|
hr = m_pMouse->GetDeviceState( sizeof(DIMOUSESTATE2), &dims2 );
|
|
|
|
if( FAILED(hr) )
|
|
{
|
|
m_MouseMovePos.x=0;
|
|
m_MouseMovePos.y=0;
|
|
m_MouseZPos=0;
|
|
m_MouseButton[0]=false;
|
|
m_MouseButton[1]=false;
|
|
m_MouseButton[2]=false;
|
|
return;
|
|
}
|
|
|
|
m_MouseMovePos.x=dims2.lX;
|
|
m_MouseMovePos.y=dims2.lY;
|
|
m_MouseZPos=dims2.lZ;
|
|
bool oldMouseButton[3];
|
|
oldMouseButton[0]=m_MouseButton[0];
|
|
oldMouseButton[1]=m_MouseButton[1];
|
|
oldMouseButton[2]=m_MouseButton[2];
|
|
m_MouseButton[0]=(dims2.rgbButtons[0] & 0x80) ? true : false;
|
|
m_MouseButton[1]=(dims2.rgbButtons[1] & 0x80) ? true : false;
|
|
m_MouseButton[2]=(dims2.rgbButtons[2] & 0x80) ? true : false;
|
|
if(m_isMouseMove)
|
|
{
|
|
m_MousePos.x+=(int)(m_MouseMovePos.x*m_MouseSpeed);
|
|
m_MousePos.y+=(int)(m_MouseMovePos.y*m_MouseSpeed);
|
|
|
|
if(m_MousePos.x<=m_rcMouseMove.left)
|
|
m_MousePos.x=m_rcMouseMove.left;
|
|
|
|
if(m_MousePos.y<=m_rcMouseMove.top)
|
|
m_MousePos.y=m_rcMouseMove.top;
|
|
|
|
if(m_MousePos.x>=m_rcMouseMove.right)
|
|
m_MousePos.x=m_rcMouseMove.right;
|
|
if(m_MousePos.y>=m_rcMouseMove.bottom)
|
|
m_MousePos.y=m_rcMouseMove.bottom;
|
|
}
|
|
if(oldMouseButton[0]==true && m_MouseButton[0]==false)
|
|
m_isLeftMouseClick=true;
|
|
else
|
|
m_isLeftMouseClick=false;
|
|
|
|
if(oldMouseButton[1]==true && m_MouseButton[1]==false)
|
|
m_isRightMouseClick=true;
|
|
else
|
|
m_isRightMouseClick=false;
|
|
|
|
if(oldMouseButton[0]==false && m_MouseButton[0]==true)
|
|
m_isLeftMouseDown=true;
|
|
else
|
|
m_isLeftMouseDown=false;
|
|
if(oldMouseButton[1]==false && m_MouseButton[1]==true)
|
|
m_isRightMouseDown=true;
|
|
else
|
|
m_isRightMouseDown=false;
|
|
|
|
if(oldMouseButton[1]==true && m_MouseButton[1]==false)
|
|
m_isRightMouseUp=true;
|
|
else
|
|
m_isRightMouseUp=false;
|
|
|
|
if(m_MouseButton[0]==true)
|
|
m_isLeftMousePress=true;
|
|
else
|
|
m_isLeftMousePress=false;
|
|
if(m_MouseButton[1]==true)
|
|
m_isRightMousePress=true;
|
|
else
|
|
m_isRightMousePress=false;
|
|
|
|
if(m_MouseButton[2]==true)
|
|
m_isMidMousePress=true;
|
|
else
|
|
m_isMidMousePress=false;
|
|
}
|