SDL系列讲解(四) demo讲解

来源:互联网 发布:java webservice 部署 编辑:程序博客网 时间:2024/04/30 22:22


整体流程框架

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

原创粉丝点击