音视频开发_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你可以构造出更加复杂的图形。

粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值