📄 asl_input.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 + -