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

📄 cdinput.cpp

📁 这个例子告诉你2d Arpg游戏中的动态阴影如何生成
💻 CPP
字号:
// CDInput.cpp: implementation of the CDInput class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CDInput.h"
#include "normal.h"
#include <memory>

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


const BYTE KEY_DOWN = 1;
const BYTE KEY_UP	= 0;
const int ITEMS_NUM = 16;

LPDIRECTINPUT8 CDInput::g_lpDI = NULL;
int CDInput::g_iRef = NULL;

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
CDInput::CDInput()
{

}

CDInput::~CDInput()
{

}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
bool CDInput::InitDInput( HINSTANCE hInstance )
{
	if ( g_lpDI == NULL )
	{
		if ( DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8,
								(void**)&g_lpDI, NULL ) != DI_OK )
		{
			return false;
		}
		++g_iRef;
	}
	else
		++g_iRef;

	return true;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CDInput::FreeDInput()
{
	--g_iRef;
	if ( g_iRef == 0 && g_lpDI != NULL )
	{
		g_lpDI->Release();
		g_lpDI = NULL;
	}
}


//***************************************健盘类实现************************************************
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
CDIKeyBoard::CDIKeyBoard()
{
	m_lpKeyBoardDevice = NULL;
	m_KeyStateBuffer = NULL;
	m_KeyBuffer = NULL;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
CDIKeyBoard::~CDIKeyBoard()
{
}


//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
bool CDIKeyBoard::Init( HWND hwnd, HINSTANCE hInstance )
{
	if ( InitDInput( hInstance ) == false )
		return false;

	//获取键盘设备:
	if ( g_lpDI->CreateDevice( GUID_SysKeyboard, &m_lpKeyBoardDevice, NULL ) != DI_OK )
	{
		return false;
	}

	if ( m_lpKeyBoardDevice->SetDataFormat( &c_dfDIKeyboard ) != DI_OK )
	{
		return false;
	}

	if ( m_lpKeyBoardDevice->SetCooperativeLevel( hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE )
		!= DI_OK )
	{
		return false;
	}

	if ( m_lpKeyBoardDevice->Acquire() != DI_OK )
	{
		return false;
	}

	m_KeyStateBuffer = new BYTE[256];	
	if ( m_KeyStateBuffer == NULL )
		return false;

	m_KeyBuffer = new BYTE[256];
	if ( m_KeyBuffer == NULL )
		return false;

	memset( m_KeyStateBuffer, 0, 256 );
	memset( m_KeyBuffer, 0, 256 );

	return true;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CDIKeyBoard::Free()
{
	if ( g_lpDI != NULL )
	{
		if ( m_lpKeyBoardDevice != NULL )
		{
			SafeDeleteArray( m_KeyStateBuffer );
			SafeDeleteArray( m_KeyBuffer );
			m_lpKeyBoardDevice->Unacquire();
			m_lpKeyBoardDevice->Release();
			m_lpKeyBoardDevice = NULL;
		}
		
		FreeDInput();
	}
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CDIKeyBoard::UpdateKeyBoard()
{
	if ( m_lpKeyBoardDevice->GetDeviceState( 256, (void*)&m_KeyBuffer[0] ) != DI_OK )
	{
		//MessageBox( NULL, "failed", NULL, NULL );
		m_lpKeyBoardDevice->Acquire();
	}	
}


//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
bool CDIKeyBoard::IsKeyRelease( int key_id )
{
	bool re = false;
	if ( m_KeyBuffer[ key_id ] & 0x80 )
	{
		m_KeyStateBuffer[key_id] = KEY_DOWN;
	}
	else 
	{
		if ( m_KeyStateBuffer[key_id] == KEY_DOWN )
			re = true;
		m_KeyStateBuffer[key_id] = KEY_UP;
	
	}

	return re;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
bool CDIKeyBoard::IsKeyPress( int key_id )
{
	bool re = false;
	if ( m_KeyBuffer[ key_id ] & 0x80 )
	{
		if ( m_KeyStateBuffer[key_id] == KEY_UP )
			re = true;
		m_KeyStateBuffer[key_id] = KEY_DOWN;
		
	}
	else 
	{
		m_KeyStateBuffer[key_id] = KEY_UP;
	}

	return re;
}

//******************************************鼠标类实现**********************************************
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
CDIMouse::CDIMouse()
{
	m_lpDIMouse = NULL;
	m_IsLBDown = false;
	m_IsRBDown = false;
	m_bLBState = false;
	m_bRBState = false;
}


//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
CDIMouse::~CDIMouse()
{
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
bool CDIMouse::Init( HWND hwnd, HINSTANCE hInstance )
{
	if ( InitDInput( hInstance ) == false )
		return false;

	//获取鼠标设备:
	if ( g_lpDI->CreateDevice( GUID_SysMouse, &m_lpDIMouse, NULL ) != DI_OK )
	{
		return false;
	}
	//设置数据格式
	if ( m_lpDIMouse->SetDataFormat( &c_dfDIMouse ) != DI_OK )
	{
		return false;
	}
	//设置协调级别
	if ( m_lpDIMouse->SetCooperativeLevel( hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE ) != DI_OK )
	{
		return false;
	}
	
	m_hMouseEvent = CreateEvent( NULL, false, false, NULL );
	if ( m_hMouseEvent == NULL )
	{
		return false;
	}
	if ( m_lpDIMouse->SetEventNotification( m_hMouseEvent ) != DI_OK )
	{
		return false;
	}

	//设置鼠标设备属性
	DIPROPDWORD dip;
	dip.diph.dwSize = sizeof( DIPROPDWORD );
	dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );
	dip.diph.dwObj = 0;
	dip.diph.dwHow = DIPH_DEVICE;
	dip.dwData = ITEMS_NUM;

	if ( m_lpDIMouse->SetProperty( DIPROP_BUFFERSIZE, &dip.diph ) != DI_OK )
	{
		return false;
	}
	if ( m_lpDIMouse->Acquire() != DI_OK )
	{
		return false;
	}

	return true;
}


//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CDIMouse::Free()
{
	if ( g_lpDI != NULL )
	{
		if ( m_lpDIMouse != NULL )
		{
			m_lpDIMouse->Unacquire();
			m_lpDIMouse->Release();
			m_lpDIMouse = NULL;
		}

		FreeDInput();
	}
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CDIMouse::Reset()
{
	m_IsLBDown = false;
	m_IsRBDown = false;
	m_bLBState = false;
	m_bRBState = false;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CDIMouse::UpdateMouse( HWND hwnd )
{
	HRESULT hr;
	DIDEVICEOBJECTDATA	data;
	DWORD dwReadNum = 1;

	GetCursorPos( &m_MousePoint );
	ScreenToClient( hwnd, &m_MousePoint );

	m_IsMoving = false;
	while ( 1 )
	{
		hr = m_lpDIMouse->GetDeviceData(sizeof(data), &data, &dwReadNum, 0);
		if FAILED(hr)
		{
			if(hr == DIERR_INPUTLOST)
			{
				m_lpDIMouse->Acquire();
				break;
			}
			else
				break;						//别少了
		}
		else
		{
			if( dwReadNum == 1 )
			{
				if ( data.dwOfs == DIMOFS_BUTTON0 )
				{
					if ( data.dwData & 0x80 )	
						m_IsLBDown = true;				//处理鼠标左键
					else
						m_IsLBDown = false;
					break;
				}	
				else if ( data.dwOfs == DIMOFS_BUTTON1 )
				{
					if ( data.dwData & 0x80 )
						m_IsRBDown = true;				//处理鼠标右键
					else
						m_IsRBDown = false;
					break;
				}
				else if ( data.dwOfs == DIMOFS_X || data.dwOfs == DIMOFS_Y )
					m_IsMoving = true;
			}
			else if ( dwReadNum == 0 )
				break;
		}
	}

	m_IsLRelease = false;
	m_IsLPress = false;
	if ( m_IsLBDown )
	{
		if ( !m_bLBState )
			m_IsLPress = true;
		m_bLBState = true;
	}
	else 
	{
		if ( m_bLBState )
			m_IsLRelease = true;
		m_bLBState = false;
	}

	m_IsRRelease = false;
	m_IsRPress = false;
	if ( m_IsRBDown )
	{
		if ( !m_bRBState )
			m_IsRPress = true;
		m_bRBState = true;
	}
	else 
	{
		if ( m_bRBState )	
			m_IsRRelease = true;
		m_bRBState = false;
	}
}

⌨️ 快捷键说明

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