while making my own Snake implementation I decided to use delta time for smoothing movement on screen. The problem is that before Snake was moving fixed amount of pixels every frame, but now when mulitplying snakeSpeed by timeStep it's no longer aligned to the grid. How can I fix it?
Main game function:
void Run()
{
while (!gameOver)
{
Time = (float)al_get_time() * 1000.0;
timeStep = Time - lastFrameTime;
Input();
if (draw && al_is_event_queue_empty(eventQueue))
{
al_clear_to_color(al_map_rgb(255, 255, 255));
UpdateSnake(&snake, timeStep, direction);
Draw();
Logic();
al_flip_display();
draw = false;
}
}
}
UpdateSnake() function (for now it's only one element moving):
void UpdateSnake(Snake *snake, float timeStep, Position direction)
{
snake->animationTime += timeStep;
float f = snake->animationTime * snakeSpeed;
if (f >= 1.0f)
{
snake->animationTime = 0.0f;
f = 1.0f;
}
snake->animationOrigin.x = ((int)snake->position.x / BOARD_CELL) * BOARD_CELL;
snake->animationOrigin.y = ((int)snake->position.y / BOARD_CELL) * BOARD_CELL;
if (direction.x == 1)
{
snake->animationDestination.x = snake->animationOrigin.x + BOARD_CELL;
snake->animationDestination.y = snake->animationOrigin.y;
}
if (direction.x == -1)
{
snake->animationDestination.x = snake->animationOrigin.x - BOARD_CELL;
snake->animationDestination.y = snake->animationOrigin.y;
}
if (direction.y == 1)
{
snake->animationDestination.x = snake->animationOrigin.x;
snake->animationDestination.y = snake->animationOrigin.y + BOARD_CELL;
}
if (direction.y == -1)
{
snake->animationDestination.x = snake->animationOrigin.x;
snake->animationDestination.y = snake->animationOrigin.y - BOARD_CELL;
}
snake->position.x = Lerp(snake->animationOrigin.x, snake->animationDestination.x, f);
snake->position.y = Lerp(snake->animationOrigin.y, snake->animationDestination.y, f);
}
lerp(prev_pos, curr_pos, 1.0f/lerp_duration*lerp_time)
\$\endgroup\$