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;
}
}