Search code examples
c++sdl

Can't figure out why line is not being drawn in SDL


This program to draw a line in SDL is not working:

#include "SDL.h"

int main(int argc, char** argv)
{
    SDL_Window* window = SDL_CreateWindow("A line", 10, 10, 1200, 600, false);

    bool running = true;

    while (running)
    {
        SDL_Event events;
        if (SDL_WaitEvent(&events))
            if (events.type == SDL_QUIT)
                running = false;

        SDL_Renderer* renderer;
        renderer = SDL_CreateRenderer(window, -1, 0);

        SDL_RenderClear(renderer);

        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
        SDL_RenderDrawLine(renderer, 10, 10, 500, 500);

    }

    SDL_Quit();

    return 1;
}

When I run the program, I don't get any error, but nothing is drawn either.


Solution

  • @Cool_Cornflakes, a few issues:

    • You're missing a SDL_RenderPresent() so nothing is ever actually drawn to the screen.
    • As @tkausl points out, don't create (& leak) a SDL_Renderer every frame
    • Use SDL_PollEvent() in a loop to fully drain the event queue.
    • SDL_SetRenderDrawColor() affects SDL_RenderClear() as well as SDL_RenderDrawLine(); as one might imagine black-on-black is kinda hard to see :) Set a more visible color before trying to draw a line.
    • Should probably be passing a = 255 to SDL_SetRenderDrawColor().

    All together:

    // g++ main.cpp `pkg-config --cflags --libs sdl2`
    #include "SDL.h"
    
    int main(int argc, char** argv)
    {
        SDL_Window* window = SDL_CreateWindow("A line", 10, 10, 1200, 600, false);
        SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
    
        bool running = true;
        while (running)
        {
            SDL_Event event;
            while( SDL_PollEvent(&event) )
            {
                if (event.type == SDL_QUIT)
                    running = false;
            }
    
            SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
            SDL_RenderClear(renderer);
    
            SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
            SDL_RenderDrawLine(renderer, 10, 10, 500, 500);
            SDL_RenderPresent( renderer );
        }
    
        SDL_Quit();
        return 1;
    }