大家好,我是txp,今天给大家分享一篇关于SDL的技术文章;在写文章之前呢,分享一本目前空闲时间在看的一本关于h265的书籍:
如果喜欢纸质的朋友,可以去某宝上买二手,我买过来的,几乎是新的,书籍内容蛮不错!
当然如果你喜欢看原标准的话,可以到ITU官网上去查看源文档:
https://www.itu.int/rec/T-REC-H/e
关于其它H系列标准都可以看。
首先下来介绍一下什么是SDL;SDL(Simple DirectMedia Layer)是一套开发源代码的跨平台多媒体开发库,使用c写出的;SDL它提供了多种控制图像、声音、输出输入的函数接口,让开发者只要用相同或者是相似的代码就可以开发出跨多个平台,比如说Linux、Windows、Mac Os 等操作系统平台;它的应用领域主要包括:游戏开发,模拟器、媒体播放器等多媒体应用领域。
关于更多SDL的详细了解,您可以访问官网进行更加详细的了解:
https://www.libsdl.org/
相关开发接口文档说明:
http://wiki.libsdl.org/Introduction
下面我们开始下载SDL并搭建windows开发环境,环境是基于qt平台上
下载SDL相关开发库:
https://www.libsdl.org/download-2.0.php
开发库下载
然后下面我从零开始搭建一个SDL工程(手把手的那种),实际动手操作,你只需按照下面的图片流程来就行:
1
2
3
4
最后我们这个工程就创建完毕,然后把刚才下载的SDL开发库放到当前工程目录下:
然后进行配置pro文件:
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库的路线是在:
最后整个工程就配置完成了。
首先简单演示一个SDL窗口显示,这个窗口是最原始的,啥都没有。
在做演示之前,非常有必要简单介绍一下相关接口和说明:
注意:存储RGB和存储纹理的区别:
好了有了上面的介绍,下面先演示第一个demo:
#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:
#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,我们下期见!