美文网首页android干货分享Android知识
SDL系列讲解(四) demo讲解

SDL系列讲解(四) demo讲解

作者: 代码GG陆晓明 | 来源:发表于2017-10-10 20:46 被阅读60次

    整体流程框架

    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的整体流程。

    相关文章

      网友评论

        本文标题:SDL系列讲解(四) demo讲解

        本文链接:https://www.haomeiwen.com/subject/hcvbyxtx.html