SDL游戏开发之一-SDL的简介

本教程为一个长系列,旨在于从零开始边学习SDL边开发游戏。

一.什么是SDL?

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

以上来自360百科。下面则是自己的一些看法。

所谓SDL,就是一个跨平台的、通用的库。它旨在提供平台无关的创建窗口、事件监听等;而与前面提到的窗口创建等来说,SDL在绘图方面来说并不是那么出色,其提供的真正的绘图函数仅仅也是只有两个而已,不过一般的2D游戏的话,完全使用SDL开发已经是足够的。而更高一级的游戏开发则通常是SDL来处理窗口的创建、资源的加载、事件监听等;使用OpenGL或OpenGL es等来负责绘制。

 

从上图可知,SDL所做的就是封装了各个操作系统下的差异性,并提供了平台无关的API,使得开发者可以更好的进行上层开发。

二.什么是游戏引擎?

游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。大部分都支持多种操作平台,如Linux、Mac OS X、微软Windows。游戏引擎包含以下系统:渲染引擎(即"渲染器",含二维图像引擎和三维图像引擎)、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理。(360百科

像cocos2d-x、unity等就属于游戏引擎,不过个人认为cocos2d-x的脚本封装没有unity彻底。

接下来则把SDL与当下时兴的名词进行一个比较。

三.SDL与时兴名词的比较。

1.OpenGL

如果用一句话来概括的话,OpenGL的功能就是3D绘制,2D则是3D的一种特殊情况。OpenGL可以与SDL很好的配合使用,即OpenGL负责绘制,而SDL则负责处理绘制之外的事情,比如资源加载、文件存取、创建窗口、事件接收等。

2.cocos2d-x

cocos2d-x是一款c++游戏引擎,cocos表示的是最初的cocos游戏引擎,2d表示的是2d游戏,而x则表示的跨平台。所以,总的来说,cocos2d-x就是一款主攻2D游戏的、c++的游戏引擎。为什么说主攻呢?因为就目前来说,cocos2d-x也开始涉及3D开发了。另外,cocos2d-x的绘图使用的是OpenGL,而它的跨平台则基于不同的平台有着不同的处理,这部分倒是和SDL有些重叠。另外,目前cocos2d-x开始向脚本化发展,即在c++层上又封装了一层,使得开发者可以使用js或者lua,再搭配Cocos编辑器进行开发。不过个人认为相对于unity来说,Cocos并不成熟,而又因为仍处于起步阶段,所以更新快。个人认为这既是好事,也是坏事。我一开始倾向于使用cocos2d-x进行游戏开发,不过后来因为一个bug和官方对c++的冷落,使得我转战其他。。。

3.unity

unity是一款闭源的、商用的、底层使用c++所写的游戏引擎,因为unity的免费政策而流行起来。unity主攻是3d方向,目前也开始涉及2D游戏的开发,并且也取得了不错的成绩。在编辑器方面,unity相对成熟的多,官方文档也比较丰富。unity主要使用c#进行脚本开发,采用组件式编程,使得各个组件可复用性高。

四.总结

总而言之,SDL的功能可以认为是cocos2d-x为了跨平台所做的工作的集合,而学习SDL游戏开发,则是在学习SDL的API的基础上,再进行游戏方面的开发。SDL在封装程度上类似于OpenGL,而与unity等成熟的游戏引擎来说差了约两层左右,即先是把SDL的API以c++进行封装,然后再基于c++层再进行脚本的封装。所以,SDL足够底层,这也就导致了学习SDL就向学习c/c++一样,可能要很久才能有一个成品,即学习周期长。

每个人的目的与想法不同,则选择也会不同。如果你想尽快的开发游戏,则unity是一个好的选择;如果你想学习c++的话,cocos2d-x是一个不错的选择;如果能耐着住寂寞的话,则跟着本教程是个不错的选择。

本系列主要参考

《SDL Game Development》

 

推荐SDL教程:

lazyfoo的SDL2教程

 

推荐贴吧:

c4driod吧

SDL吧

#include #include //用键盘控制精灵移动 int main(int argc, char ** argv) { SDL_Surface * screen; //主表面 SDL_Surface * image; //用来放MM-----的图片信息(像素) SDL_Surface * PlayerImage; //用来测试的图片 SDL_Event event; Uint32 BeginTicks, EndTicks; SDL_Rect PRect, BRect; //PRect对应精灵的移动的小图位置(实现动画),BRect对应精灵在屏幕的位置。 unsigned char PlayerStarts = 0; unsigned char PlayerIndex = 0; bool bAppRun = true; //初始化SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { fprintf(stderr, "SDL_Init %s\n", SDL_GetError()); return -1; } //初始化成功设置退出要调用的函数SDL_Quit atexit(SDL_Quit); //创建一个640X480 16-bit 模式的主表面 16位可以让MM的效果好看一点 screen = SDL_SetVideoMode(230, 230, 16, SDL_SWSURFACE); if (screen == NULL) { fprintf(stderr, "Couldn't set 640x480x8 video mode %s\n", SDL_GetError()); return -1; } //读取MM图片信息,并创建一个表面,并把数据填入该表面中。 image = SDL_LoadBMP("./mm.bmp"); //请在终端里运行该程序 if (image == NULL) { fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。 return -1; } //读取player.bmp PlayerImage = SDL_LoadBMP("./player.bmp"); //请在终端里运行该程序 if (image == NULL) { fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。 return -1; } //读取第一个像素 Uint8 key = *((Uint8 *)PlayerImage->pixels); //设置色键 SDL_SetColorKey(PlayerImage, SDL_SRCCOLORKEY, key); //有了MM的表面了,就可以显示了。 //将MM的表面画在我们的主表面上,用MM来作为背景 if (SDL_BlitSurface(image, NULL, screen, NULL) < 0) { //解释一下NULL,第一个是按照image的尺寸显示,第二个是默认显示。你也可以指定大小,不过要用到SDL_Rect你可以看一看帮助。 fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError()); //看看提示吧 return -1; } PRect.x = 0; //初始化动画显示的图片。 PRect.y = 0; PRect.w = 32; PRect.h = 48; BRect.x = 0; //初始化精灵的位置。 BRect.y = 0; BRect.w = 32; BRect.h = 48; //贴上测试用的表面 if (SDL_BlitSurface(PlayerImage, &PRect, screen, &BRect) w, image->h); BeginT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值