前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SDL系列讲解(四) demo讲解

SDL系列讲解(四) demo讲解

作者头像
用户1263308
发布2018-02-02 10:57:10
1.5K0
发布2018-02-02 10:57:10
举报
文章被收录于专栏:代码GG之家代码GG之家

整体流程框架

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

#include "SDL.h"

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

代码语言:js
复制
 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子系统

代码语言:js
复制
    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平台的实现细节。

代码语言:js
复制
    // 创建一个窗口
    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将一张图片贴到纹理上,创建一个纹理对象。

代码语言:js
复制
    // 创建一个Texture
    SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, bmp);

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

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

代码语言:js
复制
    //设置图片中的白色为透明色
    SDL_SetColorKey(bmp, SDL_TRUE, 0xffffff);

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

代码语言:js
复制
    //清除所有事件
    SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);

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

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

代码语言:js
复制
        //使用红色填充背景
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
        SDL_RenderClear(renderer);

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

代码语言:js
复制
        // 将纹理布置到渲染器
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        // 刷新屏幕
        SDL_RenderPresent(renderer);

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码GG之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 整体流程框架
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档