mirror of
https://github.com/jpd002/Play-.git
synced 2025-05-04 08:27:57 +03:00
141 lines
2.9 KiB
C++
141 lines
2.9 KiB
C++
![]() |
#include "PH_DirectInput.h"
|
||
|
#include "PS2VM.h"
|
||
|
|
||
|
#define DIBUFFERSIZE (10)
|
||
|
|
||
|
using namespace Framework;
|
||
|
|
||
|
CPH_DirectInput::CPH_DirectInput(HWND hWnd)
|
||
|
{
|
||
|
m_hWnd = hWnd;
|
||
|
m_pDI = NULL;
|
||
|
m_pKeyboard = NULL;
|
||
|
|
||
|
Initialize();
|
||
|
}
|
||
|
|
||
|
CPH_DirectInput::~CPH_DirectInput()
|
||
|
{
|
||
|
if(m_pKeyboard != NULL)
|
||
|
{
|
||
|
m_pKeyboard->Release();
|
||
|
}
|
||
|
if(m_pDI != NULL)
|
||
|
{
|
||
|
m_pDI->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CPH_DirectInput::CreatePadHandler(HWND hWnd)
|
||
|
{
|
||
|
CPS2VM::CreatePadHandler(PadHandlerFactory, (void*)hWnd);
|
||
|
}
|
||
|
|
||
|
CPadHandler* CPH_DirectInput::PadHandlerFactory(void* pParam)
|
||
|
{
|
||
|
return new CPH_DirectInput((HWND)pParam);
|
||
|
}
|
||
|
|
||
|
void CPH_DirectInput::Initialize()
|
||
|
{
|
||
|
DIPROPDWORD p;
|
||
|
|
||
|
DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_pDI, NULL);
|
||
|
|
||
|
m_pDI->CreateDevice(GUID_SysKeyboard, &m_pKeyboard, NULL);
|
||
|
m_pKeyboard->SetDataFormat(&c_dfDIKeyboard);
|
||
|
m_pKeyboard->SetCooperativeLevel(m_hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
|
||
|
|
||
|
memset(&p, 0, sizeof(DIPROPDWORD));
|
||
|
p.diph.dwSize = sizeof(DIPROPDWORD);
|
||
|
p.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||
|
p.diph.dwHow = DIPH_DEVICE;
|
||
|
p.diph.dwObj = 0;
|
||
|
p.dwData = DIBUFFERSIZE;
|
||
|
|
||
|
m_pKeyboard->SetProperty(DIPROP_BUFFERSIZE, &p.diph);
|
||
|
|
||
|
m_pKeyboard->Acquire();
|
||
|
}
|
||
|
|
||
|
void CPH_DirectInput::Update()
|
||
|
{
|
||
|
DWORD nElements, i;
|
||
|
HRESULT hRet;
|
||
|
CPadListener::BUTTON nButton;
|
||
|
DIDEVICEOBJECTDATA d[DIBUFFERSIZE];
|
||
|
CList<CPadListener>::ITERATOR itListener;
|
||
|
CPadListener* pListener;
|
||
|
|
||
|
nElements = DIBUFFERSIZE;
|
||
|
hRet = m_pKeyboard->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), d, &nElements, 0);
|
||
|
if(FAILED(hRet))
|
||
|
{
|
||
|
m_pKeyboard->Acquire();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for(i = 0; i < nElements; i++)
|
||
|
{
|
||
|
if(TranslateKey(d[i].dwOfs, &nButton))
|
||
|
{
|
||
|
for(itListener = m_Listener.Begin(); itListener.HasNext(); itListener++)
|
||
|
{
|
||
|
pListener = (*itListener);
|
||
|
pListener->SetButtonState(0, nButton, (d[i].dwData & 0x80) ? true : false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool CPH_DirectInput::TranslateKey(uint32 nSrc, CPadListener::BUTTON* nDst)
|
||
|
{
|
||
|
switch(nSrc)
|
||
|
{
|
||
|
case DIK_RETURN:
|
||
|
(*nDst) = CPadListener::BUTTON_START;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_LSHIFT:
|
||
|
case DIK_RSHIFT:
|
||
|
(*nDst) = CPadListener::BUTTON_SELECT;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_LEFT:
|
||
|
(*nDst) = CPadListener::BUTTON_LEFT;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_UP:
|
||
|
(*nDst) = CPadListener::BUTTON_UP;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_DOWN:
|
||
|
(*nDst) = CPadListener::BUTTON_DOWN;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_RIGHT:
|
||
|
(*nDst) = CPadListener::BUTTON_RIGHT;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_A:
|
||
|
(*nDst) = CPadListener::BUTTON_SQUARE;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_Z:
|
||
|
(*nDst) = CPadListener::BUTTON_CROSS;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_S:
|
||
|
(*nDst) = CPadListener::BUTTON_TRIANGLE;
|
||
|
return true;
|
||
|
break;
|
||
|
case DIK_X:
|
||
|
(*nDst) = CPadListener::BUTTON_CIRCLE;
|
||
|
return true;
|
||
|
break;
|
||
|
default:
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
}
|