SDL Game Development-第四章(2)-输入处理-创建处理类

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
跳转到指定楼层
楼主
发表于 2017-12-19 09:35:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

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中的主循环
  1. void InputHandler::update()
  2. {
  3.     SDL_Event event;
  4.     while(SDL_PollEvent(&event))
  5.     {
  6.         if(event.type == SDL_QUIT)
  7.         {
  8.             TheGame::Instance()->quit();
  9.         }
  10.     //处理鼠标事件
  11.     if(event.type == SDL_MOUSEBUTTONDOWN)
  12.     {
  13.         if(event.button.button == SDL_BUTTON_LEFT)
  14.             m_mouseButtonStates[LEFT] = true;
  15.         if(event.button.button == SDL_BUTTON_MIDDLE)
  16.             m_mouseButtonStates[MIDDLE] = true;
  17.         if(event.button.button == SDL_BUTTON_RIGHT)
  18.             m_mouseButtonStates[RIGHT] = true;
  19.     }
  20.     if(event.type == SDL_MOUSEBUTTONUP)
  21.     {
  22.         if(event.button.button == SDL_BUTTON_LEFT)
  23.             m_mouseButtonStates[LEFT] = false;
  24.         if(event.button.button == SDL_BUTTON_MIDDLE)
  25.             m_mouseButtonStates[MIDDLE] = false;
  26.         if(event.button.button == SDL_BUTTON_RIGHT)
  27.             m_mouseButtonStates[RIGHT] = false;
  28.     }

  29.     }//end while
  30. }
复制代码
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()方法:
  1. void Game::handleEvents()
  2. {
  3. /*
  4.     SDL_Event event;    //这个变量放这里合适否?每次循环都会生成这个局部变量
  5.     if(SDL_PollEvent(&event))
  6.     {
  7.         switch(event.type)
  8.         {
  9.         case SDL_QUIT:
  10.             m_bRunning = false; //结束循环
  11.             break;

  12.         default:
  13.             break;
  14.         }
  15.     }   //事件处理在第4章详细介绍
  16. */
  17.     TheInputHandler::Instance()->update();
  18. }
复制代码
8.Game::clean()添加:
  1. //目前为止还用不上。如果需要对手柄进行处理,则需要
  2. TheInputHandler::Instance()->clean();
复制代码
9.Player::update()中添加按键处理
  1.      //加入鼠标事件,如果左键按下,Player加速开始
  2.      if(TheInputHandler::Instance()->getMouseButtonState(LEFT)) {
  3.         m_acceleration.setX(1);    //加速变量X设1
  4.      }
复制代码

分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表