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

📄 asl_input.cpp

📁 泡泡堂单机版(含ASL游戏引擎源码 泡泡堂单机版(含ASL游戏引擎源码
💻 CPP
字号:
//-----------------------------------------------------------------------------
//
//    ____ Azure Star Game Engine 蓝星游戏引擎 ____
//
//    Copyright (c) 2006, 蓝星工作室
//    All rights reserved.
//
//    文件名称: asl_input.cpp
//    摘    要: 输入控制类实现
//
//    当前版本: 1.0
//    作    者: 汤  祺
//    创建日期: 2006-7-21
//
//-----------------------------------------------------------------------------

#include "asl_input.h"

namespace ASL
{

//-----------------------------------------------------------------------------
// 函数名: ASLInput::ASLInput()
// 功  能: 构造函数
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
ASLInput::ASLInput(void)
: m_hWnd(NULL)
, m_nWheel(0)
, m_nWheelSave(0)
{
	ZeroMemory(m_vKeyState, BUF_SIZE);
	ZeroMemory(m_vKeyStateOld, BUF_SIZE);
	m_ShiftState.ssAlt = false;
	m_ShiftState.ssCtrl = false;
	m_ShiftState.ssShift = false;
	m_ptMousePos.x = 0;
	m_ptMousePos.y = 0;
	m_ptMousePosOld.x = 0;
	m_ptMousePosOld.y = 0;
}

//-----------------------------------------------------------------------------
// 函数名: ASLInput::~ASLInput()
// 功  能: 析构函数
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
ASLInput::~ASLInput(void)
{
}

//-----------------------------------------------------------------------------
// 函数名: ASLInput::Instance()
// 功  能: 取全局唯一实例
// 参  数: [void] - 无
// 返回值: [ASLInput&] - 全局唯一实例
//-----------------------------------------------------------------------------
ASLInput& ASLInput::Instance(void)
{
	static ASLInput instance;
	return instance;
}

//-----------------------------------------------------------------------------
// 函数名: ASLInput::MsgProc()
// 功  能: 消息处理函数, 需在主窗口的消息处理函数中调用
// 参  数: [message] - 消息类型
//         [wParam] - 辅助参数1
//         [lParam] - 辅助参数2
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLInput::MsgProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_KEYDOWN:
		m_qKeyDown.push((DWORD)wParam);
		break;
	case WM_KEYUP:
		m_qKeyUp.push((DWORD)wParam);
		break;
	case WM_CHAR:
		m_qChar.push((char)wParam);
		break;
	case 0x020A: // WM_MOUSEWHEEL
		m_nWheel += HIWORD(wParam) / 120;
		break;
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLInput::Update()
// 功  能: 更新函数, 需在游戏循环中调用
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLInput::Update(void)
{
	ASSERT(m_hWnd != NULL);

	m_qKeyDownSave = m_qKeyDown;
	m_qKeyUpSave = m_qKeyUp;
	m_qCharSave = m_qChar;
	m_nWheelSave = m_nWheel;

	while (!m_qKeyDown.empty())
	{
		m_qKeyDown.pop();
	}
	while (!m_qKeyUp.empty())
	{
		m_qKeyUp.pop();
	}
	while (!m_qChar.empty())
	{
		m_qChar.pop();
	}
	m_nWheel = 0;

	memcpy(m_vKeyStateOld, m_vKeyState, BUF_SIZE);
	GetKeyboardState(m_vKeyState);

	m_ShiftState.ssCtrl = (m_vKeyState[VK_CONTROL] & 0x80) != 0;
	m_ShiftState.ssShift = (m_vKeyState[VK_SHIFT] & 0x80) != 0;
	m_ShiftState.ssAlt = (m_vKeyState[VK_MENU] & 0x80) != 0;

	m_ptMousePosOld = m_ptMousePos;
	GetCursorPos(&m_ptMousePos);
	ScreenToClient(m_hWnd, &m_ptMousePos);
}

//-----------------------------------------------------------------------------
// 函数名: ASLInput::IsMouseJustDown()
// 功  能: 查询鼠标按钮是否刚被按下
// 参  数: [mb] - 要查询的按钮(mbLeft/mbRight/mbMiddle)
// 返回值: [bool] - 按钮是否刚被按下
//-----------------------------------------------------------------------------
bool ASLInput::IsMouseJustDown(MouseButton mb)
{
	switch (mb)
	{
	case mbLeft:
		return IsKeyJustDown(VK_LBUTTON);
	case mbRight:
		return IsKeyJustDown(VK_RBUTTON);
	case mbMiddle:
		return IsKeyJustDown(VK_MBUTTON);
	default:
		return false;
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLInput::IsMouseJustUp()
// 功  能: 查询鼠标按钮是否刚被松开
// 参  数: [mb] - 要查询的按钮(mbLeft/mbRight/mbMiddle)
// 返回值: [bool] - 按钮是否刚被松开
//-----------------------------------------------------------------------------
bool ASLInput::IsMouseJustUp(MouseButton mb)
{
	switch (mb)
	{
	case mbLeft:
		return IsKeyJustUp(VK_LBUTTON);
	case mbRight:
		return IsKeyJustUp(VK_RBUTTON);
	case mbMiddle:
		return IsKeyJustUp(VK_MBUTTON);
	default:
		return false;
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLInput::GetMouseState()
// 功  能: 查询鼠标按钮状态
// 参  数: [mb] - 要查询的按钮(mbLeft/mbRight/mbMiddle)
// 返回值: [bool] - 按钮状态(按下/弹起)
//-----------------------------------------------------------------------------
bool ASLInput::GetMouseState(MouseButton mb)
{
	switch (mb)
	{
	case mbLeft:
		return GetKeyState(VK_LBUTTON);
	case mbRight:
		return GetKeyState(VK_RBUTTON);
	case mbMiddle:
		return GetKeyState(VK_MBUTTON);
	default:
		return false;
	}
}
	
//-----------------------------------------------------------------------------
// 函数名: ASLInput::SetMousePos()
// 功  能: 设置鼠标指针位置
// 参  数: [pt] - 位置点
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLInput::SetMousePos(POINT pt)
{
	ASSERT(m_hWnd != NULL);

	m_ptMousePos = pt;
	ClientToScreen(m_hWnd, &pt);
	SetCursorPos(pt.x, pt.y);
}

//-----------------------------------------------------------------------------
// 函数名: ASLInput::IsMouseMoved()
// 功  能: 检测鼠标是否移动(相对上次调用Update()函数)
// 参  数: [void] - 无
// 返回值: [bool] - 鼠标是否移动
//-----------------------------------------------------------------------------
bool ASLInput::IsMouseMoved(void)
{
	return (m_ptMousePos.x != m_ptMousePosOld.x 
		 || m_ptMousePos.y != m_ptMousePosOld.y);
}

} // namespace ASL

⌨️ 快捷键说明

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