SDL编程入门(6)扩展库SDL_image
标签: SDL2 教程中心 sdl2 sdl_image C语言 图形开发
扩展库 SDL_image
SDL扩展库允许你做一些事情,比如加载BMP以外的图像文件,渲染TTF字体,以及播放音乐。您可以设置SDL_image来加载PNG文件,这可以为您节省大量的磁盘空间。在本教程中,我们将介绍如何安装SDL_image。
SDL本身是一个扩展库,因为它增加了游戏和媒体功能,而这些功能并不是你的C++编译器的标准配置。当你设置扩展库的时候,你会发现它和单独安装SDL几乎是一样的。我们将特别安装SDL_image,但如果你能安装该扩展库,你应该能够安装任何一个扩展库。
您需要做的第一件事是下载SDL_image头文件和二进制文件。您可以在SDL_image网站上找到它们

在设置好SDL_image之后,我们将介绍如何使用SDL创建加载PNG。
现在库已经全部设置好了,让我们加载一些PNG。
//使用SDL、SDL_image、标准IO和字符串。
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
要使用任何 SDL_image 函数或数据类型,我们需要包含 SDL_image 头。对于SDL_ttf,或者SDL_mixer,我们也要做同样的事情。
bool init(){
//Initialization flag
bool success = true;
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Create window
gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
if( gWindow == NULL )
{
printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//初始化PNG加载
int imgFlags = IMG_INIT_PNG;
if( !( IMG_Init( imgFlags ) & imgFlags ) )
{
printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() );
success = false;
}
else
{
//Get window surface
gScreenSurface = SDL_GetWindowSurface( gWindow );
}
}
}
return success;
}
现在我们使用SDL_image,我们需要初始化它。这里我们想用PNG加载来初始化SDL_image,所以我们将PNG加载标志传递给IMG_Init。IMG_Init返回成功加载的标志。如果返回的标志不包含我们要求的标志,那就意味着出现了错误。
当SDL_image出现错误时,你会用IMG_GetError得到错误字符串,而不是SDL_GetError。
Also:
STOP E-MAILING ME TELLING ME THAT THAT CALL TO IMG_Init IS A BUG!
STOP E-MAILING ME TELLING ME THAT THAT CALL TO IMG_Init IS A BUG!
STOP E-MAILING ME TELLING ME THAT THAT CALL TO IMG_Init IS A BUG!
STOP E-MAILING ME TELLING ME THAT THAT CALL TO IMG_Init IS A BUG!
STOP E-MAILING ME TELLING ME THAT THAT CALL TO IMG_Init IS A BUG!
不是的,IMG_INIT_PNG是2。如果你用IMG_INIT_PNG初始化,然后得到IMG_INIT_PNG,你得到的是2 & 2,也就是2。2会被评估为true, !否定它,这意味着它会被评估为false ,这将导致SDL_GetWindowSurface行执行。
如果你想从IMG_Init取回4,而你想要的是2,那么4 &2是0,它的值是false,这就被 ! 否定了,它的值是true,这将导致错误打印代码的执行。
如果当你想要2的时候,从IMG_Init中取回6(包括4和2位),6 & 2是2,它的值为true,被 !否定为false,这将导致SDL_GetWindowSurface一行执行。
代码之所以是这样,是因为我们只关心PNG加载位。如果我们得到了,就意味着我们可以继续。在其他情况下,这段代码会有所不同,但我们在这里不处理这个问题。
所以一定要把你的二进制数学学好,不要再发邮件告诉我说调用IMG_Init是个BUG!。说真的,我收到的错误报告中,有25%是这样的。
SDL_Surface* loadSurface( std::string path ){
//The final optimized image
SDL_Surface* optimizedSurface = NULL;
//Load image at specified path
SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
if( loadedSurface == NULL )
{
printf( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError() );
}
else
{
//Convert surface to screen format
optimizedSurface = SDL_ConvertSurface( loadedSurface, gScreenSurface->format, 0 );
if( optimizedSurface == NULL )
{
printf( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
}
//Get rid of old loaded surface
SDL_FreeSurface( loadedSurface );
}
return optimizedSurface;
}
我们的图像加载功能和以前差不多,只是现在它使用IMG_Load而不是SDL_LoadBMP。IMG_Load 可以加载许多不同类型的格式,你可以在 SDL_image 文档中找到相关信息。和IMG_Init一样,当IMG_Load出现错误时,我们调用IMG_GetError来获取错误字符串。
在 这里下载本教程的媒体和源代码。
关注我的公众号:编程之路从0到1

智能推荐
python Kivy SDL2报错: Unable to load image
python Kivy SDL2报错: Unable to load image 国内玩kivy的真的很少,教程也少。 断断续续弄了两天,终于弄好了 首先看一下我的报错 首先检查一下下面这几个模块你的pycharm里面有没有 如果都有的话,在你代码最前面加上 重点 一定要在调用kivy模块之前加 这样基本上就没问题了 如果还是报错就试试 希望帮助那些同样找不到解决问题的人。 . . . . . 参...
C语言SDL基础库扩展开发-动态显示鼠标的位置信息
原文地址:https://my.oschina.net/freestyletime/blog/166826 今天要讲的是,把鼠标的位置在SDL窗口上动态的显示,也就是画在窗口上。这里要用到SDL的其中一个extension library叫做SDL_ttf,用于把文字渲染到屏幕上,在http://www.libsdl.org/projects/SDL_ttf/release-1.2.html有下载...
FFmpeg+SDL---SDL视频显示
四章SDL视频显示 在阅读这章节之前建议先读:FFmpeg+SDL-----学习大纲 目录 • 视频显示知识 • SDL简介 • VC下SDL开发环境的搭建 • 示例程序运行 • SDL视频显示的函数 • SDL视频显示的数据结构 • 进阶-示例程序运行 • 进阶-SDL中多线程和事件 • 练习 视频显示知识...
CORDIC arithmetic
传统CORDIC算法code Verilog代码: 时钟为50Mhz; 输出设置均设置为有符号数,主要是因为计算CORDIC算法时,需要判断Z通道的符号,来得到迭代过程中旋转方向。 然后根据缩放因子和arctan 2^-n 的预定义并乘以2^16 来进行后续计算,根据迭代方程写出代码;最后将(0度到90度)中正弦值与余弦值来扩大至(0度至360度)的正弦值与余弦值。 编写的tb文件如下: 最终使用...
猜你喜欢
dubbo源码解析-线程通讯原理
本来想通过Debug从头屡,发现意义不大,还是写点主通讯流程吧 本文基于JDK1.8;dubbo2.7.5 线程通讯原理 解释总体流程: DubboInvoker#doInvoker(Invocation)发起request,进入HeaderExchangeChannel 初始化Request对象(Dubbo自己封装的),初始化DefaultFuture将Request、channel放入,并记录...
使用Intellij Idea+Gradle 搭建Java 本地开发环境
Java 本地开发环境搭建 项目搭建采用技术栈为:Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6 搭建环境文档目录结构说明: 使用Intellj Idea 搭建项目过程详解 项目各配置文件讲解及部署 各层包功能讲解&项目搭建完毕最终效果演示图 项目中重要代码讲解 5.配置tomcat 运行环境 6.webapp文件夹下分层详解 ...
js中array数组除重最快的方式(100万数据量下测试)
模拟100万数据 测试1 for循环 + in 运算符 (不是 for…in 循环) 测试2 双层for循环 (太慢了) while …同理。 测试3 for循环 + arr.indexof()判断 测试4 for…in循环 + in 运算符 测试结果...
轻量级java服务器undertow
项目需求 服务器端项目是用mina写的传统socket,准备升级到支持websocket接入。 为什么采用undertow 1、Undertow 是基于 NIO 的高性能 Web 嵌入式服务器,并且支持websocket(这个很重要,只要把undertow集成到项目中,用undertow启用websokcet,然后把原来的socket切换到websocket。) 2、轻量级web服务器:多么轻量级...
Task01:基于逻辑回归的分类预测
逻辑回归模型的优劣势: 优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低; 缺点:容易欠拟合,分类精度可能不高 https://zhuanlan.zhihu.com/p/74874291 与 SVM 相同点 都是分类算法,本质上都是在找最佳分类超平面; 都是监督学习算法; 都是判别式模型,判别模型不关心数据是怎么生成的,它只关心数据之间的差别,然后用差别来简单对给定的一个数据进行...
