微信号:code_gg_home

介绍:分享技术干货,分享最新新闻动态,分享开心段子,让大家轻松愉快的成长.

SDL系列讲解(四) demo讲解

2017-10-10 08:00 陆晓明

整体流程框架


  SDL作为一款渲染器,我们首先掌握下它的一些基础要素,本文通过渲染一张图片,熟悉SDL的整个流程。

 #include "SDL.h"

扩入我们的头文件,SDL.h是SDL框架向我们提供的一个总包含文件,我们使用SDL提供的方法,都被包含进来。

 int main(int argc, char *argv[]) {

开发过c的代码,都知道这个是入口方法,argc为参数数目,argv[]为参数内容,我们当前没传入参数,所以变量没在main方法内部使用。

    SDL_Window *window; //定义一个窗口

    SDL_Renderer *renderer; //定义一个渲染器

    SDL_Event event;//定义一个事件存储对象

    然后我们使用SDL_Init 方法,传入SDL_INIT_VIDEO来初始化SDL的Video子系统

    if (SDL_Init(SDL_INIT_VIDEO) < 0)

        return 1;

    使用SDL_CreateWindow 创建一个窗口,如果没用初始化过Video,窗口会先初始化Video子系统,然后,进行查找Android平台上的OpenGL es 库,初始化完成,将对应的全局数据赋值,同时将Window和Android上层创建的SurfaceView对应的AnativeWindow通过eGL方法绑定,来完成Window关联。具体代码分析,后续会继续深入,因此,本文不止简单的教你如何使用SDL,还会教你阅读代码,一同分析SDL的Android平台的实现细节。

    // 创建一个窗口

    window = SDL_CreateWindow("SDL_RenderClear",                     SDL_WINDOWPOS_CENTERED,

    SDL_WINDOWPOS_CENTERED, 

    0, 

    0, SDL_WINDOW_SHOWN);


    创建完窗口,需要关联一个渲染器。我们使用SDL_CreateRenderer来完成。

    renderer = SDL_CreateRenderer(window, -1, 0);

    完成了窗口,渲染器之后,我们需要加载图片,将图片渲染上来。我们这里使用SDL_LoadBMP加载一张图,这里如果是相对路径,则会在我们apk的assets目录查找 SDL_Surface *bmp = SDL_LoadBMP("sdl.bmp"); 这里我们加载了一张bmp格式的图片,如果需要加载其他格式的,我们需要使用SDL_image库进行配合,我们现在先使用SDL直接可以加载bmp图片的方式演示。

    加载完图片,我们需要将其存储到一张纹理上来。我们这里使用SDL_CreateTextureFromSurface将一张图片贴到纹理上,创建一个纹理对象。

    // 创建一个Texture

    SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, bmp);

    大家可能注意了,我在创建纹理前面,对我们的图片,使用了一个方法 SDL_SetColorKey,这个方法传入三个参数,图片,是否使能,颜色值。

含义是,如果使能(SDL_TRUE),我们会将图片中对应的颜色值处理成透明色,也就是抠掉了里面的某个颜色。一般用在去除一种底色。这里我们将sdl.bmp图片里面的白色去掉。

    //设置图片中的白色为透明色

    SDL_SetColorKey(bmp, SDL_TRUE, 0xffffff);

     下来我们清除了全部事件,避免在过程中有消息进来。

    //清除所有事件

    SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);

    然后我们进入一个循环,进行渲染。在渲染过程中,我们使用SDL_PollEvent来获取是否有事件传过来,如果有,我们看下,如果是退出,或者有按键或者有手指触摸滑动,我们退出循环。

    如果没有消息,我们执行渲染,具体为:使用SDL_SetRenderDrawColor设置一个渲染颜色,使用 SDL_RenderClear进行填充,完成背景。

        //使用红色填充背景

        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);

        SDL_RenderClear(renderer);

    然后我们使用SDL_RenderCopy将纹理贴到渲染器中,后面的两个参数指定,将纹理的多大区域,复制到渲染器的多大区域,默认为NULL,意思为将整个纹理,贴到整个渲染区域,也即全屏。扔到渲染器之后,我们使用SDL_RenderPresent将渲染器内容,推送到屏幕,完成显示。

        // 将纹理布置到渲染器

        SDL_RenderCopy(renderer, texture, NULL, NULL);

        // 刷新屏幕

        SDL_RenderPresent(renderer);

    如果退出渲染,我们使用一系列的清除动作,完成SDL的退出。这里具体为:使用SDL_FreeSurface释放我们的图片内存,使用SDL_DestroyTexture释放纹理内存,使用 SDL_DestroyRenderer释放渲染器,使用SDL_DestroyWindow释放窗口,然后调用下 SDL_Quit()完全退出SDL。

    以上,便是我们的demo的整体流程。




 
代码GG之家 更多文章 SDL是什么,能干什么,为什么我们要学习它? 如何快速掌握一门新的技术? SDL系列讲解(三) 工具安装 SDL系列讲解(二) 环境搭建 SDL系列讲解(一) 简介
猜您喜欢 软件定义基础架构调查报告发布,Zadara被认为是企业存储即服务的市场领导者 梯度下降法求解线性回归之matlab实现 瞎扯互联网产品观:Low不Low 【深夜食堂】2013年IxDC纪录片 产品培训视频合集(上)|手把手教你使用时速云平台