http://blog.csdn.net/visioncat/article/details/1596576

GCC for Win32 开发环境介绍(5)

第四章 跨平台图像显示库——SDL

第一节 与SDL第一次亲密接触

SDL,也就是 Simple DirectMedia Layer 是一个针对 声音,键盘,鼠标,遥杆,通过OpenGL的3D以及2D处理的底层跨平台函数库。她主要支持的平台有Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, 和QNX. 。当然,还有一些非官方的支持平台。

总体来说,SDL对于图像的处理性能还是不错的,而且能在基本不修改代码的情况下,能支持多平台的编译。这点的确是非常不错的。如果你想开发什么跨平台的游戏之类的,SDL确实是一个不错的选择。其次,SDL是用C写的,所以也可以得到很多其他语言的支持,主要有Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, 和 Smalltalk

SDL的官方网站是 http://www.libsdl.org 我们可以从她的官网上免费获得其源代码和编译成功的库。其他的还有一些Demo,文档,基于SDL所扩展出来的库,成功的案例等等很多SDL的资料。

SDL的使用概览

在正式使用中SDL的易用性也是显而易见的。通过一些简单的代码便能够编写出图形的显示程序。而且,SDL的编程思想也是很容易理解的。

SDL的程序代码主要有四部分组成。她们分别是 初始化阶段,程序运行阶段,事件等待与处理阶段,资源释放阶段。

初始化阶段,主要完成程序的初始化工作。如SDL的函数初始化,还有程序自身的一些初始化操作,如窗口的建立,背景色的设置,等等。程序运行阶段,主要完成程序中所需要的媒体载入,和显示等,比如窗口的初始化内容的刷新等。事件等待与处理阶段,主要是用于等待窗口 键盘 摇杆 鼠标等事件然后更具程序所设定的进行相关的操作处理。资源释放阶段,主要用于释放程序中所用到的系统资源,如image图片资源的释放等。

这四个阶段的代码是非常容易实现,而且有一定的格式和方法。所以,相对来说虽然SDL的功能强大,但是代码的编写也还是比较清晰和简便的。

SDL库的编译与安装

SDL的安装分为两种,一种为从源码编译出库,然后安装。另一种是直接使用官网上为我们编译好的SDL库。下面我一一介绍不同的安装方式。

我们先来看看从源码编译安装的过程。

我们要从SDL的官方网站下载 SDL-1.2.x.tar.gz 。然后从MinGW的官方网站上下载MSYS-1.0.10.exe和msysDTK-1.0.1.exe。第一个为SDL的源代码,第二个和第三个为MinGW的POSIX接口。如果你准备在Cygwin下编译,那么第二,第三个包就不需要下载安装了。

解压缩源码包到一个目录下,然后开启你的SH,切换到你SDL源代码所保存的目录下。然后输入如下的一组命令。

$./configure

$make

上面两条指令就让你的GCC编译出了SDL。如果你使用的是MinGW,那么可以将include,lib,bin目录复制出来。这里我假设我们复制到 $(SDL) 目录中。如果你使用的是Cygwin,那么你需要输入如下命令让Cygwin自动安装。

$make install

当然,MinGW也是可以通过这种方式安装的。这样,SDL将安装入MinGW的MSYS安装目录中。

你也可以从官方网站上下载已经编译好的开发库。所要是SDL的开发库 SDL-devel-1.2.x-mingw32.tar.gz。将开发包里的东西解压缩到 $(SDL)目录中。

通过以上两种方式,我们就已经将SDL的开发环境正常安装到我们的机器上了。

当然,最后别忘记把SDL.dll这个文件复制到系统目录下,或者放在环境变量PATH所指向的一个目录中,亦或是你主程序所在的目录下。这样你的SDL程序才可以正常运行。

一个简单的SDL例子

下面给出一个SDL例子程序的源代码,以及他的Makefile文件,我们可以从Makefile文件中很直观的看到编译程序所需要的参数。

下面是C的例子代码

//main.c

#include <stdio.h>

#include <stdlib.h>

#include <SDL.h>

int main(int argc, char *argv[]){

SDL_Surface *screen;

SDL_Event event;

int isRun=1;

SDL_Init(SDL_INIT_VIDEO);

screen=SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);

SDL_Flip(screen);

while(isRun){

SDL_WaitEvent(&event);

switch (event.type){

case SDL_QUIT:

isRun=0;

break;

}

}

SDL_FreeSurface(screen);

return(0);

}

下面是Makefile文件。

#Makefile

SDL_INCLUDE=$(SDL)/include

SDL_LIB=$(SDL)/lib/

all:

gcc -I$(SDL_INCLUDE) -c main.c -o main.o

gcc -L$(SDL_LIB) -o main main.o -lmingw32 -lSDLmain -lSDL

你所双击运行你所编译出来的程序,你将会看到一个类似于如下图所示的窗口。

上面那组代码的结构就是一个比较典型的SDL的代码格式。

初始化阶段

SDL_Surface *screen;

SDL_Event event;

int isRun=1;

SDL_Init(SDL_INIT_VIDEO);

程序运行阶段

screen=SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);

SDL_Flip(screen);

事件等待与处理阶段

while(isRun){

SDL_WaitEvent(&event);

switch (event.type){

case SDL_QUIT:

isRun=0;

break;

}

}

资源释放阶段

SDL_FreeSurface(screen);

至此,我们有关SDL库的简单介绍就到这里了。其实,SDL还有很多东西。我们将在后面的章节详细介绍SDL的神气功能。

文外音:

感觉自从上一篇文章至今已经过去很久了。其实最近感觉蛮忙的吧。但我也不知道自己忙点什么。不过这些日子所经历的事情也很多,感悟也很多。但是,心情却被这些事情弄的很不好。也许正像我所说的,光来到世界,世界却因为黑暗不来接受光,反而弃绝光。可如今作为一个普通人的我又能怎么样呢?争取我所爱的?还是等待所爱的?我向来不喜欢和人争,总认为该是我的,总会是我的,不该是我的怎么努力也是无用的。可是如今我却觉得也许我错了吧。呵呵,不游戏,不抽烟,不喝酒的我看来真的只适合搞搞技术什么的吧。

最后还是感谢各位一直以来的支持。同时,如果您有任何的问题和建议都可以提出来。为了您能及时准确的获得回复,请到http://nirvana.cublog.cn上,或者http://blog.csdn.net/visioncat上发表你的留言。谢谢。当然,还要为我那么长时间没来更新表示歉意。

第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触的更多相关文章

  1. 大道至简第一章和java理论学时第一节。感受。

    这周上了本学期的第一节java课程.课件上说了一些学习java的基本思想.举了个“愚公移山”的例子.这可能就像刚接触一门新的语言,来练习输出“HelloWorld”一样,已成惯例. “愚公移山”的这个 ...

  2. 《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第一节 - 关键类作用及关系

    MonkeyRunner框架暴露了几个类的大量的API出去给用户编写脚本时候使用,其中最主要的三个就是: MonkeyDevice目标设备操作类,HierarchyViewer窗口界面对象操作类以及M ...

  3. CentOS 7.4 初次手记:第四章 CentOS安全了解

    第四章 CentOS安全了解... 66 第一节 user.group.chmod. 66 I 10位文件属性... 66 II user/group增删改... 67 III user/group配 ...

  4. Python--Redis实战:第四章:数据安全与性能保障:第7节:非事务型流水线

    之前章节首次介绍multi和exec的时候讨论过它们的”事务“性质:被multi和exec包裹的命令在执行时不会被其他客户端打扰.而使用事务的其中一个好处就是底层的客户端会通过使用流水线来提高事务执行 ...

  5. sencha touch 在线实战培训 第一期 第一节

    经过忙碌的准备,终于在2013.12.28晚上8点开了第一节课. 第一次讲课有些小紧张,讲的内容也比较基础,不过算是开了一个好头. 本期培训一共八节,前三堂免费,后面的课程需要付费才可以观看. 本节内 ...

  6. 《OpenCL异构并行编程实战》补充笔记散点,第一至四章

    ▶ 总体印象:适合 OpenCL 入门的书,有丰富的代码和说明,例子较为简单.先把 OpenCL 代码的基本结构(平台 → 设备 → 上下文 → 命令队列 → 创建缓冲区 → 读写缓冲区 → 编译代码 ...

  7. Unity 游戏框架搭建 2019 (五十二~五十四) 什么是库?&第四章总结&第五章简介

    在上一篇,我们对框架和架构进行了一点探讨.我们在这一篇再接着探讨. 什么是库呢? 来自同一位大神的解释: 库, 插到 既有 架构 中, 补充 特定 功能. 很形象,库就是搞这个的.我们的库最初存在的目 ...

  8. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  9. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

随机推荐

  1. Javac早期(编译期)

    从Sun Javac的代码来看,编译过程大致可以分为3个过程: 解析与填充符号表过程. 插入式注解处理器的注解处理过程. 分析与字节码生成过程. Javac编译动作的入口是com.sun.tools. ...

  2. SU suspike命令学习

    用默认参数生成的数据如下: 用别的软件打开数据查看, 依次查看4个脉冲的位置(第几道.出现的时间), 接下来我们做一些小练习,比如说在同一道上放两个脉冲 还可以增加道数,让脉冲位于不同地方,

  3. Eddy's digital Roots

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  4. DFS POJ 2676 Sudoku

    题目传送门 题意:数独问题,每行每列以及每块都有1~9的数字 分析:一个一个遍历会很慢.先将0的位子用vector存起来,然后用rflag[i][num] = 1 / 0表示在第i行数字num是否出现 ...

  5. HDU1561 The more, The Better(树形DP)

    题目是有n个存有宝藏的城堡,攻克任何一个城堡都需要先攻克0个或其他1个城堡,问攻克m个城堡最多能得到多少宝藏. 题目给的城堡形成一个森林,添加一个超级根把森林连在一起就是树了,那么就考虑用树型DP: ...

  6. C#控制鼠标位置

    It is not possible using the .NET BCL. However if you really want it you can use native SetCursorPos ...

  7. 详解Adorner Layer(zz)

    首先,千万不要觉得Adorner离你很远,因为最简单的WPF界面也会用到Adorner.在WPF中,下面的几个很常见的功能,都是用Adorner实现的.     1. 光标(caret)     2. ...

  8. Lazy Load, 延迟加载图片的 jQuery 插件【备忘】

    http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/ jQuery Unveil – 另一款非常轻量的延迟加载插件 http ...

  9. TYVJ P1048 田忌赛马 Label:dp

    描述     中国古代的历史故事“田忌赛马”是为大家所熟知的.话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱.现在每匹马的速 ...

  10. GIT用法总结

    1 git中的几种文件状态 a 未被git跟踪的文件,即是没有使用git add添加到git索引的的文件:untracked; b 没有修改但是已经被git跟踪的文件,即是使用git add添加到gi ...