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

📄 setcontrol.cpp

📁 3D俄罗斯方块源码.rar
💻 CPP
字号:
//--------------------------------------------------------------
/**\!File
  *
  *File name:SETCONTROL.CPP
  *
  *His:add by honghaier @2004/5/7
  *
  *Desc:设置游戏控制类
  */
//---------------------------------------------------------------
#include "SetControl.h"
#define SAFE_RELEASE(p)      { if(p) { (p)->Release(); (p)=NULL; } }
//---------------------------------------------------------------
	/** 构造函数.
       * 初始化成员变量
       */
	CSetControl::CSetControl()
	{
	m_type=1;
    m_lpDI=NULL; /*对应的DINPUT对象 */
    m_lpDIDevice=NULL ;/*创建的设备对象 */
	m_Log.Settype(1);
	//------------初始化键盘一----------
	m_control.iUpKey=17;//'W'
	m_control.iLeftKey=30;//'A'
	m_control.iRightKey=32;//'D'
	m_control.iDownKey=31;//'S'
	m_control.iEndKey=18;//'E'
	//------------初始化键盘二----------
	m_control2.iUpKey=200;//'UP'
	m_control2.iLeftKey=203;//'LEFT'
	m_control2.iRightKey=205;//'RIGHT'
	m_control2.iDownKey=208;//'DOWN'
	m_control2.iEndKey=207;//'END'
	}
	/** 析构函数.
       * 初始化成员变量
       */
    CSetControl::~CSetControl()
	{    if(m_lpDIDevice) 
        m_lpDIDevice->Unacquire();
     SAFE_RELEASE(m_lpDIDevice);
	 SAFE_RELEASE(m_lpDI);
	}
	/**!\brief
	  *初始化键盘设备
	  *\param hWnd代表主窗口
	  *\return 如果成功返回true,否则false
	  */
    bool CSetControl::initKeyboard(HWND hWnd)
	{
		//---------------创建DINPUT对象-------------------
		hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, 
        IID_IDirectInput8, (void**)&m_lpDI, NULL); 
        if FAILED(hr) 
		{ 
		m_Log.Write("无法创建DINPUT对象(键盘)");
		CleanUpDirectInput();
		return false;
		} 
		m_Log.Write("创建DINPUT对象成功(键盘)");
		//----------------创建DINPUT设备------------------
		hr=m_lpDI->CreateDevice(GUID_SysKeyboard,&m_lpDIDevice, NULL); 
        if FAILED(hr) 
		{ 
		m_Log.Write("无法创建DINPUT设备(键盘)");
		CleanUpDirectInput();
		return false;
		} 
		m_Log.Write("创建DINPUT设备成功(键盘)");
		//-----------------设定数据格式-----------------
        hr=m_lpDIDevice->SetDataFormat(&c_dfDIKeyboard);
        if FAILED(hr) 
		{ 
		m_Log.Write("无法设定数据格式(键盘)");
		CleanUpDirectInput();
		return false;
		} 
		m_Log.Write("设定数据格式成功(键盘)");
		//-----------------设定程序协调层级-----------------
		hr=m_lpDIDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
        if FAILED(hr) 
		{ 
		m_Log.Write("无法设定程序协调层级(键盘)");
		CleanUpDirectInput();
		return false;
		} 
		m_Log.Write("设定程序协调层级成功(键盘)");
		//-------------------取用输入装置----------------
		hr=m_lpDIDevice->Acquire();
        if FAILED(hr) 
		{ 
		m_Log.Write("取用输入装置失败(键盘)");
		CleanUpDirectInput();
		return false;
		} 
		m_Log.Write("取用输入装置成功(键盘)");
        return true;
	}
	/**!\brief
	  *键盘数据处理
	  *\return 返回键盘值
	  */
    int CSetControl::ProcessKBInput()
	{
		char buffer[256];
		//-------------------取用输入状态----------------
		hr=m_lpDIDevice->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
        if FAILED(hr) 
		{ 
		m_Log.Write("取用输入状态失败(键盘)");
		CleanUpDirectInput();
		} 
		int t_key=0;
		for(int i=0;i<255;i++)
		{
			if(buffer[i]&0x80)
			{
				t_key=i;
				break;
			}
		}
		DoKeyName(t_key);
		return t_key;
	}
	/**!\brief
	  *清空资源
	  */
    void CSetControl::CleanUpDirectInput()
	{ if(m_lpDIDevice) 
        m_lpDIDevice->Unacquire();
     SAFE_RELEASE(m_lpDIDevice);
	 SAFE_RELEASE(m_lpDI);
	}
	/**!\brief
	  *对应键盘名称
	  */
    char *CSetControl::DoKeyName(int _i)
	{
		switch(_i)
		{
//--------------第一排---------------
		case 16:
			wsprintf(m_info,"DIK_Q");
			break;
		case 17:
			wsprintf(m_info,"DIK_W");
			break;
		case 18:
			wsprintf(m_info,"DIK_E");
			break;
		case 19:
			wsprintf(m_info,"DIK_R");
			break;
		case 20:
			wsprintf(m_info,"DIK_T");
			break;
		case 21:
			wsprintf(m_info,"DIK_Y");
			break;
		case 22:
			wsprintf(m_info,"DIK_U");
			break;
		case 23:
			wsprintf(m_info,"DIK_I");
			break;
		case 24:
			wsprintf(m_info,"DIK_O");
			break;
		case 25:
			wsprintf(m_info,"DIK_P");
			break;
//--------------第二排---------------
		case 30:
			wsprintf(m_info,"DIK_A");
			break;
		case 31:
			wsprintf(m_info,"DIK_S");
			break;
		case 32:
			wsprintf(m_info,"DIK_D");
			break;
		case 33:
			wsprintf(m_info,"DIK_F");
			break;
		case 34:
			wsprintf(m_info,"DIK_G");
			break;
		case 35:
			wsprintf(m_info,"DIK_H");
			break;
		case 36:
			wsprintf(m_info,"DIK_J");
			break;
		case 37:
			wsprintf(m_info,"DIK_K");
			break;
		case 38:
			wsprintf(m_info,"DIK_L");
			break;
//--------------第三排---------------
		case 44:
			wsprintf(m_info,"DIK_Z");
			break;
		case 45:
			wsprintf(m_info,"DIK_X");
			break;
		case 46:
			wsprintf(m_info,"DIK_C");
			break;
		case 47:
			wsprintf(m_info,"DIK_V");
			break;
		case 48:
			wsprintf(m_info,"DIK_B");
			break;
		case 49:
			wsprintf(m_info,"DIK_N");
			break;
		case 50:
			wsprintf(m_info,"DIK_M");
			break;
//--------------小键盘---------------
		case 71:
			wsprintf(m_info,"DIK_NUMPAD7");
			break;
		case 72:
			wsprintf(m_info,"DIK_NUMPAD8");
			break;
		case 73:
			wsprintf(m_info,"DIK_NUMPAD9");
			break;
		case 74:
			wsprintf(m_info,"DIK_SUBTRACT");
			break;
		case 75:
			wsprintf(m_info,"DIK_NUMPAD4");
			break;
		case 76:
			wsprintf(m_info,"DIK_NUMPAD5");
			break;
		case 77:
			wsprintf(m_info,"DIK_NUMPAD6");
			break;
		case 78:
			wsprintf(m_info,"DIK_ADD");
			break;
		case 79:
			wsprintf(m_info,"DIK_NUMPAD1");
			break;
		case 80:
			wsprintf(m_info,"DIK_NUMPAD2");
			break;
		case 81:
			wsprintf(m_info,"DIK_NUMPAD3");
			break;
		case 82:
			wsprintf(m_info,"DIK_NUMPAD0");
			break;
		case 83:
			wsprintf(m_info,"DIK_DECIMAL");
			break;
//--------------控制键---------------
		case 199:
			wsprintf(m_info,"DIK_HOME");
			break;
		case 200:
			wsprintf(m_info,"DIK_UP");
			break;
		case 201:
			wsprintf(m_info,"DIK_RPIOR");
			break;
		case 203:
			wsprintf(m_info,"DIK_LEFT");
			break;
		case 205:
			wsprintf(m_info,"DIK_RIGHT");
			break;
		case 207:
			wsprintf(m_info,"DIK_END");
			break;
		case 208:
			wsprintf(m_info,"DIK_DOWN");
			break;
		case 209:
			wsprintf(m_info,"DIK_NEXT");
			break;
		case 210:
			wsprintf(m_info,"DIK_INSERT");
			break;
		case 211:
			wsprintf(m_info,"DIK_DELETE");
			break;
		}
		return &m_info[0];
	}

⌨️ 快捷键说明

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