在上文 SDL 开发实战(二):SDL 2.0 核心 API 解析 我们讲解了SDL最核心的API,并结合Hello World代码了解了SDL渲染画面的基本原理。

本文我们来讲一下,如何使用SDL的API绘制基本的图形。

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

0、设置画笔的颜色

设置画笔颜色是绘制图形的首要步骤,函数方法为SDL_SetRenderDrawColor,下面是函数的原型:

int SDL_SetRenderDrawColor(SDL_Renderer* renderer,   // 渲染器
Uint8 r, // 红
Uint8 g, // 绿
Uint8 b, // 蓝
Uint8 a) // 透明值

设置好画笔的颜色后,我们就可以开始绘制了我们想要的图形了,如果需要修改绘制颜色的色值,可以再次调用此函数即可。

1. 绘制一个点

我们可以使用SDL_RenderDrawPoint函数可以绘制一个点,下面是函数的原型:

int SDL_RenderDrawPoint(SDL_Renderer* renderer, int x, int y)

渲染器为参数renderer,绘制的坐标为x,y。

2. 绘制多个点

我们可以使用SDL_RenderDrawPoints函数绘制多个点,下面是函数的原型:

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

其中points为绘制的点的数组,count为要绘制的点的个数。

3. 绘制直线

我们可以使用SDL_RenderDrawLine函数绘制一条之间,下面是函数的原型:

int SDL_RenderDrawLine(SDL_Renderer* renderer,  // 渲染器
int x1, // 端点1的x坐标
int y1, // 端点1的y坐标
int x2, // 段点2的x坐标
int y2) // 端点2的y坐标

渲染器为参数renderer,两个端点的坐标为(x1,y1)和(x2,y2)。

4. 绘制多条线

我们可以使用SDL_RenderDrawLines函数绘制多条直线,下面是函数的原型:

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

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

5. 绘制矩形

我们可以使用SDL_RenderDrawRect函数绘制矩形,下面是函数的原型:

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

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

6. 填充矩形

我们可以使用SDL_RenderFillRect函数绘制矩形,下面是函数的原型:

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

使用指定的色彩填充一块矩形。rect: 是要绘制的一块区域,包括x,y,w,h这些元素。

7. 填充多块矩形

我们可以使用SDL_RenderFillRect函数绘制矩形,下面是函数的原型:

int SDL_RenderDrawRects(SDL_Renderer* renderer, const SDL_Rect* rects, int count)

其中 rects 为矩形数组,count为矩形个数。

实战

代码:

// SDL.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include "pch.h"
#include <iostream> extern "C" {
#include "SDL.h"
} #define POINTS_COUNT 4 static SDL_Point points[POINTS_COUNT] = {
{, },
{, },
{, },
{, }
}; static SDL_Rect bigrect = { ,,, }; int main(int argc, char* argv[])
{
int flag = ; 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(
"SDL2 Draw Window", // window title
SDL_WINDOWPOS_UNDEFINED, // initial x position
SDL_WINDOWPOS_UNDEFINED, // initial y position
, // width, in pixels
, // height, in pixels
SDL_WINDOW_SHOWN // 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 ;
} /* We must call SDL_CreateRenderer in order for draw calls to affect this window. */
renderer = SDL_CreateRenderer(window, -, ); /* Select the color for drawing. It is set to red here. */
SDL_SetRenderDrawColor(renderer, , , , ); /* Clear the entire screen to our selected color. */
SDL_RenderClear(renderer); SDL_SetRenderDrawColor(renderer, , , , SDL_ALPHA_OPAQUE); SDL_RenderDrawLines(renderer, points, POINTS_COUNT); SDL_Rect rect = { , , , };
SDL_RenderDrawRect(renderer, &rect); SDL_SetRenderDrawColor(renderer, , , , );
SDL_RenderFillRect(renderer, &rect); SDL_SetRenderDrawColor(renderer, , , , );
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(); // Pause execution for 5000 milliseconds, for example //destory renderer
if (renderer) {
SDL_DestroyRenderer(renderer);
} // Close and destroy the window
SDL_DestroyWindow(window); // Clean up
SDL_Quit();
return ; }

运行效果:

SDL 开发实战(三):使用 SDL 绘制基本图形的更多相关文章

  1. 【C语言探索之旅】 第三部分第一课:SDL开发游戏之安装SDL

    内容简介 1.课程大纲 2.第三部分第一课: SDL开发游戏之安装SDL 3.第三部分第二课预告: SDL开发游戏之创建窗口和画布 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会 ...

  2. SDL 开发实战(二):SDL 2.0 核心 API 解析

    在上一篇文章 SDL 开发实战(一):SDL介绍及开发环境配置 中,我们配置好了SDL的开发环境,并成功运行了SDL的Hello World 代码.但是可能大部分人还是读不太明白具体Hello Wol ...

  3. SDL 开发实战(五): SDL 纹理渲染

    本文我们讲一下如何使用SDL_Texture将视频纹理渲染出来. 1. SDL 视频渲染相关对象 SDL 视频渲染主要涉及到四个对象:SDL_Window.SDL_Render.SDL_Texture ...

  4. SDL 开发实战(七): SDL 多线程与锁机制

    为什么要用多线程?在音视频领域主要是实现音视频同步.实现了音视频同步,我们的播放器就基本上合格了. 这里我们将讲解一下SDL的多线程与锁机制. 多线程的好处主要是能使程序更加充分利用硬件(主要是CPU ...

  5. SDL 开发实战(一):SDL介绍及开发环境配置

    一.什么是SDL? SDL是 “Simple DirectMedia Layer”的缩写,SDL是一个开源的跨平台的多媒体库,封装了复杂的音视频底层操作,简化了音视频处理的难度. SDL使用C语言写成 ...

  6. SDL 开发实战(七): 使用 SDL 实现 PCM播放器

    在上文,我们做了YUV播放器,这样我们就入门了SDL播放视频.下面我们来做一个PCM播放,即使用SDL播放PCM数据. 下面说明一下使用SDL播放PCM音频的基本流程,主要分为两大部分:初始化SDL. ...

  7. SDL 开发实战(六): 使用 SDL 实现 YUV 播放器

    前面铺垫了这么多,现在终于进入核心的主题了,那就是使用SDL播放视频,本节我们将使用SDL播放YUV视频,也就是做一个YUV播放器. 下面说明一下使用SDL播放YUV视频的基本流程,主要分为两大部分: ...

  8. SDL 开发实战(四): SDL 事件处理

    在前面学习SDL的例子运行时,我们发现我们的窗口只停留了几秒,但是如果设置更长时间显然也有其他的弊端. 那么有没有一种好的办法可以解决这个问题呢?例如:能不能让窗口一直显示,直到检测到用户用鼠标点击关 ...

  9. spring-cloud-square开发实战(三种类型全覆盖)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<五分钟搞懂spring-clou ...

随机推荐

  1. 03-案例——多任务版TCP服务端程序开发

    案例——多任务版TCP服务端程序开发   1. 需求     目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...

  2. 在servlet中使用spring注解

    @Autowired IAgreementPayService agreementPayService; /** * 支付参数 */ @Value("B{agreementPay.publi ...

  3. 为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作--java.util.ConcurrentModificationException

    摘要 foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素. 在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体 ...

  4. Python3学习十四

    1.  JS基本概念 网景和sun联合开发javascript javascript 三个部分:ECMAScript 语法    DOM(document object model)    BOM(b ...

  5. OpenCV-Python:车道检测

    任务: 一共要完成两项任务: 1. 在所提供的公路图片上检测出车道线并标记 2. 在所提供的公路视频上检测出车道线并标记 方案: 要检测出当前车道,就是要检测出左右两条车道直线.由于无人车一直保持在当 ...

  6. kafka单节点的安装,部署,使用

    1.kafka官网:http://kafka.apache.org/downloads jdk:https://www.oracle.com/technetwork/java/javase/downl ...

  7. Asp.Net Core 使用Swashbuckle.AspNetCore 生成API文档

    详情参考:https://www.cnblogs.com/morang/p/9741511.html github地址:https://github.com/yimogit/moxy.blogs/tr ...

  8. 分支界定( BRANCH-AND-BOUND)

    分支定界法(branch and bound)是一种求解整数规划问题的最常用算法.这种方法不但可以求解纯整数规划,还可以求解混合整数规划问题.分支定界法是一种搜索与迭代的方法,选择不同的分支变量和子问 ...

  9. 浏览器音频兼容和ffmpeg的音频转码使用

    浏览器对各音/视频格式的支持问题 浏览器测试效果图 ffmpeg在音频格式转换,和从视频中提取音频的简单实用 1.百度搜索浏览器对于音频文件的兼容,排在前面的文章大部分是复制粘贴很久以前的文章,容易误 ...

  10. tensorflow卷积神经网络-【老鱼学tensorflow】

    前面我们曾有篇文章中提到过关于用tensorflow训练手写2828像素点的数字的识别,在那篇文章中我们把手写数字图像直接碾压成了一个784列的数据进行识别,但实际上,这个图像是2828长宽结构的,我 ...