SDL Game Development-第四章(2)-输入处理-创建处理类
来源:互联网 发布:ipad照片如何导入mac 编辑:程序博客网 时间:2024/05/21 10:01
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 }
0 0
- SDL Game Development-第四章(2)-输入处理-创建处理类
- SDL Game Development-第四章(2)-输入处理2-处理鼠标移动
- SDL Game Development-第四章(1)-移动
- SDL Game Development-第1章-笔记
- 第四章:shell处理用户输入
- SDL Game Development-第2章-1.BMP的原样显示
- SDL Game Development-第2章-2.剪裁式显示BMP
- SDL Game Development-第2章-3.利用角色表产生动画
- SDL Game Development-第2章-4.使用SDL_image库操作更多格式的图片
- SDL Game Development-第2章-5.实现纹理管理器Texture Manager
- SDL解析——SDL视频处理(2)
- SDL学习(2)图形的处理
- SDL事件处理框架
- SDL Game Development-第3章-1.实现游戏对象管理器(1)Working with Game Objects
- SDL解析——SDL视频处理
- 第四章 JavaFx 文本处理
- 【Oracle】第四章异常处理
- 读 Beginning Android Games 2nd Edition (八) 创建输入事件处理类
- iOS 如何选择delegate、notification、KVO?
- Flex 验证码源码
- python urllib2模块学习
- OJ_1058
- 哈哈哈到校了。
- SDL Game Development-第四章(2)-输入处理-创建处理类
- struts2加入标签库就运行错误,去掉就能运行,解决方法
- IIS下FTP服务器的PASV端口范围修改方法
- IPTABLES入门
- .NET验证控件完整整理
- mingw中编译库出现sys/times.h: No such file or directory的可行解决方法
- OJ_1059
- IPTABLES进阶
- 简单的01背包