您的位置:首页 > 产品设计 > 产品经理

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

2014-02-19 16:23 295 查看
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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ game sdl
相关文章推荐