⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.cpp

📁 冰人引擎,本2d游戏引擎定位于游戏次中层引擎。他不像CDX等引擎那样
💻 CPP
字号:
#include "stdafx.h"

#pragma comment( lib, "dinput8.lib" )

CKeyboard* CKeyboard::m_Instance = 0;

CKeyboard* CKeyboard::Instance()
{
	if(m_Instance == 0)
		m_Instance = new CKeyboard;
	return m_Instance;
}

CKeyboard::CKeyboard(void)
{
	LPDIRECTINPUT8       m_pDI       = NULL;         
	LPDIRECTINPUTDEVICE8 m_pKeyboard = NULL; 
}

CKeyboard::~CKeyboard(void)
{
	//干掉键盘
	if( m_pKeyboard ) m_pKeyboard->Unacquire();

	SAFE_RELEASE( m_pKeyboard );
    SAFE_RELEASE( m_pDI );
}

bool CKeyboard::Create(HINSTANCE hInst,HWND hWnd)
{
	HRESULT hr;
	//创建DInput对象
    if( FAILED( hr = DirectInput8Create( hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_pDI, NULL )))
	{
		DebugMsg("DirectInptu8Create Error\n");
		return false;
	}
	//获得键盘操作界面
	if( FAILED( hr = m_pDI->CreateDevice( GUID_SysKeyboard, &m_pKeyboard, NULL )))
	{
		DebugMsg("CreateDevice Error\n");
		return false;
	}
	//设置数据格式
	if( FAILED( hr = m_pKeyboard->SetDataFormat( &c_dfDIKeyboard )))
	{
		DebugMsg("Set Data Format for DInupt Error\n");
		return false;
	}
	if( FAILED( hr = m_pKeyboard->SetCooperativeLevel( hWnd,DISCL_NONEXCLUSIVE | DISCL_FOREGROUND )))
    {
		DebugMsg("DInupt Cooperative Level Error\n");
		return false;
    }
	
	DIPROPDWORD dipdw;

    dipdw.diph.dwSize       = sizeof(DIPROPDWORD);
    dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
    dipdw.diph.dwObj        = 0;
    dipdw.diph.dwHow        = DIPH_DEVICE;
    dipdw.dwData            = KEY_BUFFER_SIZE;

	if( FAILED( hr = m_pKeyboard->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph ) ) )
	{
		DebugMsg("DInput SetProperty Error");
		return false;
	}
	
	//获得键盘
	m_pKeyboard->Acquire();

	return true;
}

void CKeyboard::GetKeyboardState(void)
{
	//立即模式接受信息------------------------------------------------
    HRESULT hr;
    if( NULL == m_pKeyboard ) 
        return;
	
	ZeroMemory( &m_diks, sizeof(m_diks) );
    hr = m_pKeyboard->GetDeviceState( sizeof(m_diks), &m_diks );
    
	//缓冲模式接受信息------------------------------------------------
	ZeroMemory(m_didod, sizeof(DIDEVICEOBJECTDATA) );
    m_dwElements = KEY_BUFFER_SIZE;
    hr = m_pKeyboard->GetDeviceData( sizeof(DIDEVICEOBJECTDATA),m_didod, &m_dwElements, 0 );
    if( hr != DI_OK ) 
    {
        hr = m_pKeyboard->Acquire();
        while( hr == DIERR_INPUTLOST ) 
            hr = m_pKeyboard->Acquire();
        return; 
    }
}

bool CKeyboard::KeyDown(long value)
{
	for( DWORD i = 0; i < m_dwElements; i++ ) 
    {
		if(m_didod[ i ].dwOfs == value)
		{
			if((m_didod[ i ].dwData & 0x80))
						return true;
		}
    }
	return false;
}

bool CKeyboard::KeyUp(long value)
{
	for( DWORD i = 0; i < m_dwElements; i++ ) 
    {
		if(m_didod[ i ].dwOfs == value)
		{
			if(!(m_didod[ i ].dwData & 0x80))
						return true;
		}
    }
	return false;
}

bool CKeyboard::KeyPress(long value)
{
	if(m_diks[value] & 0x80)
		return true;
	return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -