SDL 如何显示图片及背景图片

SDL 如何显示图片及背景图片

甲: 下载安装SDL 源码,

由于github 网速太慢,下不下来,我从ubuntu 源上下载
$ sudo apt-get source libsdl2-dev
解压缩得到的文件 libsdl2_2.0.10+dfsg1-3.debian.tar.xz
$ tar -xvf libsdl2_2.0.10+dfsg1-3.debian.tar.xz
打开其README.txt
Simple DirectMedia Layer is a cross-platform development library designed
to provide low level access to audio, keyboard, mouse, joystick, and graphics
hardware via OpenGL and Direct3D. It is used by video playback software,
emulators, and popular games including Valve’s award winning catalog
and many Humble Bundle games.

SDL为通过OpenGL和Direct3D 进行的硬件层包装,
提供音频,键盘,鼠标,游戏杆和图形访问
跨平台
视频播放软件,仿真器及游戏都使用它.

顺便看看其Docs下文件, 没有什么东西.
后面就只有src目录令人感兴趣了. 查了一下,包含17万c代码,5000c++代码,因为跨平台,
所以能看到某些linux,windows,mac,andriod 等与平台有关的文件
另外include 目录下,还有3万多行.h 头文件, 项目比较大,令人意外. 还是先研究一下它的使用吧.

它的test 目录下有80个测试文件,这是一个很好的入门的地方,不过东西还是太多。可以先看几个简单的,
有时间可以到这里来玩玩,有很多功能需要再这里深究学习!

先来具体分析一个实例吧,如果就得从典型实例开始。

乙. 从github 上下载了一个项目

https://github.com/Twinklebear/TwinklebearDev-Lessons.git
向屏幕提交一个背景图(4块平铺)及一个前景图
分析几个关键调用.

1. 初始化:SDL_Init()

操作之前都要做初始化,意思是"预备,开始",编程人都直到.
例如: SDL_Init(SDL_INIT_VIDEO);

2. 创建SDL_Window:SDL_CreateWindow()

SDL 并不是直接向屏幕画图,然是把屏幕分割为窗口,向窗口画图.
当今窗口横行天下,我也就不多说了. 窗口的关键要素是位置,大小.
例如: 再100,100位置,创建一个640*480的窗口,立即显示.
SDL_CreateWindow(“Lesson2”,100,100,640,480,SDL_WINDOW_SHOWN);
“Lesson2” 是窗口title (窗口显示标题)

3. 创建SDL_Render:SDL_CreateRenderer()

SDL 并不是向窗口直接画图,而是向Render 画图。
Render 是什么? Render 可以翻译成提交. 它是向屏幕的某一次提交。
复杂就是这么来的,功能强大也是这么来的,屏幕被划分为窗口,窗口又被划分为提交
提交并不是空间上的分割,而是次数上的分割,也可以理解为时间上分割,就是你可以用你的render向这个窗口提交,我也可以用我的render向这个窗口提交。提交实际上是对应着一块内存.
下面看看如何创建一个提交(render)
例如: SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC);
-1 表示是第一个提交, 提交方式flag表示可以使用硬件加速和与VSYNC 同步,笔记本电脑VSYNC 场频通常是60HZ

你可以清空render
SDL_RenderClear(render);
也可以由render向窗口提交
SDL_RenderPresent(render);

4. 创建SDL_Texture:SDL_CreateTexture()

Texture 又是什么玩意? 嗯,它翻译成纹理,是要向屏幕提交的数据. 例如你要想向屏幕
提交一幅bmp图像或者png图像,需要把图像变成相对应的纹理就可以了.
例如: SDL_Surface *bmpSurface = SDL_LoadBMP(bmpfile_path); // 直接加载的bmp文件只能得到surface
SDL_Texture *texture=SDL_CreateTexureFromSurface(render,bmpSurface); //转换一下变成texture,texture 是与render关联的
texture 可以向render 来提交。

4.1: texture 是有大小属性的. 另外还有format属性及access属性,我们这两个传NULL先不管

SDL_QueryTexture(tt_background,NULL,NULL,&bW,&bH);

5.Texture 怎样向Render 来提交? 这里学名叫渲染.通过SDL_RenderCopy()来进行

例如: SDL_RenderCopy(render,texture,NULL,&dst); //src_rect is all, dst size is same as src
这里的NULL是说的texture 矩形,给NULL 即是全texture矩形,dst 是render 矩形,通常我们是1:1来bitblit的.
计算目标位置x,y, 计算源位置x,y及w,h(有可能texture并不是完全提交)往往会成为一部分代码量.

6. 显示:SDL_RenderPresent(render)

将render 的变化更新到窗口上显示出来.

7. 与用户交互.SDL_Event

例如:
SDL_Event e;
SDL_PollEvent(&e)
switch(e.type)
{
case SDL_QUIT:
case SDL_KEYDOWN:
case SDL_MOUSEBUTTONDOW:
}
进一步事件划分:以按键事件为例
例如对SDL_KEYDOWN 继续分割:
switch (e.key.keysym.sym){
case SDLK_1:
case SDLK_KP_1: // 这些是键码->按键编码值
break;
case SDLK_2:
case SDLK_KP_2:
break;
case SDLK_3:
case SDLK_KP_3:
break;
case SDLK_4:
case SDLK_KP_4:
break;
case SDLK_ESCAPE:
break;
default:
break;
}
其中e.key 是SDL_KeyBoardEvent
e.key.keysym 是按下或抬起的按键,类型SDL_keysym
e.key.keysym.sym 是虚拟键码, 它是被SDL 重新映射过的(为使用方便), 与scancode有一定的对应关系.
当然你也可以直接使用scancode. 即e.key.keysym.scancode, scancode数值是与键盘直接对应的

根据事件类型及具体事件来进行程序分支。

参考代码:
https://github.com/Twinklebear/TwinklebearDev-Lessons.git
我稍有修改的代码
https://download.csdn.net/download/hejinjing_tom_com/86880725
参考结果图片
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值