Я работаю над движением для моих весл в моем клоне PONG, и программа не хочет иногда регистрировать SDL_KEYUP / DOWN. Я думаю, у меня есть идея, почему это так, но теперь, как это исправить. Таким образом, способ, которым моя игра зациклена в настоящее время, я использую конечный автомат в моей функции main (), которая использует Game
состояние класса, которое управляет двумя веслами и шаром, каждый из которых является тремя различными экземплярами класса. В сторону моей Game
класс я запускаю события / логику / рендеринг из всех трех классов, так
void Game::events()
{
while (SDL_PollEvent(&event))
{
PlayerOne.events();
PlayerTwo.events();
Game_Ball.events();
}
}
void Game::logic()
{
PlayerOne.logic(delta.get_ticks());
PlayerTwo.logic(delta.get_ticks());
Game_Ball.logic();
}
void Game::render()
{
SDL_FillRect(screen, &screen->clip_rect, SDL_MapRGB(screen->format, 0, 0, 0));
PlayerOne.render();
PlayerTwo.render();
Game_Ball.render();
}
И paddle
движение классов управляется так (как было исправлено в последнем вопросе, который у меня был (:
void Paddle::events()
{
Uint8 *keystates = SDL_GetKeyState(NULL);
if (event.type == SDL_KEYDOWN)
{
if (player == 1)
{
if (keystates[SDLK_o] == 1)
{
yVel -= 100;
}
if (keystates[SDLK_k] == 1)
{
yVel += 100;
}
}
else
{
if (keystates[SDLK_w] == 1)
{
yVel -= 100;
}
if (keystates[SDLK_s] == 1)
{
yVel += 100;
}
}
}
if (event.type == SDL_KEYUP)
{
if (player == 1)
{
if (keystates[SDLK_o] == 0)
{
yVel += 100;
}
if (keystates[SDLK_k] == 0)
{
yVel -= 100;
}
}
else
{
if (keystates[SDLK_w] == 0)
{
yVel += 100;
}
if (keystates[SDLK_s] == 0)
{
yVel -= 100;
}
}
}
if (event.type == SDL_QUIT)
{
quit = true;
}
}
Проблема здесь в том, что иногда, если не большую часть времени, клавиши не реагируют на перемещение лопастей игрока вверх и вниз. но когда они это делают, это меньше половины времени. Я думаю, это потому, что существует только 1/3 шанса, что программа опрашивает, когда клавиша отпущена или нажата, что иногда не приводит к изменению позиции. По сути, если PLAYERONE нажимает клавишу Game
бежит PlayerTwo.events()
не будет регистрировать нажатие / отпускание клавиши. Может ли это быть проблемой в том, как я реализую игровой цикл в своей основной функции?
int main(int argc, char* args[])
{
//init SDL
if (init() == false)
{
return 1;
}
//load everything
if (load_files() == false)
{
return 1;
}
delta.start();
currentState = new Game;
while (quit == false)
{
//handle state events
currentState->events();
// do state logic
currentState->logic();
//timer reset
delta.start();
//change state if needed
change_state();
//render state
currentState->render();
if (SDL_Flip(screen) == -1)
{
return 1;
}
}
clean_up();
return 0;
}
А вот и определения и конструкторы
class Paddle
{
public:
int player;
SDL_Surface *sprite = NULL;
float x, y, w, h;
float yVel;
SDL_Rect *clip;
void events();
void logic(Uint32 deltaTicks);
void render();
Paddle();
~Paddle();
};
class Game : public GameState
{
private:
int server;
TTF_Font *score = NULL;
Paddle PlayerOne;
Paddle PlayerTwo;
Ball Game_Ball;
public:
SDL_Rect clip[2];
void events();
void logic();
void render();
Game();
~Game();
};
Game::Game()
{
//RESOURSES
PlayerOne.sprite = load_image("Game_sprite.png");
PlayerTwo.sprite = load_image("Game_sprite.png");
clip[0].x = 0;
clip[0].y = 0;
clip[0].w = 20;
clip[0].h = 20;
clip[1].x = 0;
clip[1].y = 20;
clip[1].w = 20;
clip[1].h = 100;
//PLAYER ONE
PlayerOne.x = 420;
PlayerOne.y = 100;
PlayerOne.w = 60;
PlayerOne.h = 100;
PlayerOne.clip = &clip[1];
PlayerOne.yVel = 0;
PlayerOne.player = 1;
//PLAYER TWO
PlayerTwo.x = 60;
PlayerTwo.y = 100;
PlayerTwo.w = 60;
PlayerTwo.h = 100;
PlayerTwo.clip = &clip[1];
PlayerTwo.yVel = 0;
PlayerTwo.player = 2;
//BALL
Game_Ball.Ball_Bound.x = 190;
Game_Ball.Ball_Bound.y = 190;
Game_Ball.Ball_Bound.w = 60;
Game_Ball.Ball_Bound.h = 60;
Game_Ball.clip = &clip[0];
}
Потому что это выглядит довольно чисто для меня. Что можно сделать, кроме как в другой реализации игрового цикла, чтобы исправить не регистрируемые ключи из-за того, что они находятся в другой функции? Или это проблема реализации цикла? Если это проблема с циклом, можете ли вы пройти через нее или включить ссылку на то, как ее исправить?
Я не вижу ничего плохого в этом коде. Однако самой вероятной причиной может быть просто ограничение количества нажатий клавиш на клавиатуре. Попробуйте использовать сдвиг, Ctrl а также альт, Клавиши для элементов управления, они обычно обходят ограничения.
Других решений пока нет …