SDL3 提供了 SDL_RenderGeometry 函数绘制几何图形,用法和 OpenGL 差不多,先定义顶点数据,然后根据顶点数据绘制几何图形。

绘制三角形的代码如下:

std::array<SDL_Vertex, 3> origin_vertices = {
SDL_Vertex { { 150, 100 }, { 1.0f, 0.0f, 0.0f, 1.0f } }, // top
SDL_Vertex { { 000, 300 }, { 0.0f, 1.0f, 0.0f, 1.0f } }, // left bottom
SDL_Vertex { { 300, 300 }, { 0.0f, 0.0f, 1.0f, 1.0f } } // right bottom
}; SDL_RenderGeometry(renderer, nullptr, origin_vertices.data(), origin_vertices.size(), nullptr, 0);

效果如图:

注意上面的顶点定义,坐标虽然是浮点数但表示的是像素值,颜色则做了归一化(取值范围 0.0~1.0)这一点和 SDL2 不同,SDL2 中颜色取值范围是 0~255.

可以通过实时修改顶点坐标实现运动效果。首先修改事件循环,由重绘事件 SDL_EVENT_WINDOW_EXPOSED 触发渲染改成空闲时自动渲染,对应的读取事件的方式也由 SDL_WaitEvent 改为 SDL_PollEvent

SDL_Event event {};
bool keep_going = true; while (keep_going) {
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_EVENT_QUIT:
keep_going = false;
break; case SDL_EVENT_KEY_DOWN: {
keep_going = keep_going && (event.key.keysym.sym != SDLK_ESCAPE);
break;
}
}
} SDL_SetRenderDrawColor(renderer, 16, 0, 16, 255);
SDL_RenderClear(renderer);
SDL_RenderGeometry(renderer, nullptr, origin_vertices.data(), origin_vertices.size(), nullptr, 0);
SDL_RenderPresent(renderer);
}

使用 SDL_GetTicks 获取时间,定义计算三角形位置所需变量:

uint64_t last_tickets = SDL_GetTicks();
float position = 0.0f;
float direction = 1.0f;

while 循环中增加位置计算和修改顶点数据的代码:

while(keep_going) {
... uint64_t current_ticks = SDL_GetTicks();
float delta_time = (current_ticks - last_tickets) / 1000.0f;
last_tickets = current_ticks;
position += 200.0f * delta_time * direction; int width = 0;
SDL_GetRenderOutputSize(renderer, &width, nullptr);
float max_position = static_cast<float>(width) - (origin_vertices[2].position.x - origin_vertices[1].position.x); if (position > max_position) {
direction = -1.0f;
} else if (position < 0.0f) {
position = 0.0f;
direction = 1.0f;
} std::vector<SDL_Vertex> vertices;
for (const auto& vertex : origin_vertices) {
vertices.push_back(vertex);
vertices.back().position.x += position;
} ...
SDL_RenderGeometry(renderer, nullptr, vertices.data(), vertices.size(), nullptr, 0);
...
}

这样我们就得到了一个在窗口上水平往复运动的三角形:

SDL3 入门(3):三角形的更多相关文章

  1. 动态规划入门——数字三角形(Java)

    动态规划的概念对于新手来说枯燥难懂,就算看懂了,做题的时候依旧抓耳挠腮的毫无头绪,这些比较难理解的算法,还是需要根据例子来一步步学习和理解,从而熟练掌握,下面,咱们就通过一个简单的小例子来学习动态规划 ...

  2. WebGL入门教程(二)-webgl绘制三角形

    前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...

  3. 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】

    http://blog.csdn.net/xiajun07061225/article/details/7628146 以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下 ...

  4. 简单DP入门(一) 数字三角形

    数字三角形

  5. 数字三角形 (DP入门)

    7 3     8 8     1     0 2     7     4     4  4     5     2     6     5 给出一个数字三角形.从三角形的顶部到底部有很多条不同的路径 ...

  6. Android OpenGL 入门示例----绘制三角形和正方形

    Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况.本文记录OpenGL在Android上的入门级示例 ...

  7. Java入门:基础算法之计算三角形面积

    本部分介绍如何计算三角形面积. /** * @author: 理工云课堂 * @description: 程序计算三角形的面积.三角形的底和高由用户输入 */ import java.util.Sca ...

  8. DP入门(1)——数字三角形问题

    一.问题描述 如上图所示,有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数.现请你在此数字三角形中寻找一条从首行到最下行的路径,使得路径上所经过的数字之和 ...

  9. canvas基础入门(二)绘制线条、三角形、七巧板

    复杂的内容都是有简单的线条结合而成的,想要绘制出复杂好看的内容先从画直线开始 canvas绘制直线先认识几个函数 beginPath():开始一条路径,或重置当前的路径 moveTo(x,y):用于规 ...

  10. OpenGL入门1.2:渲染管线简介,画三角形

    每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 图形渲染管线简介 在OpenGL的世界里,任何事物是处于3D空间中的,而屏幕和窗口显示的却是2D,所以OpenGL干的事情基本就是 ...

随机推荐

  1. WPF 动画实战 点击时显示圆圈淡出效果

    本文告诉大家一个有趣的动画,在鼠标点击的时候,在点击所在的点显示一个圆圈,然后这个圆圈做动画变大,但是颜色变淡的效果.本文的控件可以让大家将对应的容器放在自己应用里面就能实现这个效果 这个效果特别简单 ...

  2. 【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件微博评论

    目录 一.事件背景 二.微热点分析 二.自开发Python舆情分析 2.1 Python爬虫 2.2 可视化大屏 2.2.1 大标题 2.2.2 词云图 2.2.3 条形图 2.2.4 饼图(玫瑰图) ...

  3. U.2与M.2接口

    U.2接口 U.2接口别称SFF-8639,是由固态硬盘形态工作组(SSD Factor Work Group)推出的接口规范.U.2接口不但能支持SATA-Express(一种PCI-E与SATA混 ...

  4. 机器学习策略:详解什么时候该改变开发/测试集和指标?(When to change dev/test sets and metrics)

    什么时候该改变开发/测试集和指标? 有时候在项目进行途中,可能意识到,目标的位置放错了.这种情况下,应该移动的目标. 来看一个例子,假设在构建一个猫分类器,试图找到很多猫的照片,向的爱猫人士用户展示, ...

  5. installshield 安装jdk并配置环境变量

    今天来通过installshield安装jdk以及配置环境变量,本质上是调用第三方安装程序. 首先将jdk的安装文件添加到我们的安装程序中 然后编写我们的脚本 选择BEHAVIOR AND LOGIC ...

  6. mac + docker+单击clickhouse+Dbeaver安装全套

    一.保证docker安装成功 看下教程:https://www.runoob.com/docker/macos-docker-install.html 二.启动桌面版docker 三.下载clickh ...

  7. 鸿蒙HarmonyOS实战-Stage模型(UIAbility组件)

    一.UIAbility组件 1.概述 HarmonyOS中的Stage模型是一种基于UIAbility组件的应用程序架构.UIAbility是HarmonyOS系统中用于构建用户界面的基本组件之一.它 ...

  8. MySQL之横纵表转换

    sql行列转换(纵表和横表间的转换) 纵表 横表 纵转横 需要的知识点: group by,姓名有重复,使用这个按姓名进行分组 case...when...then...else...end 相当于s ...

  9. kubernetes 之二进制方式部署

    我的资料链接:https://pan.baidu.com/s/18g0sar1N-FMhzY-FCMqOog 两种集群架构图 多master需要在集群上面加个lb,所有的node都需要连接lb,lb帮 ...

  10. linux cd命令的重要用法:cd -,cd ~

    cd命令的作用:进入磁盘的某个目录下. [root@node5 ~]# cd /etc/sysconfig/network-scripts/ [root@node5 network-scripts]# ...