'SDL2 Movement is very choppy

I've been working on a game with SDL2 and C, and this is my code so far:

#include <stdio.h>
#include <stdbool.h>
#include <SDL2/SDL.h>

#define BLOCK_SIZE 50
#define SPEED 5

int initialize();
void handle_input();
void draw_player();

typedef struct {
    SDL_Renderer *renderer;
    SDL_Window *window;
    bool running;
    int FPS;
    int width;
    int height;
    bool close_requested;
    int input[256];
} Game;

Game game = {
  .running = true,
  .FPS = 60,
  .width = 600,
  .height = 600,
  .close_requested = false,
  .input = {},
};

SDL_Rect player = {
    .x = 300,
    .y = 300,
    .w = BLOCK_SIZE,
    .h = BLOCK_SIZE
};

int main(int argc, char* argv[]) {

    initialize();

    while(game.running && !game.close_requested) { //Game loop

        SDL_SetRenderDrawColor(game.renderer, 0, 0, 0, 255);
        SDL_RenderClear(game.renderer);

        handle_input();
        draw_player();

        SDL_RenderPresent(game.renderer);
        SDL_Delay(1000/game.FPS);

    } //End of game loop

    SDL_DestroyRenderer(game.renderer);
    SDL_DestroyWindow(game.window);
    SDL_Quit();

    return 0;
}

int initialize() {

    if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0) { //return 0 on success
        printf("error initializing SDL: %s\n", SDL_GetError());
        return 1;
    }

    game.window = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, game.width, game.height, 0); //creates window
    if (!game.window) {
        printf("error creating window: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    Uint32 render_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC; //creates a renderer
    game.renderer = SDL_CreateRenderer(game.window, -1, render_flags);
    if (!game.renderer) {
        printf("error creating renderer: %s\n", SDL_GetError());
        SDL_DestroyWindow(game.window);
        SDL_Quit();
        return 1;
    }
    return 0;
}

void handle_input() {

    SDL_Event event;

    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT) {
            game.close_requested = true;
            game.running = false;
        }

        //printf("input: %p code: %i\n", game.input, event.key.keysym.scancode);
        if (event.type == SDL_KEYDOWN) {
            game.input[event.key.keysym.scancode] = true;
            //printf("True");
        }
        if (event.type == SDL_KEYUP) {
            game.input[event.key.keysym.scancode] = false;
            //printf("False");
        }

        if (game.input[SDL_SCANCODE_UP]) {
            player.y -= SPEED;
        } else if (game.input[SDL_SCANCODE_DOWN]) {
            player.y += SPEED;
        } else if (game.input[SDL_SCANCODE_LEFT]) {
            player.x -= SPEED;
        } else if (game.input[SDL_SCANCODE_RIGHT]) {
            player.x += SPEED;
        }
    }

}

void draw_player() {

    SDL_SetRenderDrawColor(game.renderer, 0, 200, 50, 255);
    SDL_RenderFillRect(game.renderer, &player);

}

I'm using an array called int input[] within the typedef struct, and within the handle_input() function, I'm using the array like this:

        if (event.type == SDL_KEYDOWN) {
            game.input[event.key.keysym.scancode] = true;
        }
        if (event.type == SDL_KEYUP) {
            game.input[event.key.keysym.scancode] = false;
        }

So that I can easily check if a key is pressed like this:

 if (game.input[SDL_SCANCODE_UP]) {
       //do something
}

However, when this code is run, the movement is broken up and choppy, and there is a slight delay when you press the key down. I've set the SDL_Delay to 60 FPS, so this shouldn't be an issue with that. The issue must be with the way I'm handling the inputs. Why isn't the input code firing at a consistent and fast rate?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source