首页 > 其他分享 >SDL3 入门(2):第一个窗口

SDL3 入门(2):第一个窗口

时间:2024-06-13 23:32:37浏览次数:20  
标签:窗口 入门 SDL3 keep window going renderer SDL event

在上一篇文章中我们已经利用 SDL 的日志接口实现了简单的字符串输出,实际上是解决了开发环境搭建问题,接下来我们将在已有代码的基础上继续开发,实现第一个窗口的创建和背景色绘制。

初始化

首先设置日志输出级别:

SDL_SetLogPriorities(SDL_LOG_PRIORITY_VERBOSE);

因为还是开发阶段所以我们将输出日志级别设置为最低的 VERBOSE,这样所有的日志都会输出,有助于我们观察 SDL 的运行情况,出现错误时可以得到尽量详细的出错信息,有助于我们快速定位问题。

接下来初始化 SDL 库,参数 SDL_INIT_VIDEO 指定初始化的子系统为视频系统:

if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    SDL_Log("SDL_Init failed: %s", SDL_GetError());
    return -1;
}

实际上这一步可以省略,因为在调用 SDL API 时其内部会自行检查和初始化所需使用的子系统。比如接下来要使用的 SDL_CreateWindow 函数,内部有这样的代码:

if (!_this) {
    /* Initialize the video system if needed */
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        return NULL;
    }

    ...
}

其中 _this 是视频子系统初始化完成后设置的全局变量,声明如下:

static SDL_VideoDevice *_this = NULL;

虽然不是必须的,但是我们仍然建议调用 SDL_Init 对主要用到的子系统进行显式初始化,目的有两个:

  1. 清晰完整的展示出执行过程,有助于理解代码;
  2. 如果执行失败,可以在第一时间定位出错位置,提高排障效率。

创建窗口和渲染器

创建一个 800x600 大小的窗口,然后移动到屏幕居中的位置:

SDL_Window* window = SDL_CreateWindow("Hello, SDL3!", 800, 600, SDL_WINDOW_RESIZABLE);
if (!window) {
    SDL_Log("Could not create a window: %s", SDL_GetError());
    return -1;
}

SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);

创建和窗口关联的渲染器:

SDL_Renderer* renderer = SDL_CreateRenderer(window, nullptr);
if (!renderer) {
    SDL_Log("Create renderer failed: %s", SDL_GetError());
    return -1;
}

所有图形图像都是通过渲染器绘制到窗口,以背景色绘制为例,代码如下:

SDL_SetRenderDrawColor(renderer, 16, 0, 16, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);

这里使用的背景色是 RGB(16, 0, 16),像我这样曾经用过 DirectDraw 渲染视频的老家伙们对这个颜色值应该很熟悉

标签:窗口,入门,SDL3,keep,window,going,renderer,SDL,event
From: https://www.cnblogs.com/xrunning/p/18246961

相关文章

  • ShardingSphere5入门到实战
    ShardingSphere5入门到实战第01章高性能架构模式互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能。高性能数据库集群的第一种方式是“读写分离”,第二种方式是“数据库分片”。1、读写分离架构读写分......
  • Linux脚本语言入门.md
    0、shell介绍1)Shell是什么?Shell是一个命令行解释器,它为用户提供一个详Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中......
  • milvus入门使用
    插入数据后的效果: 代码如下:importconfigparserfrompymilvusimportconnections,Collection,DataType,FieldSchema,CollectionSchemaimportnumpyasnpdefcreate_collection():#Definetheschemafields=[FieldSchema(name="sentence_id&quo......
  • Android 11 自由窗口模式启动app
    //未定义publicstaticfinalintWINDOWING_MODE_UNDEFINED=0;//普通全屏窗口publicstaticfinalintWINDOWING_MODE_FULLSCREEN=1;//画中画publicstaticfinalintWINDOWING_MODE_PINNED=2;//分屏主窗口publicstaticfinali......
  • 【esp32 学习笔记】 入门使用u8g2库(以OLED驱动芯片SSD1306为例)
    一、常用APIU8g2库提供了丰富的API,用于控制各种显示器并在屏幕上绘制文本、图形等元素。以下是U8g2库中一些常用的API:1.初始化-------U8G2U8G2(display,rotation,[,reset[,clock,data,cs,dc,reset,cs1,cs2,cs3]]) 初始化U8g2对象,其中display表示所使用的显示器......
  • 【Miro】Miro入门(指的是我这篇随笔写得很入门)
    Miro入门参考:MiroAPI入門创建APPhttps://miro.com/app/dashboard/→右上角头像→「Settings」→「Yourapps」→「Createnewapp」会提示需要创建Team(如果本来没有加到Team中去应该创建完账号可以自己创建Team)创建Team默认为「Devteam」填写「AppName」,其中「......
  • DockerCompose+Jenkins+Pipeline流水线打包Vue项目(解压安装配置Node)入门
    场景DockerCompose+Jenkins+Pipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)入门:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139631755以上使用流水线配置和打包springboot后台项目,如果要使用流水线和配置node打包vue项目,可按如下步骤。注:博......
  • MySQL从入门到高级 --- 15.优化 && 16.pymysql
    文章目录第十五章&&第十六章:15.优化15.1查询SQL执行效率15.2定位低效率执行SQL15.3explain分析执行计划-基本使用15.4explain分析执行计划-id15.5explain分析执行计划-select_type15.6explain分析执行计划-type15.7explain分析执行计划-其他指标字段15......
  • Wireshark网络分析从入门到实践【1.2】
            如果在这个期间你没有从事过其他的网络活动(例如在线看视频、下载等),那么现在最上方的也就是流量最大的对话就是在你的浏览器和www.wireshark.org之间建立的。        从图1-10中可以看出来,104.25.219.21与192.168.1.102之间对话产生的流量最多为21......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
        学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解......