Witam, chcąc zaimplementować delta time i timestep natknąłem się na problem z niestałymi wartościami timestep. Otóż, gdy przytrzymuje jakiś klawisz ruchu, if po Inpucie jest pomijany przez co wartość timestep jest dużo mniejsza, co z kolei wpływa na movement gracza (nie jest on już płynny).
Tak wygląda główna pętla gry.
void Run()
{
float time;
while (!gameOver)
{
time = (float)al_get_time() * 1000.0;
timeStep = time - lastFrameTime;
lastFrameTime = time;
Input();
if (draw && al_is_event_queue_empty(eventQueue))
{
game->draw = false;
UpdateSnake(timeStep, direction);
Logic();
Draw();
al_flip_display();
al_clear_to_color(al_map_rgb(0, 0, 0));
}
}
}
A tak wygląda Input()
void Input()
{
ALLEGRO_EVENT events;
al_wait_for_eventeventQueue, &events);
switch (events.type)
{
case ALLEGRO_EVENT_TIMER:
{
game->draw = true;
switch (keys)
{
case UP:
direction = (Position) { 0, -1 };
break;
case DOWN:
direction = (Position) { 0, 1 };
break;
case LEFT:
direction = (Position) { -1, 0 };
break;
case RIGHT:
direction = (Position) { 1, 0 };
break;
}
}
break;
}
case ALLEGRO_EVENT_KEY_DOWN:
{
if (events.keyboard.keycode == ALLEGRO_KEY_UP || events.keyboard.keycode == ALLEGRO_KEY_W)
game->keys = UP;
if (events.keyboard.keycode == ALLEGRO_KEY_DOWN || events.keyboard.keycode == ALLEGRO_KEY_S)
game->keys = DOWN;
if (events.keyboard.keycode == ALLEGRO_KEY_LEFT || events.keyboard.keycode == ALLEGRO_KEY_A)
game->keys = LEFT;
if (events.keyboard.keycode == ALLEGRO_KEY_RIGHT || events.keyboard.keycode == ALLEGRO_KEY_D)
game->keys = RIGHT;
break;
}
case ALLEGRO_EVENT_DISPLAY_CLOSE:
{
gameOver = true;
break;
}
}
}