SDL3 入门(3):三角形
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):三角形的更多相关文章
- 动态规划入门——数字三角形(Java)
动态规划的概念对于新手来说枯燥难懂,就算看懂了,做题的时候依旧抓耳挠腮的毫无头绪,这些比较难理解的算法,还是需要根据例子来一步步学习和理解,从而熟练掌握,下面,咱们就通过一个简单的小例子来学习动态规划 ...
- WebGL入门教程(二)-webgl绘制三角形
前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】
http://blog.csdn.net/xiajun07061225/article/details/7628146 以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下 ...
- 简单DP入门(一) 数字三角形
数字三角形
- 数字三角形 (DP入门)
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 给出一个数字三角形.从三角形的顶部到底部有很多条不同的路径 ...
- Android OpenGL 入门示例----绘制三角形和正方形
Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况.本文记录OpenGL在Android上的入门级示例 ...
- Java入门:基础算法之计算三角形面积
本部分介绍如何计算三角形面积. /** * @author: 理工云课堂 * @description: 程序计算三角形的面积.三角形的底和高由用户输入 */ import java.util.Sca ...
- DP入门(1)——数字三角形问题
一.问题描述 如上图所示,有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数.现请你在此数字三角形中寻找一条从首行到最下行的路径,使得路径上所经过的数字之和 ...
- canvas基础入门(二)绘制线条、三角形、七巧板
复杂的内容都是有简单的线条结合而成的,想要绘制出复杂好看的内容先从画直线开始 canvas绘制直线先认识几个函数 beginPath():开始一条路径,或重置当前的路径 moveTo(x,y):用于规 ...
- OpenGL入门1.2:渲染管线简介,画三角形
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 图形渲染管线简介 在OpenGL的世界里,任何事物是处于3D空间中的,而屏幕和窗口显示的却是2D,所以OpenGL干的事情基本就是 ...
随机推荐
- 2019-7-2-WPF-通过-ReadyToRun-提升性能
title author date CreateTime categories WPF 通过 ReadyToRun 提升性能 lindexi 2019-07-02 10:29:55 +0800 201 ...
- .Net 8.0 下的新RPC,IceRPC之"请求"生命线意义非凡
作者引言 很高兴啊,我们来到了IceRPC之"请求"生命线意义非凡,号称"死亡时间"的追命线,颤抖吧! "请求"生命线之意义非凡 本文将深入 ...
- docker 权限问题 Got permission denied while trying to connect to the Docker daemon socket at 。。。
非root用户运行docker命令报如下错误 说明没有权限 haima@haima-PC:/usr/local/docker/docker_compose_efk$ docker ps -a Got ...
- LLM实战:LLM微调加速神器-Unsloth + LLama3
1. 背景 五一结束后,本qiang~又投入了LLM的技术海洋中,本期将给大家带来LLM微调神器:Unsloth. 正如Unsloth官方的对外宣贯:Easily finetune & tra ...
- C 语言编程 — 函数
目录 文章目录 目录 前文列表 函数 函数的声明 函数的定义 函数的形参与实参 值传递 引用传递 可变长形参列表 函数的调用 函数的指针 回调函数 递归函数 数的阶乘 斐波那契数列 构造函数(Cons ...
- 使用 TortoiseGit 时,报 Access denied 错误
当输入正确的密码时,总是报如下错误: 解决方法: 然后弹出如下对话框: 然后编辑本地配置文件: 然后将红色框的SSH配置改为绿色框的 HTTP配置,点击保存,确定. 然后再进行拉取源码,先输入用户名, ...
- Ceph配置与认证授权
目录 Ceph配置与认证授权 1. 为什么现在不采用修改配置文件的方式了呢? 2. Ceph元变量 3. 使用命令行修改配置 3.1 全部修改(使用服务名) 3.2 部分修改(修改进程) 3.3 临时 ...
- RocketMQ主从同步原理
一. 主从同步概述 主从同步这个概念相信大家在平时的工作中,多少都会听到.其目的主要是用于做一备份类操作,以及一些读写分离场景.比如我们常用的关系型数据库mysql,就有主从同步功能在. 主从同步,就 ...
- Django路由控制器urls
路由, 是一种映射关系,是把客户端请求的url地址和用户请求的应用程序(这里指django里面的视图进行一对一绑定映射的一种关系). 在django中所有的路由最终都被保存到一个变量 urlpatte ...
- 题解 P2497 [SDOI2012]基站建设
解题思路 CDQ优化DP 下文中 \(pos_i\) 表示编号为 \(i\) 的位置或者说坐标. 暴力 DP 转移方程是 \(f_i=\min\limits_{1\le j<i}\{f_j+\d ...