C++ 无法使用SDL将角色移动到正确位置?

C++ 无法使用SDL将角色移动到正确位置?,c++,sdl,C++,Sdl,我目前无法将角色向右移动,并显示他正在跑步,但在我按下右键后,它会向右移动一次,然后当我进入左键时,它会再次向左移动,但再次按下右键不会使它再次向右移动。以下是我正在使用的代码: #include <SDL2/SDL.h> #include "game.h" #include "graphics.h" #include "input.h" /* Game class * This class holds all information for our game loop */

我目前无法将角色向右移动,并显示他正在跑步,但在我按下右键后,它会向右移动一次,然后当我进入左键时,它会再次向左移动,但再次按下右键不会使它再次向右移动。以下是我正在使用的代码:

#include <SDL2/SDL.h>

#include "game.h"
#include "graphics.h"
#include "input.h"

/* Game class
*  This class holds all information for our game loop
*/

namespace {
    const int FPS = 50;
    const int MAX_FRAME_TIME = 5 * 1000/ FPS;
}
Game::Game() {
    SDL_Init(SDL_INIT_EVERYTHING);
    this->gameLoop();
}
Game::~Game() {

}
void Game::gameLoop() {
    Graphics graphics;
    Input input;
    SDL_Event event;

    this->_player = Player(graphics, 100, 100);

    int LAST_UPDATE_TIME = SDL_GetTicks();
    //Start the game loop
    while(true){
        input.beginNewFrame();

        if(SDL_PollEvent(&event)){
            if(event.type == SDL_KEYDOWN){
                if(event.key.repeat == 0){
                    input.keyDownEvent(event);
                }
            }
            else if(event.type == SDL_KEYUP){
                input.keyUpEvent(event);
            }
            else if(event.type == SDL_QUIT){
                return;
            }
        }
        if(input.wasKeyPressed(SDL_SCANCODE_ESCAPE) == true){
            return;
        }
        else if(input.isKeyHeld(SDL_SCANCODE_LEFT) == true) {
            this->_player.moveLeft();
        }
        else if(input.isKeyHeld(SDL_SCANCODE_RIGHT) == true) {
            this->_player.moveRight();
        }

        if(!input.isKeyHeld(SDL_SCANCODE_LEFT) && !input.isKeyHeld(SDL_SCANCODE_RIGHT)){
            this->_player.stopMoving();
        }

    const int CURRENT_TIME_MS = SDL_GetTicks();
    int ELAPSED_TIME_MS = CURRENT_TIME_MS - LAST_UPDATE_TIME;
    this->update(std::min(ELAPSED_TIME_MS, MAX_FRAME_TIME));
    LAST_UPDATE_TIME = CURRENT_TIME_MS;
this->draw(graphics);
}

}
void Game::draw(Graphics &graphics){
    graphics.clear();

    this->_player.draw(graphics);

    graphics.flip();

}
void Game::update(float elapsedTime){
    this->_player.update(elapsedTime);
}
主要函数是上面player.cpp文件中的“moveLeft()”、“moveRight()”和“stopMoving()”


我认为player.cpp文件中存在一些问题,有人能帮我解决这个问题吗,因为我已经尝试解决这个问题3个多小时了。谢谢。

问题可能是由于在每个循环中只轮询一个事件导致的,这意味着某些事件无法得到处理。您应该继续轮询事件,直到没有更多事件排队。有关奖金的详细信息,请参阅

在您的情况下,您将需要以下内容:

while(SDL_PollEvent(&event)){
     if(event.type == SDL_KEYDOWN){
         if(event.key.repeat == 0){
             input.keyDownEvent(event);
         }
     }
     else if(event.type == SDL_KEYUP){
         input.keyUpEvent(event);
     }
     else if(event.type == SDL_QUIT){
        return;
     }
}

问题可能是由于每个循环中只轮询一个事件,这意味着某些事件无法得到处理。您应该继续轮询事件,直到没有更多事件排队。有关奖金的详细信息,请参阅

在您的情况下,您将需要以下内容:

while(SDL_PollEvent(&event)){
     if(event.type == SDL_KEYDOWN){
         if(event.key.repeat == 0){
             input.keyDownEvent(event);
         }
     }
     else if(event.type == SDL_KEYUP){
         input.keyUpEvent(event);
     }
     else if(event.type == SDL_QUIT){
        return;
     }
}