|
想要查看内容赶紧注册登陆吧!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
SDL Game Development-第四章(2)-输入处理-创建处理类
一、创建输入处理类//InputHandler.h,同样是单例形式,只能有一个实例在运行
//update关键,它轮询输入设备,如鼠标、键盘、手柄之类
//clean用于清理所有已初始化的输入设备
//手柄处理讲解略过。鼠标不需要初始化,也不用担心有多个鼠标,只用假设只有一个鼠标输入。
//SDL的鼠标事件
SDL_MouseButtonEvent //按键按下或释放
SDL_MouseMotionEvent //移动
SDL_MouseWheelEvent //滚轮移动
//每一个鼠标事件有一个类型值:
按钮事件:SDL_MOUSEBUTTONDOWN | SDL_MOUSEBUTTONUP
移动事件:SDL_MOUSEMOTION
滚轮事件:SDL_MOUSEWHEEL
1.InputHandler.h中,添加按键状态数组
//private:
std::vector <bool> m_mouseButtonStates; //鼠标状态数组,0左,1中,2右
2.构造函数中,为这个数组赋初始值,初始为false
InputHandler::InputHandler()
{
for(int i=0; i<3; i++)
{
m_mouseButtonStates.push_back(false);
}
}
InputHandler::~InputHandler() {}
3.回到.h中,在类声明之前,声明一个枚举变量
enum mouse_buttons
{
LEFT = 0,
MIDDLE = 1,
RIGHT = 2
};
class InputHandler
4.输入处理中进行轮询,这将替换掉Game中的主循环- void InputHandler::update()
- {
- SDL_Event event;
- while(SDL_PollEvent(&event))
- {
- if(event.type == SDL_QUIT)
- {
- TheGame::Instance()->quit();
- }
- //处理鼠标事件
- if(event.type == SDL_MOUSEBUTTONDOWN)
- {
- if(event.button.button == SDL_BUTTON_LEFT)
- m_mouseButtonStates[LEFT] = true;
- if(event.button.button == SDL_BUTTON_MIDDLE)
- m_mouseButtonStates[MIDDLE] = true;
- if(event.button.button == SDL_BUTTON_RIGHT)
- m_mouseButtonStates[RIGHT] = true;
- }
- if(event.type == SDL_MOUSEBUTTONUP)
- {
- if(event.button.button == SDL_BUTTON_LEFT)
- m_mouseButtonStates[LEFT] = false;
- if(event.button.button == SDL_BUTTON_MIDDLE)
- m_mouseButtonStates[MIDDLE] = false;
- if(event.button.button == SDL_BUTTON_RIGHT)
- m_mouseButtonStates[RIGHT] = false;
- }
- }//end while
- }
复制代码 5.将TheInputHandler单例化
//.h中
};
typedef InputHandler TheInputHandler;
//.cpp中
#include "Game.h"
InputHandler* InputHandler::s_pInstance = 0;
二、使用这个新类6.Game.h中包含并添加quit()方法
#include "InputHandler.h"
...
void quit() { m_bRunning = false; }
7.Game.cpp中新的handleEvents()方法:- void Game::handleEvents()
- {
- /*
- SDL_Event event; //这个变量放这里合适否?每次循环都会生成这个局部变量
- if(SDL_PollEvent(&event))
- {
- switch(event.type)
- {
- case SDL_QUIT:
- m_bRunning = false; //结束循环
- break;
- default:
- break;
- }
- } //事件处理在第4章详细介绍
- */
- TheInputHandler::Instance()->update();
- }
复制代码 8.Game::clean()添加:
- //目前为止还用不上。如果需要对手柄进行处理,则需要
- TheInputHandler::Instance()->clean();
复制代码 9.Player::update()中添加按键处理
- //加入鼠标事件,如果左键按下,Player加速开始
- if(TheInputHandler::Instance()->getMouseButtonState(LEFT)) {
- m_acceleration.setX(1); //加速变量X设1
- }
复制代码
|
|