无法识别键盘输入
Not recognizing keyboard input
每当我按下一个键时,什么都没有发生,也没有错误,这很奇怪。
这是init
函数:
bool Game::init(int resx, int resy, bool fullscreen)
{
tm = new TextureManager();
int flags = 0;
if(fullscreen)
{
flags = SDL_WINDOW_FULLSCREEN;
}
if(SDL_Init(SDL_INIT_EVERYTHING) >= 0)
{
g_pWindow = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, resx, resy, flags);
if(g_pWindow != 0)
{
g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);
if(g_pRenderer != 0)
{
running = true;
tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/bg.png", "bg", g_pRenderer);
tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/paddle.png", "player1", g_pRenderer);
tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/paddle.png", "player2", g_pRenderer);
tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/ball.png", "ball", g_pRenderer);
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
return false;
}
这是我的事件处理程序:
void Game::handleEvents()
{
SDL_Event event;
switch (SDL_PollEvent(&event)) {
case SDL_KEYDOWN:
p1MoveUp = true;
break;
case SDL_KEYUP:
p1MoveUp = false;
break;
default:
break;
}
}
这是我的更新功能:
void Game::update()
{
if (p1MoveUp)
{
std::cout << "asfasfasf" << std::endl; //for debug purposes :)
p1YPos -= 5;
}
}
最后但并非最不重要的一点是,这里是主要的.cpp(不包括...
Game *g_game = 0;
int main(int argc, const char * argv[])
{
g_game = new Game();
g_game->init(800, 600, false);
while(g_game->isRunning())
{
g_game->handleEvents();
g_game->update();
g_game->render();
}
g_game->clean();
SDL_Quit();
return 0;
}
您错误
地使用了SDL_PollEvent
。该函数不返回事件类型,而是1
事件队列中是否仍有项,或者0
队列是否为空。
因此,只要队列中有内容,您就希望轮询事件,然后对event.type
进行switch
:
void Game::handleEvents()
{
SDL_Event event;
// Poll events until the queue is empty...
while(SDL_PollEvent(&event)) {
// ...then check the event.
switch (event.type) {
case SDL_KEYDOWN:
p1MoveUp = true;
break;
case SDL_KEYUP:
p1MoveUp = false;
break;
default:
break;
}
}
}
编辑:请注意,目前键盘上每个键的所有键向下和向上事件都会导致p1MoveUp
标志切换。在您的SDL_KEYDOWN
和SDL_KEYUP
中,您通常还会检查按下了哪个键并采取相应的行动。您可以像这样执行此操作:
if(event.key.keysym.sym == SDLK_UP) ...
这将检查是否已按下"向上光标"的键码。密钥扫描码和键码之间存在差异,为此我建议您检查后者,如上所示。您可以在此处找到所有这些 SDL 定义的键码(查看最右边的列): https://wiki.libsdl.org/SDL_Keycode
请注意,如果您要检查不同的键和不同的键事件,事件处理程序可能会迅速增长,因此我建议您在熟悉 SDL 的事件机制后实现额外的类或其他封装方法。
SDL_PollEvent返回真或假。 https://wiki.libsdl.org/SDL_PollEvent
如果SDL_PollEvent返回 true,则设置"事件"。然后改为打开 event.type。
相关文章:
- 视窗键盘输入 c++
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- C ++异步键盘输入(标准方式)
- 盖奇不读取键盘输入
- 在 Linux 上C++:在作为 systemd 服务运行时侦听键盘输入
- 是否可以将键盘输入绑定到 Win32 中的单个应用程序?
- 使用 Windows API c++ 的键盘输入
- 如何使 std::istream 从键盘获取输入(如 std::cin)?
- 如何检查从键盘输入的特定整数值是否存在于C++文件中的一行或多行中
- 为什么如果我从键盘输入EOF克里昂不要在运行窗口打印程序的输出?
- 从特定 USB 端口捕获键盘输入
- 使用 fgets() 从键盘读取时从以前的输入读取换行符
- 使用 sfml 进行 2 个键盘输入
- 如何对并行键盘输入进行编程
- 区分键盘记录器中的密码和其他类型的键盘输入
- 如何通过键盘或分数文件输入分数
- OpenGL/GLFW/GLM-键盘输入无反应
- 在 MFC 应用中模拟应用内的键盘输入C++
- 如何在C++中终止具有键盘输入的侦听 TCP 服务器
- 通过键盘输入字符串数组和 int 数组的数组大小