Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
SDL Oyun Programlama

SDL3 Oyun Programlama sayfalarımız yayında...

Ana sayfa > Oyun programlama > SDL3 programming > Drawings

Drawings

In this section, we will examine a program that draws lines, a dotted line, a rectangle, a solid rectangle, and a triangle to the main window.

When the program runs,

  • Inside the draw_screen() function,
    • A horizontal, a vertical, and a diagonal line are drawn with the SDL_SetRenderDrawColor() function.
    • A diagonal dotted line is drawn with the SDL_RenderPoint() function.
    • A rectangle is drawn with the SDL_RenderRect() function.
    • A solid rectangle is drawn with the SDL_RenderFillRect() function.
    • A triangle is drawn with the SDL_RenderGeometry() function.

Drawing functions used

  • SDL_RenderLine() function draws a line on the current rendering target at subpixel precision.
  • SDL_RenderPoint() function draws a point on the current rendering target at subpixel precision.
  • SDL_RenderRect() function draws a rectangle on the current rendering target at subpixel precision.
  • SDL_RenderFillRect() function fills a rectangle on the current rendering target with the drawing color at subpixel precision.
  • SDL_RenderGeometry() function renders a list of triangles, optionally using a texture and indices into the vertex array Color and alpha modulation is done per vertex.

main.c file content will be as follows:


#include <SDL3/SDL.h>

// Window width and height
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480

// Global variables
int is_running = false;        // Variable that controls the execution of the main loop of the program
SDL_Window *window = NULL;     // Main window variable
SDL_Renderer *renderer = NULL; // Renderer variable

// Function prototypes
int init_window(void);         // Create window and renderer
void init_vals(void);          // Initialize values
void process_event(void);      // Process events
void update_screen();          // Update values
void draw_screen(void);        // Draw screen
void destroy_window(void);     // Destroy window

int main(int argc, char* argv[])
{
    // Create window and renderer
    is_running = init_window();

    // Initialize values
    init_vals();

    // Main loop
    while (is_running) {
        process_event();       // Processing SDL events (Here keyboard inputs).
        draw_screen();         // Drawing objects on the window (Rendering)
    }

    // Destroy renderer and SDL window
    destroy_window();

    return 0;
}

// Create window and renderer
int init_window(void)
{
    // Initialize the SDL library.
    if(SDL_Init(SDL_INIT_VIDEO) == false) {
       SDL_Log("SDL init error: %s\n", SDL_GetError());
       return false;
    }

    // Create a window and a 2D rendering context for the window.
    if(!SDL_CreateWindowAndRenderer("SDL3 drawings", WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer)) {
       return false;
    }

    return true;
}

// Initialization function that runs only once at the beginning of the program
void init_vals(void)
{

}

// Function to control SDL events and process keyboard inputs
void process_event(void)
{
     SDL_Event event;

     // Creating a loop to process user inputs
     while (SDL_PollEvent(&event)) {
        switch (event.type) {
            case SDL_EVENT_QUIT: // Logout action by the user (x button at the top right of the window)
                 is_running = false; // Terminates the execution of the program main loop.
                 break;

            case SDL_EVENT_KEY_DOWN: // Indicate that a key was pressed.
                 if(event.key.key == SDLK_ESCAPE) { // Esc key pressed
                    is_running = false; // Terminates the execution of the program main loop.
                 }
                 break;
        }
     }
}

void update_screen(void)
{

}

// Render function used to draw game objects in the main window
void draw_screen(void)
{
     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Set the color used for drawing operations.
     SDL_RenderClear(renderer); // Clear the current rendering target with the drawing color.

     // Horizontal line
     SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255);
     SDL_RenderLine(renderer, 40, 40, 250, 40 );

     // Vertical line
     SDL_SetRenderDrawColor(renderer, 255, 255, 0, 255);
     SDL_RenderLine(renderer, 40, 50, 40, 220 );

     // Diagonal line
     SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255);
     SDL_RenderLine(renderer, 50, 50, 125, 105 );

     // Cross dotted line
     SDL_SetRenderDrawColor(renderer, 125, 175, 225, 255);
     for(int x=50, y=220; x < 250; x+=6, y-=5) {
         SDL_RenderPoint(renderer, x, y);
     }
     // Rectangular frame
     SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255);
     SDL_FRect rect = { 280, 40, 150, 100 };
     SDL_RenderRect(renderer, &rect);

     // Solid rectangular frame
     SDL_SetRenderDrawColor(renderer, 250, 175, 0, 255);
     SDL_FRect rect_fill = { 450, 40, 150, 100 };
     SDL_RenderFillRect(renderer, &rect_fill);

     SDL_Vertex vert_triangle[3];

     // Lower left corner of triangle
     vert_triangle[0].position.x = 40;
     vert_triangle[0].position.y = 350;
     vert_triangle[0].color.r = 0.0;
     vert_triangle[0].color.g = 0.0;
     vert_triangle[0].color.b = 1.0;
     vert_triangle[0].color.a = 1.0;

     // Triangle vertex
     vert_triangle[1].position.x = 120;
     vert_triangle[1].position.y = 250;
     vert_triangle[1].color.r = 1.0;
     vert_triangle[1].color.g = 0.0;
     vert_triangle[1].color.b = 0.0;
     vert_triangle[1].color.a = 1.0;

     // Triangle bottom right corner
     vert_triangle[2].position.x = 200;
     vert_triangle[2].position.y = 350;
     vert_triangle[2].color.r = 0.0;
     vert_triangle[2].color.g = 1.0;
     vert_triangle[2].color.b = 0.0;
     vert_triangle[2].color.a = 1.0;

     SDL_RenderGeometry(renderer, NULL, vert_triangle, 3, NULL, 0);

     // Loading all objects drawn one by one to the back buffer to the front buffer at once and loading them onto the screen
     // This process prevents each drawn object from being displayed on the screen one by one.
     SDL_RenderPresent(renderer); // Update on screen all operations performed since the previous call
}

// Destroy Renderer and SDL window, exit from SDL3
void destroy_window(void)
{
     SDL_DestroyRenderer(renderer);
     SDL_DestroyWindow(window);
     SDL_Quit();
}