【发布时间】:2016-02-26 07:04:50
【问题描述】:
我正在使用带有 C++ 的 SDL2。
我开设了一个Player 课程。它包含来自Input 类的对象。
我已经制作了两个 Player 对象。
在Player 构造函数Player() 中,我在成员Input 对象m_Controls 上调用setControls()。然后我在同一个对象上调用keyPressed()。这两个函数都属于 Input 类。
我的“错误”在第 89 行,我在这里调用 m_Controls.keyPressed(SDL_SCANCODE_W)。
函数循环通过Input成员数组m_Keys——玩家可以按下的键。如果它正在迭代的元素与传递给keyPressed() 的SDL_Scancode 匹配,则它应该从Controls 枚举中返回相应的值。
#include <SDL2/SDL.h>
#include <iostream>
enum Controls {
CONTROLS_INVALID= -1,
CONTROLS_QUIT_GAME,
CONTROLS_UP,
CONTROLS_RIGHT,
CONTROLS_DOWN,
CONTROLS_LEFT,
CONTROLS_CONFIRM
};
class Input {
private:
enum {m_NumberOfKeys= 6};
SDL_Scancode m_Keys[m_NumberOfKeys];
Controls m_PressedKey;
public:
Input(){}
~Input(){}
void setControls(SDL_Scancode up, SDL_Scancode right, SDL_Scancode down, SDL_Scancode left, SDL_Scancode confirm){
m_Keys[0]= SDL_SCANCODE_ESCAPE;
m_Keys[1]= up;
m_Keys[2]= right;
m_Keys[3]= down;
m_Keys[4]= left;
m_Keys[5]= confirm;
}
Controls keyPressed(SDL_Scancode userInput){
std::cout << "userInput: " << userInput << std::endl;
for (int i = 0; i < m_NumberOfKeys; ++i){
std::cout << i << ' ' << m_Keys[i] << std::endl;
if (m_Keys[i] == userInput){
switch (i) {
case CONTROLS_QUIT_GAME:
m_PressedKey= CONTROLS_QUIT_GAME;
break;
case CONTROLS_UP:
m_PressedKey= CONTROLS_UP;
break;
case CONTROLS_RIGHT:
m_PressedKey= CONTROLS_RIGHT;
break;
case CONTROLS_DOWN:
m_PressedKey= CONTROLS_DOWN;
break;
case CONTROLS_LEFT:
m_PressedKey= CONTROLS_LEFT;
break;
case CONTROLS_CONFIRM:
m_PressedKey= CONTROLS_CONFIRM;
break;
default:
m_PressedKey= CONTROLS_INVALID;
break;
}
}
}
std::cout << "m_PressedKey: " << m_PressedKey << std::endl;
return m_PressedKey;
}
};
class Player {
private:
static int s_IdGenerator;
int m_Id;
Input m_Controls;
public:
Player() {
m_Id= s_IdGenerator++;
std::cout << "Making player " << m_Id << std::endl;
switch (m_Id) {
case 1:
m_Controls.setControls(SDL_SCANCODE_W, SDL_SCANCODE_D, SDL_SCANCODE_S, SDL_SCANCODE_A, SDL_SCANCODE_SPACE);
break;
case 2:
m_Controls.setControls(SDL_SCANCODE_UP, SDL_SCANCODE_RIGHT, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_SPACE);
break;
default:
break;
}
m_Controls.keyPressed(SDL_SCANCODE_W);
std::cout << "==\n";
}
~Player(){}
Input& getControls(){
return m_Controls;
}
};
int Player::s_IdGenerator= 1;
int main(int argc, char **argv) {
SDL_Init(SDL_INIT_EVERYTHING);
Player player1;
Player player2;
return 0;
}
鉴于上面的代码,keyPressed() 在我制作 `player` 后返回以下内容:
Making player 1
userInput: 26
0 41
1 26
2 7
3 22
4 4
5 44
m_PressedKey: 1
到目前为止还不错。 SDL_SCANCODE_W 是player1 的控件之一,因此m_PressedKey 正确设置为1。但这是创建player2 时的输出:
Making player 2
userInput: 26
0 41
1 82
2 79
3 81
4 80
5 44
m_PressedKey: 0
由于SDL_SCANCODE_W 不是player2 控件的一部分,我希望将m_PressedKey 设置为-1。改为0。
当keyPressed() 获得无效的SDL_Scancode 时,我必须更改哪些代码才能将m_PressedKey 设置为-1?
【问题讨论】: