前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SDL实战(一)

SDL实战(一)

作者头像
用户6280468
发布2022-03-21 18:39:37
1K0
发布2022-03-21 18:39:37
举报
文章被收录于专栏:txp玩Linux

大家好,我是txp,今天给大家分享一篇关于SDL的技术文章;在写文章之前呢,分享一本目前空闲时间在看的一本关于h265的书籍:

如果喜欢纸质的朋友,可以去某宝上买二手,我买过来的,几乎是新的,书籍内容蛮不错!

当然如果你喜欢看原标准的话,可以到ITU官网上去查看源文档:

代码语言:javascript
复制
https://www.itu.int/rec/T-REC-H/e

关于其它H系列标准都可以看。

一、SDL相关介绍:

首先下来介绍一下什么是SDL;SDL(Simple DirectMedia Layer)是一套开发源代码的跨平台多媒体开发库,使用c写出的;SDL它提供了多种控制图像、声音、输出输入的函数接口,让开发者只要用相同或者是相似的代码就可以开发出跨多个平台,比如说Linux、Windows、Mac Os 等操作系统平台;它的应用领域主要包括:游戏开发,模拟器、媒体播放器等多媒体应用领域。

关于更多SDL的详细了解,您可以访问官网进行更加详细的了解:

代码语言:javascript
复制
https://www.libsdl.org/

相关开发接口文档说明:

代码语言:javascript
复制
http://wiki.libsdl.org/Introduction

下面我们开始下载SDL并搭建windows开发环境,环境是基于qt平台上

下载SDL相关开发库:

代码语言:javascript
复制
https://www.libsdl.org/download-2.0.php

开发库下载

然后下面我从零开始搭建一个SDL工程(手把手的那种),实际动手操作,你只需按照下面的图片流程来就行:

1

2

3

4

最后我们这个工程就创建完毕,然后把刚才下载的SDL开发库放到当前工程目录下:

然后进行配置pro文件:

代码语言:javascript
复制
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.c

win32 {
INCLUDEPATH += $$PWD/SDL2-2.0.16/include
LIBS += $$PWD/SDL2-2.0.16/lib/x86/SDL2.lib
}

这个SDL2.lib库的路线是在:

最后整个工程就配置完成了。

二、两个demo实战演练:

首先简单演示一个SDL窗口显示,这个窗口是最原始的,啥都没有。

在做演示之前,非常有必要简单介绍一下相关接口和说明:

  • SDL子系统(SDL将功能分成下列数个子系统):
    • SDL_INIT_TIMER:定时器
    • SDL_INIT_AUDIO:音频
    • SDL_INIT_VIDEO:视频
    • SDL_INIT_JOYSTICK:摇杆
    • SDL_INIT_HAPTIC:触摸屏
    • SDL_INIT_GAMECONTROLLER:游戏控制器
    • SDL_INIT_EVENTS:事件
    • SDL_INIT_EVERYTHING:包含上述所有选项
  • SDL Window显示:SDL视频显示函数简介:
    • SDL_Init():初始化SDL系统
    • SDL_CreateWindow():创建窗口SDL_Window
    • SDL_CreateRenderer():创建渲染器SDL_Renderer
    • SDL_CreateTexture():创建纹理SDL_Texture
    • SDL_UpdateTexture():设置纹理的数据
    • SDL_RenderCopy():将纹理的数据拷贝给渲染器
    • SDL_RenderPresent():显示
    • SDL_Delay():工具函数,用于延时
    • SDL_Quit():退出SDL系统
  • SDL Windows显示:SDL数据结构简介:
    • SDL_Window 代表了一个“窗口”
    • SDL_Renderer 代表了一个“渲染器”
    • SDL_Texture 代表了一个“纹理”
    • SDL_Rect 一个简单的矩形结构

注意:存储RGB和存储纹理的区别:

  • 比如一个从左到右由红色渐变到蓝色的矩形,用 存储RGB的话就需要把矩形中每个点的具体颜色 值存储下来;而纹理只是一些描述信息,比如记 录了矩形的大小、起始颜色、终止颜色等信息, 显卡可以通过这些信息推算出矩形块的详细信息。所以相对于存储RGB而已,存储纹理占用的内存 要少的多。

好了有了上面的介绍,下面先演示第一个demo:

代码语言:javascript
复制
#include <stdio.h>
#include <SDL.h>

#undef main
int main()
{
    printf("Hello World!\n");

    SDL_Window *window = NULL;
    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow("SDL Window",
                              SDL_WINDOWPOS_UNDEFINED, //这个让窗口显示在电脑正中间
                              SDL_WINDOWPOS_UNDEFINED,
                              640,
                              480,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
    if(!window)
    {
        printf("can not create the window,error %s\n",SDL_GetError());
        return 1;
    }
    SDL_Delay(10000);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

运行结果,现在这个窗口啥东西都没有:

这里稍微注意一些,要把动态库拷贝到当前构建的build文件下,不然运行会报错:

下面是在窗口里面添加了东西,这个添加流程是这样的:

下面是更为复杂的demo:

代码语言:javascript
复制
#include <stdio.h>
#include <SDL.h>
#undef main
int main()
{
    int run = 1;
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;
    SDL_Texture *texture = NULL;
    SDL_Rect rect; // 长方形,原点在左上角
    rect.w = 50;    //方块大小
    rect.h = 50;

    SDL_Init(SDL_INIT_VIDEO);//初始化函数,可以确定希望激活的子系统

    window = SDL_CreateWindow("2 Window",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              640,
                              480,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);// 创建窗口

    if (!window)
    {
        return -1;
    }
    renderer = SDL_CreateRenderer(window, -1, 0);//基于窗口创建渲染器
    if (!renderer)
    {
        return -1;
    }

    texture = SDL_CreateTexture(renderer,
                                   SDL_PIXELFORMAT_RGBA8888,
                                   SDL_TEXTUREACCESS_TARGET,
                                   640,
                                   480); //创建纹理

    if (!texture)
    {
        return -1;
    }

    int show_count = 0;
    while (run)
    {
        rect.x = rand() % 600;
        rect.y = rand() % 400;

        SDL_SetRenderTarget(renderer, texture); // 设置渲染目标为纹理
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 纹理背景为黑色
        SDL_RenderClear(renderer); //清屏

        SDL_RenderDrawRect(renderer, &rect); //绘制一个长方形
        SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255); //长方形为白色
        SDL_RenderFillRect(renderer, &rect);

        SDL_SetRenderTarget(renderer, NULL); //恢复默认,渲染目标为窗口
        SDL_RenderCopy(renderer, texture, NULL, NULL); //拷贝纹理到CPU

        SDL_RenderPresent(renderer); //输出到目标窗口上
        SDL_Delay(300);
        if(show_count++ > 30)
        {
            run = 0;        // 不跑了
        }
    }

    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window); //销毁窗口
    SDL_Quit();
    return 0;
}

最终演示效果:

总结:

好了,本期的内容就分享到这里了,我是txp,我们下期见!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 txp玩Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SDL相关介绍:
  • 二、两个demo实战演练:
  • 总结:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档