每当我按下一个按键没有任何反应时,也没有任何错误,相反是奇怪的。
以下是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;
}
}
最后但并非最不重要的是,这里是main.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;
}
答案 0 :(得分:2)
您错误地使用了SDL_PollEvent
。如果事件队列中仍有项目,则该函数不返回事件类型,而是返回1
,如果队列为空,则返回0
。
所以,只要队列中有东西,你就想要轮询事件,然后对switch
进行event.type
这样的事情:
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。
答案 1 :(得分:1)
SDL_PollEvent返回true或false。 https://wiki.libsdl.org/SDL_PollEvent
如果SDL_PollEvent返回true,则设置'event'。然后改为启用event.type。