美文网首页FFmpegOpenGL渲染音视频直播技术
「SDL第三篇」绘制基本图形

「SDL第三篇」绘制基本图形

作者: 音视频直播技术专家 | 来源:发表于2018-04-08 15:22 被阅读72次

    前言

    之前的SDL的两篇文章我向大家介绍了如何编译使用 SDL,以及如何才能让窗口显示出来。想了解相关内容的同学可以点击下面的链接查看相关内容。

    本文将向大家介绍一下,如何通过 SDL 绘制一些基本图形,如 点、线、矩形。了解了这些基本图形后,你就可以按照搭积木的方式,构造出其它更复杂的图形了。

    有哪些基本图形可以绘制

    SDL中绘制基本图形的 API并不多,主要是 点、线、矩形。其它图形都可以通过 点、线、矩形组合出来。

    • 设置颜色:在绘制图形前,要设置一下画笔的色彩。这里需要注意的是,如果画笔与背景色相同了,那在窗口中是显示不出来图形的。
    • 画点。
    • 画线。
    • 画矩形。
    • 填充矩形。

    下面来详细介绍一下这几个API。

    API详细介绍

    • 设置颜色

      int SDL_SetRenderDrawColor(SDL_Renderer* renderer,
                               Uint8         r,
                               Uint8         g,
                               Uint8         b,
                               Uint8         a)
      

      该函数中的参数 a 指明了颜色的透明度。

      但该值我设置了一下没有起作用,应该需要和BlendMode一起才能起作用。这块有谁清楚可以指定一下

    • 画点

      int SDL_RenderDrawPoint(SDL_Renderer* renderer,
                            int           x, 
                            int           y)
      
    • 画多个点

      int SDL_RenderDrawPoints(SDL_Renderer*    renderer,
                             const SDL_Point* points,
                             int              count)
      
      • points: 点数组。
      • count: 点的个数。
    • 画线

      int SDL_RenderDrawLine(SDL_Renderer* renderer,
                           int           x1,
                           int           y1,
                           int           x2,
                           int           y2)
      
    • 画多条线

      int SDL_RenderDrawLines(SDL_Renderer*    renderer,
                            const SDL_Point* points,
                            int              count)
      

      该函数会将使用两个相邻的点之间进行连线。最终画出你想画的图形。如画三角形,多边形或圆形。

    • 绘制矩形

      int SDL_RenderDrawRect(SDL_Renderer*   renderer,
                           const SDL_Rect* rect)
      

      rect: 是要绘制的一块区域。它包括,x,y,w,h这个元素。

    • 填充矩形

      int SDL_RenderFillRect(SDL_Renderer*   renderer,
                           const SDL_Rect* rect)
      

      使用指定的色彩填充一块矩形。

    • 填充多块矩形

      int SDL_RenderDrawRects(SDL_Renderer*   renderer,
                            const SDL_Rect* rects,
                            int             count)
      
      • rects: 指定的矩形数组。
      • count: 指定矩形个数。

    我们来看看代码

    下面的代码非常之简单,我们在上一篇文章代码的基础上增加了几个画线、画矩形的API就可以了。

    这里唯一值得注意的地方是下面这个函数。

    SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
    

    该函数是设置画笔颜色,也就是说我们想画出什么颜色的图形,只要用这个函数设置一下,再使用画点、画线的API就可以画出对应颜色的图形了。

    原码如下:

    #include "SDL.h"
    #include <stdio.h>
    
    #define POINTS_COUNT 4
    
    static SDL_Point points[POINTS_COUNT] = {
        {320, 200},
        {300, 240},
        {340, 240},
        {320, 200}
    };
    
    static SDL_Rect bigrect = {0,0,540, 380};
    
    int main(int argc, char* argv[]) {
    
        int flag = 1;
    
        SDL_Window *window;                    // Declare a pointer
        SDL_Renderer *renderer;
    
        SDL_Init(SDL_INIT_VIDEO);              // Initialize SDL2
    
        // Create an application window with the following settings:
        window = SDL_CreateWindow(
            "An SDL2 window",                  // window title
            SDL_WINDOWPOS_UNDEFINED,           // initial x position
            SDL_WINDOWPOS_UNDEFINED,           // initial y position
            640,                               // width, in pixels
            480,                               // height, in pixels
            SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS// flags - see below
        );
    
        // Check that the window was successfully created
        if (window == NULL) {
            // In the case that the window could not be made...
            printf("Could not create window: %s\n", SDL_GetError());
            return 1;
        }
        
        /* We must call SDL_CreateRenderer in order for draw calls to affect this window. */
        renderer = SDL_CreateRenderer(window, -1, 0);
    
        /* Select the color for drawing. It is set to red here. */
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    
        /* Clear the entire screen to our selected color. */
        SDL_RenderClear(renderer);
    
        SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
        //SDL_RenderDrawLine(renderer, 100, 20, 500, 400);
        SDL_RenderDrawLines(renderer, points, POINTS_COUNT);
    
        SDL_Rect rect = {200, 300, 100, 100};
        SDL_RenderDrawRect(renderer, &rect);
    
        SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255);
        SDL_RenderFillRect(renderer, &rect);
    
        SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
        SDL_RenderFillRect(renderer, &bigrect);
    
        /* Up until now everything was drawn behind the scenes.
           This will show the new, red contents of the window. */
        SDL_RenderPresent(renderer);
    
        // The window is open: could enter program loop here (see SDL_PollEvent())
    
        SDL_Delay(3000);  // Pause execution for 3000 milliseconds, for example
    
        //destory renderer
        if (renderer) {
            SDL_DestroyRenderer(renderer);
        }
    
        // Close and destroy the window
        SDL_DestroyWindow(window);
    
        // Clean up
        SDL_Quit();
        return 0;
    }
    
    

    小结

    本文重点介绍了 SDL 绘制经常使用的几个基本图形API,通过这些API你可以构造出更加复杂的图形。

    希望本文能对你所有帮助,谢谢!

    相关文章

      网友评论

        本文标题:「SDL第三篇」绘制基本图形

        本文链接:https://www.haomeiwen.com/subject/qmtmhftx.html