SDL
文章平均质量分 78
程序心声
代码就是情人
你不会的东西,觉得难的东西,一定不要躲。先搞明白,后精湛,你就比别人优秀了。因为大部分人都不舍得花力气去钻研,自动淘汰,所以你执着的努力,就占了大便宜。奋斗就是每一天都很难,可一年比一年容易。不奋斗就是每一天都很容易,可一年比一年越难。怕吃苦的人吃苦一辈子,不怕吃苦的人吃苦一阵子。拼一个春夏秋冬,赢一个无悔人生。
傲行人生路
平凡而简单的人一个,无权无势也无牵无挂。一路厮杀,只进不退,死而后已,岂不爽哉!
收起对“车”日行千里的羡慕;收起对“马”左右逢缘的感叹;目标记在心里面,向前进。一次一步,一步一脚印,跬步千里。
这个角色用于劝勉现在的我。
展开
-
SDL入门教程(一):1、一切从零开始
作者:龙飞 1.1:SDL是什么? SDL是Simple DirectMedia Layer(简易直控媒体层)的缩写。它是一个跨平台的多媒体库,以用于直接控制底层的多媒体硬件的接口。这些多媒体功能包括了音频、键盘和鼠标(事件)、游戏摇杆等。当然,最为重要的是提供了2D图形帧缓冲(framebuffer)的接口,以及为OpenGL与各种操作系统之间提供了统一的标转载 2012-09-07 13:25:25 · 1280 阅读 · 0 评论 -
SDL入门教程(九):4、int转换为std::string
作者:龙飞 我下面考虑的问题,是用TextSurface反馈鼠标事件的信息。我想到的第一个例子,很自然就是反馈鼠标所在坐标的位置。这里涉及到一个基础的问题,即鼠标位置显然不是用字符串表示的。SDL给我们的反馈信息是int,我们需要用TextSurface将int构建成可以被blit到ScreenSurface上的面,需要做的第一件事情,是将int转换为string。转载 2012-09-11 13:01:12 · 940 阅读 · 0 评论 -
SDL入门教程(九):3、文本反馈“按键”信息
作者:龙飞3.1:一些小的修改 我觉得写C++的程序,一是看起来确实比较C++一点,二是相对于C的“精炼”,C++要的是“健壮”。所以,其实我不太满意用C风格字符串作为ScreenSurface的成员数据,所以做了修改。这也是为了在程序中构建ScreenSurface对象的时候可以使用string。class ScreenSurface{pri转载 2012-09-11 13:00:16 · 772 阅读 · 0 评论 -
SDL入门教程(十):4、用iconv获得正确的Unicode,使用FriBiDi实现UTF-8到Unicode的正确转换
作者:龙飞4.1:为什么iconv不能完全正确的转换Unicode? 我不是先知,教程里面是整理过的思路和逻辑顺序,在我研究这个问题的时候,头绪远远比教程里面乱得多。我完全是从Wesnoth的源代码去分析问题的,所以,为什么会扯上UTF-8和FriBidi,那也是因为在源代码中找到了线索。 iconv不能完全正确的获得Unicode,也就是我们刚才遇转载 2012-09-11 13:06:03 · 838 阅读 · 0 评论 -
SDL入门教程(十):3、字符集之间的转换,win32下的libiconv
作者:龙飞3.1:GNU的libiconv项目http://www.gnu.org/software/libiconv/ 再一次的,感谢伟大的GNU。我们需要的是Unicode码,在程序中转换,我们需要相应的库。libiconv支持许多字符集,包括我们将用到的GB2312,UTF-8和UCS-2(Unicode)。具体的,在项目主页上有详细的说明。我们需要新学习直接用转载 2012-09-11 13:05:12 · 591 阅读 · 0 评论 -
SDL入门教程(九):2、显示文本的完整代码
注意:ttf字库文件,可以在C:/WINDOWS/Fonts下寻找,比如例子中用到的times.ttf;lazy.ttf请到Lazy Foo的相关教程True Type Fonts后面的示例中获得。//UVi Soft (2008)//Long Fei (lf426), E-mail: zbln426@163.com//FileName: SurfaceClas转载 2012-09-11 11:22:40 · 761 阅读 · 0 评论 -
SDL入门教程(九):1、在SDL图形窗口显示文本
作者:龙飞 最近几篇教程基本上都是参考着Lazy Foo的教程顺序来的。因为我也觉得他的顺序很实用。所不同的是,新的类型我都添加在了之前建立起来的surface类的基础之上。所以,如果你觉得单独看这些教程完全搞不明白,最好从头按照顺序来学习。另外,为了复习C++知识,也为了遵循C++的理念,我有意的将程序风格向C++靠拢。如果你更喜欢C风格,相信你在其他地方可以找到更适合你的转载 2012-09-11 11:21:15 · 994 阅读 · 0 评论 -
SDL项目常见问题( error LNK2019: 无法解析的外部符号 _main ,该符号在函数 _mainCRTStartup 中被引用)
该问题在网上被很多网友提问,各位网友给出了各种各样的答案。在此,我在SDL多媒体库中也遇到了这个问题。经过好一阵探索,终于找到答案。 正常情况下,在编译好SDL的头文件与库以后,只要将头文件与库文件路径指向正确位置。则添加头文件、库,就可以直接使用了。 一般而言,利用的静态库为SDL.lib、SDLmain.lib,动态库为SDL.dll,头文件为SDL.h。转载 2012-09-07 13:30:29 · 1356 阅读 · 0 评论 -
SDL入门教程(八):2、裁剪精灵图片的完整源代码
//UVi Soft (2008)//Long Fei (lf426), E-mail: zbln426@163.com//FileName: SurfaceClass.h#ifndef SURFACE_CLASS_H#define SURFACE_CLASS_H#include iostream>#include string>#include "SDL/转载 2012-09-11 11:03:37 · 777 阅读 · 0 评论 -
SDL入门教程(九):5、文本反馈鼠标位置坐标信息
作者:龙飞注意事项:1、times.ttf文件请到C:/WINDOWS/Fonts下寻找并拷贝到资源目录下。2、如果您使用VC2008,请用Release编译。原因是,似乎涉及到vector的操作,Runtime Library在debug的时候必须用Multi-theaded Debug DLL (MDd),而Release时候才用Multi-theaded DLL (MD)。而转载 2012-09-11 13:02:38 · 1677 阅读 · 0 评论 -
SDL入门教程(十):1、多语言支持,Win32下的GetText
作者:龙飞 自从开始研究SDL的文本显示,我就一直在思考在SDL中显示中文的问题。我们知道韦诺之战(Battle for Wesnoth)使用SDL开发的,并且支持多语言。所以,我一直相信Wesnoth的源代码里面一定有我所需要的答案。网络上是纵说纷纭啊,有些人干脆说,SDL不支持中文;有些人在困难面前回到了MFC的怀抱。而,既然我的目标是跨平台,并且我也相信一定能找到答案,转载 2012-09-11 13:03:33 · 844 阅读 · 0 评论 -
SDL入门教程(十三):2、初识多线程
作者:龙飞2.1:竞争条件(Race Conditions) 我们在前面将一个普通函数调用转换成了用线程调用,这意味着我们可以“同时”调用两个以上的线程。例如,我们希望在屏幕的另外一个位置也播放这段简单的动画,我们只需要添加一个线程的调用就可以了。int main(int argc ,char* argv[]){ //Create a SDL转载 2012-09-12 08:42:40 · 728 阅读 · 0 评论 -
SDL入门教程(十三):1、多线程,从动画说起
作者:龙飞1.1:简单动画 游戏离不开动画。我们考虑最简单的情况:将一个角色从一个位置移动到另外一个位置。这个行为表述给电脑就是,将一个surface不断的blit(),从起始位置的坐标,移动到结束位置的坐标。移动速度取决于每次blit()的坐标差和blit()的时间间隔(v = ds/dt )。 我们来设计一个函数实现这个简单的动画。我们需要的数据转载 2012-09-12 08:42:37 · 1394 阅读 · 0 评论 -
SDL入门教程(十二):音乐和音效
作者:龙飞1:扩展库SDL_mixer 根据网上资料的说法,SDL本身的声音体系做得不是很完善,好在还有一个比较完善的扩展库SDL_mixer,这个库支持包括wav, mp3, ogg和midi的声音和音乐,也算是相当完善了。下载地址在:http://www.libsdl.org/projects/SDL_mixer/安装设置参考前面的涉及SDL扩展库安装设置转载 2012-09-12 08:42:33 · 1416 阅读 · 0 评论 -
SDL入门教程(十一):3、做一个对话框
作者:龙飞 有了按钮类,我们制作对话框就很轻松了。边写程序边说明吧。bool hand_dialog(const ScreenSurface& screen, const std::string& dialog_text, int size){ const int CENTRE_X = (screen.point()->w) / 2; co转载 2012-09-12 08:42:30 · 859 阅读 · 0 评论 -
SDL入门教程(十一):2、设计按钮ButtonClass
作者:龙飞2.1:设计框架与基类的接口 有了更加完善的SurfaceClass的支持,我们可以进行按钮的设计了。接着上一节的话题,按钮除了要给我们表现出来是否被按下的视觉效果,还要起到实际上的作用。一种最简单的思路,既是鼠标在按钮上一旦按下,程序就马上响应。这种思路很朴素,也很实用。大名鼎鼎的QuakeIII的菜单按钮就是这么设计的,这样我们几乎是可以直接使用SDL的转载 2012-09-12 08:42:28 · 1256 阅读 · 0 评论 -
SDL入门教程(十一):1、SurfaceClass类的再设计
作者:龙飞1.1:为了按钮做准备 按钮是鼠标事件响应的象征,在PC游戏中起着十分重要的作用。这一章节,我们开始通过SDL提供的底层函数,自己来设计按钮。 按钮一般有这么几种状态:out: 鼠标不在按钮上;over: 鼠标在按钮上;down: 鼠标按下了;up: 鼠标松开了; 其中,down和up又可以细分为鼠标是在按转载 2012-09-11 13:08:25 · 1054 阅读 · 0 评论 -
SDL入门教程(十):5、SDL完美显示中文
作者:龙飞注意:请使用支持中文的TTF字库。5.1:构建可以正确显示中文的SDL_ttf函数 世界终于又充满了光明!任何事情都是有答案的,不知道仅仅是因为我们还没有找到。解决了以上一系列问题,我们终于可以不依赖MFC,完全使用自由开源的资源,让SDL显示中文了!我们通过TTF_RenderUNICODE_Xxx()来构建这些函数://FileName: f转载 2012-09-11 13:06:57 · 1213 阅读 · 0 评论 -
SDL入门教程(十):2、直接通过Unicode让SDL显示中文
作者:龙飞2.1:SDL本身可以显示中文吗? SDL的扩展库SDL_ttf本身具备显示中文的功能吗?网上很多观点,说不能显示的,甚至做了分析解释了原因。但是,事实是,SDL本身就可以显示中文。如果我们看看SDL_ttf.c的源代码,我们可以看到,最终用于构建SDL_Surface平面的函数,在三种显示模式(Solid, Shaded, Blended)下,都是其对应的转载 2012-09-11 13:04:26 · 1248 阅读 · 0 评论 -
SDL入门教程(六):SDL读取其它格式的图片
作者:龙飞1:扩充库(Extension Libraries) SDL本身所支持的,仅仅是读取bmp格式的图片。要使用其它格式的图片,我们需要使用SDL的扩充库。在下面地址,我们可以下载到相关文件SDL_image-devel-1.2.6-VC8.zip。http://www.libsdl.org/projects/SDL_image/ 与SDL转载 2012-09-10 10:18:53 · 1301 阅读 · 0 评论 -
SDL入门教程(五):6、对C++异常机制的思考,代码重写
作者:龙飞6.1:用bool作为命令是不是画蛇添足了? 不知道为什么,我总觉得总是用if结构来调用命令让人读起程序来很不连贯。所以,我决定重新修改下,并且异常抛出改为使用类对象,这样是不是更C++一点呢?:)6.2:修改后的代码。//FileName: SurfaceClass.h#ifndef SURFACE_CLASS_H#define转载 2012-09-10 10:14:47 · 432 阅读 · 0 评论 -
SDL入门教程(五):5、本章范例的完整源代码
作者:龙飞5.1:准备工作。一张640*480大小的bmp文件作为背景,命名为:bg.bmp;一张128*128大小的bmp文件作为要在背景上移动的图片,命名为:image.bmp。5.2:头文件SurfaceClass.h//FileName: SurfaceClass.h#ifndef SURFACE_CLASS_H#define SURFACE转载 2012-09-10 10:13:15 · 486 阅读 · 0 评论 -
SDL入门教程(四):2、SDL动画的硬件渲染(Hardware Render)
作者:龙飞2.1:需要修改的地方。 这里,我们真正的开始使用SDL的硬件渲染。首先,我们需要设置驱动的环境(以windows为例,我们设置为directx,Linux的设置请参考官方网站,我们这里预留为dga)。另外,如果要启动硬件加速,必须使用全屏模式(SDL_FULLSCREEN),所以,在前面的软件渲染中,我们也使用全屏以作对比。第三,硬件渲染需要打开双缓冲(S转载 2012-09-10 10:05:32 · 2141 阅读 · 0 评论 -
SDL入门教程(三):1、如何实现按下ESC退出程序?
作者:龙飞1.1:游戏中的退出习惯。 如同我们经常遇到的游戏,一般想退出的时候,我们会习惯性的按下ESC——即使游戏不会马上退出,也一般会调出一个带有退出选择的菜单。我们希望修房子的时候,最好先计划在哪里修门,所以,我认为应该优先掌握“退出游戏”的方法。简单的说,我们启动了一个SDL程序,我们希望按下ESC就能退出,怎么实现?1.2:事件(event)查询初探转载 2012-09-10 09:58:44 · 1126 阅读 · 0 评论 -
SDL入门教程(一):3、MinGW 下的安装与设置
作者:龙飞3.1:MinGW 是什么? MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境。MinGW 收集了一系列免费的Windows 使用的头文件和库文件;同时整合了GNU(http://www.gnu.org/ )的工具集,特别是GNU 程序开发工具,如经典gcc, g++, make等。MinGW是完全免费的自由软件,它在Windo转载 2012-09-10 09:49:55 · 862 阅读 · 0 评论 -
SDL入门教程(五):7、鼠标事件演示,代码重用
作者:龙飞7.1:演示程序源代码 今天因为一个网上的朋友的请求,做个一个关于鼠标事件的演示程序。实际上,可以完全用到前面我们构造的类和类方法,这里送上主程序,供大家参考。其他两个文件和图片文件均不需要任何改变。#include "SurfaceClass.h"int game(int argc, char* argv[]);int main(int转载 2012-09-10 10:15:52 · 767 阅读 · 0 评论 -
SDL入门教程(五):4、让图片动起来!
作者:龙飞4.1:再讨论简单的SDL event响应。Uint8 *SDL_GetKeyState(int *numkeys); 要让图片动起来,最好是我们可以“操作”的动。按照一般思路,键盘的“上”“下”“左”“右”是不错的选择。在FPS游戏和模拟器中,我们可能更习惯wsad四个键,所以,让他们同时起作用吧。这个函数的一般用法,是把参数设置为空指针。我们还是先忽转载 2012-09-10 10:12:20 · 693 阅读 · 0 评论 -
SDL入门教程(五):2、构建SDL surface类
作者:龙飞2.1:构建普通的surface类。 在所有的surface里面,只有screen surface是最特殊的。因为第一,screen surface只有一个;第二,其他所有的普通surface都必须被blit到screen surface上,通过flip screen surface才能显示出来。所以,我们可以认为普通的surface是“依赖”于一个scre转载 2012-09-10 10:10:48 · 870 阅读 · 0 评论 -
SDL入门教程(二):1、SDL的装载,位标(flags)
作者:龙飞1.1:SDL_Init! 我们回顾一下前面的那个小程序,所使用到的第一个SDL函数是:SDL_Init(SDL_INIT_EVERYTHING); 这是SDL的装载函数,也就是说,SDL的其他函数必须在这个函数将SDL装载之后才能够正常调用。我们看一下函数原形:int SDL_Init(Uint32 flags);转载 2012-09-10 09:54:35 · 721 阅读 · 0 评论 -
SDL入门教程(七):SDL抠色(Color Keying)
作者:龙飞1:什么是抠色(Color Keying) 我们总是blit矩形区域的图片,但是很显然,几乎没有一个游戏的角色图片是矩形的。美工把图片画到一个矩形范围内,如果设定了特定的背景颜色,我们就可以把矩形图片上的角色“抠”下来,相对于背景来说,我们就是把不属于角色的背景颜色扣掉,故称抠色。 我们看看SDL抠色函数的原形:int SDL_Se转载 2012-09-10 10:19:40 · 856 阅读 · 0 评论 -
SDL入门教程(八):1、裁剪精灵图片(Clip Blitting and Sprite Sheets)
作者:龙飞 这两天下雨,所以就暂停了寻春的步伐,多写了点教程。绵阳的春天是美丽的,大家学习和写程序之余,还是应该多看看大自然。给大家推荐我拍的风景照啦,呵呵。http://picasaweb.google.com/firefly.cao 因为不想多上传图片,所以我的例子中的图片文件直接就用Lazy Foo's教程中的附件了。相关资源,大家可以在这里下载:Cl转载 2012-09-10 10:22:57 · 1098 阅读 · 0 评论 -
SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论
作者:龙飞3.1:矩形区域SDL_Rect。typedef struct{ Sint16 x, y; Uint16 w, h;} SDL_Rect; 因为显示器通常是矩形的,所以,矩形是计算机图形学中最基本的操作区域单元。这个结构很简单,x和y是矩形的左上角坐标。x从左到右增加;y从上到下增加。左上角的坐标就是(0,0)——SDL中就是这样的。w是矩形转载 2012-09-10 10:11:35 · 1127 阅读 · 0 评论 -
SDL入门教程(五):1、构建SDL screen surface类
作者:龙飞今天是元宵节,新年过去,又要开始抓紧时间奋斗了。祝大家都能继续追逐自己的梦想。BS的书上引过一句话,“一个人要是不耕作,就必须写作”,所以,不耕作的我不能停止写作,time is money, my friend!1.1:整理两种SDL_Surface的关系。 前面一直在用面向过程的思想写程序,因为OOP细分到每一个具体的方法,还是过程。OOP的难点转载 2012-09-10 10:09:52 · 612 阅读 · 0 评论 -
SDL入门教程(四):3、SDL的软、硬件渲染的深入试验和分析
作者:龙飞3.1:试验——硬件渲染下关闭双缓存。现象:front图片出现不断被“撕裂”的效果。 双缓存的概念,是在计算机速度还不足以满足“即时作图”的情况下的一种技术。即,在屏幕(即前台的帧缓存framebuffer)上显示一帧图片的同时,在后台一个帧缓存的映射中作图。这样,只有当屏幕画面需要改变的时候,后台的缓存才交换到前台来,这样就避免了在前台出现计算机“作图转载 2012-09-10 10:06:14 · 1646 阅读 · 0 评论 -
SDL入门教程(四):1、SDL动画的软件渲染(Software Render)
作者:龙飞1.1:准备工作。 准备一张640*480的bmp位图(back.bmp)作为背景,另外一张小一点的(比如100*100的front.bmp)作为前景。 渲染(render)是CG术语,是将以数据结构储存在计算机中的图片以人眼可观察的图片实现出来的过程。前面例子中显示一张bmp图片实际上也是渲染。对于那张bmp图片,我们经历了3过过程的处理:1转载 2012-09-10 10:04:33 · 1027 阅读 · 0 评论 -
SDL入门教程(三):3、视频属性信息(VideoInfo)
作者:龙飞3.1:获取视频属性信息。const SDL_VideoInfo *SDL_GetVideoInfo(void); 我们在前一小节中,为了尽快实现一个SDL的运行窗口,跳过了很多细节,也留下了很多问题。其中一个很重要的问题就是:我们到底有没有使用到显卡的硬件加速?因为硬件的差异性,直接使用硬件接口的时候,会出现很多新的问题。这些问题在第(四)章中,我将以转载 2012-09-10 10:01:37 · 1683 阅读 · 0 评论 -
SDL入门教程(三):2、显示一张BMP位图。
作者:龙飞2.1:准备工作。 找一张*.bmp格式的图片。我在例子中将使用640*480大小的图片。如果你在windows下面,你可以打开画图程序自己简单的画一张,或者将其他格式的图片另存为bmp。然后将图片名字修改为helloworld.bmp(当然,你也可以在程序的相应部分修改为你目标图片的名字。),这是我们将要显示的图片。2.2:创建一个SDL的执行窗口转载 2012-09-10 10:00:41 · 1024 阅读 · 0 评论 -
SDL入门教程(二):3、中途装载与退出,SDL错误信息
作者:龙飞3.1:SDL flags 的中途装载和中途退出。 如果我们在程序一开始只启动了video,在运行的某个期间需要启动audio,之后,又需要关掉video只保持audio听声音应该怎么做呢? 先说中途装载。我们首先想到的,还是通过SDL_Init();来装载audio。这看似合理的,而且通过本人试验,发现事实上也是可行的。但是,我们前面分析转载 2012-09-10 09:56:40 · 738 阅读 · 0 评论 -
SDL入门教程(二):2、SDL的安全装载与安全退出
作者:龙飞2.1:WasInit可以在Init前使用吗? 我们在介绍SDL_Init()的时候说过,这个函数是调用SDL其他函数之前必须首先调用的函数。但是有一个问题是,我们如何知道SDL_Init是否已经被调用过了呢?于是我们接着认识了SDL_WasInit(),这个函数可以返回Init的状态。如果WasInit用在了Init之前会出现什么问题,或者说,WasIni转载 2012-09-10 09:55:37 · 678 阅读 · 0 评论 -
SDL入门教程(十三):3、封装多线程
作者:龙飞 SDL创建多线程的函数SDL_CreateThread()所调用的是函数指针,这意味着我们不可以传入(非静态)成员函数的指针。关于两种函数指针我们之前已经讨论过:函数指针与成员函数指针,我们可以有两种方法能让具有普通函数指针(函数指针以及静态成员函数指针)的函数调用类的私有成员,一是友元函数,另外就是静态成员函数。而能够受到类私有保护的,只有静态成员函数。所以,我转载 2012-09-12 08:42:43 · 572 阅读 · 0 评论