SDL学习笔记之Hello world

什么是SDL?

SDL,英文全称(Simple DirectMedia Layer), 是一套开放源代码的跨平台多媒体开发库。SDL提供了数种控制图像、声音输入输出的函数,目前多用于媒体播放器、游戏开发等多媒体应用领域。

目前的稳定版本是2.0.4,与1.2.x版本接口差别很大。

开始接触SDL主要是因为最近在看雷霄骅博士的文章《最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)》,里面用到了很多SDL的东西,决定系统的了解下SDL。研究了两天,我最大的感受就是SDL使用简单方便,可以很轻松的绘制窗口、加载图片、视频等等。

安装SDL

Ubuntu: sudo apt-get install libsdl2-dev Mac: brew install sdl2 其他PC类似以上操作。

SDL的Hello world

学习内容主要参考官方wiki上给的参考手册, 在此主要做一个简单的翻译和整理。直接贴代码,在代码上进行说明:


#include <stdio.h>
// 引入头文件,地址根据安装地址结合Makefile地址而定
#include <SDL2/SDL.h>

/**
 * 主要功能:创建窗口并加载BMP图像
 */


int main(int argc, char *argv[])
{
    /**
     * SDL的初始化,参数可以根据使用需要加入各种不同的标志位。
     * 这里仅初始化音视频相关模块。
     * 如果视频模块被初始化了,那么事件处理系统会自动被初始化。
     * 文件IO和线程模块自动初始化。
     */
    if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)<0)
    {
        printf("Unable to initialize SDL: %s \n", SDL_GetError());
        exit(1);
    }

    /**
     * 创建窗口,用于显示渲染的图像。
     * 第一个参数是窗口的标题
     * 第二三个参数分别是窗口的x和y坐标
     * 第四五个参数是要绘制的窗口的宽度和高度
     * 最后一个参数是设置窗口的属性信息
     * 返回一个SDL_Window*, 若有错误返回NULL。
     * 相关参数可以查看WIKI的接口说明:http://wiki.libsdl.org/SDL_CreateWindow
     */
    SDL_Window *win = SDL_CreateWindow("Hello, world!", 100, 100, 640,480,SDL_WINDOW_SHOWN);
    if(win == NULL) {
        printf("SDL_CreateWindow Error: %s \n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    /**
     * 初始化渲染上下文。
     * 第一个参数与窗口建立关联
     * 第二个参数指定渲染驱动,如果是-1的话,就初始化满足标志位需求的第一个
     * 第三个参数标志位用来指定我们想要哪种渲染器
     * 返回一个SDL_Renderer*, 若有错误返回NULL
     * 相关参数可以查看WIKI的接口说明:http://wiki.libsdl.org/SDL_CreateRenderer 
     */

    SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (ren == NULL) {
        SDL_DestroyWindow(win);

        printf("SDL_CreateRenderer Error: %s \n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    /**
     * 加载本地BMP图片,返回一个Surface。
     * SDL只提供了BMP图片的加载,要加载其他图片,可以使用扩展库SDL_image
     * 若返回NULL,则以此回收和释放上面申请的内存空间,并关闭SDL。下同
     */
    SDL_Surface *bmp = SDL_LoadBMP("test.bmp");
    if(bmp == NULL) {
        SDL_DestroyRenderer(ren);
        SDL_DestroyWindow(win);
        printf("SDL_LoadBMP Error: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    /**
     * 根据Surface创建纹理,然后释放Surface,释放内存
     */
    SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
    SDL_FreeSurface(bmp);
    if(tex == NULL) {
        SDL_DestroyRenderer(ren);
        SDL_DestroyWindow(win);
        printf("SDL_CreateTextureFromSurface Error: %s \n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    /**
     * 使纹理显示在屏幕上
     * 分三步:1. 清空渲染器;2. 渲染纹理;3.显示纹理
     * 使用了延迟让图片在窗口关闭前显示
     * 后续会有Event处理机制来更好的处理此类问题
     */
    for (int i = 0; i < 3; ++i) {
        SDL_RenderClear(ren);
        // 此时让整个图片充满整个窗口,所以后两个参数为空。
        // 可以根据后两个参数指定图片位置,后面再整理相关demo说明
        SDL_RenderCopy(ren, tex, NULL, NULL);
        SDL_RenderPresent(ren);
        // 设置1000毫秒的延迟,否则窗口会立马关闭,导致看不到图像
        SDL_Delay(1000);
    }
    /**
     * 释放各种指针并退出SDL
     */
    SDL_DestroyTexture(tex);
    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

简单配个Makefile

INCPATH=-I /usr/include
LIBPATH=-L /usr/lib
FLAG=-lSDL2main -lSDL2 -std=c++11

all:
	gcc -o main main.cpp $(FLAG) $(INCPATH) $(LIBPATH)
clean:
	rm -rf main

完整程序会在github上更新:https://github.com/vrcoder/learning_SDL

参考资料

Search
categories
Support This Site

非常欢迎光临我的博客,希望对你有帮助!