ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:326.87KB ,
资源ID:17044340      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17044340.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(SDL游戏编程门篇.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

SDL游戏编程门篇.docx

1、SDL游戏编程门篇使用SDL打造游戏世界之入门篇/vc/2005/12/y057433.html简介Simple DirectMedia Layer, 简称SDL,是一个自由的跨平台的多媒体开发包,主要通过OpenGL和2D视频帧缓冲(framebuffer)提供对音频、键盘、鼠标、游戏操纵杆(joystick)和3D硬件的底层访问。它被广泛的应用于MPEG回放软件、模拟器和多个著名游戏中,如获得大奖的文明:权倾天下(Civilization: Call To Power)的Linux移植版本。它的官方站点是: ,还有一个非常个性的LOGO(图1)。在Win32编程中,如果要操纵2D图像,可以

2、选择使用GDI或者DirectDraw,前者速度较慢,而后者是特定针对Microsoft平台的,在非Win32平台上移植会带来很大的麻烦。这时,你可以选择使用SDL。SDL支持多种平台:Linux、Windows, BeOS, MacOS Classic, MacOS X, FreeBSD, OpenBSD, BSD/OS, Solaris, IRIX和QNX,同时也部分支持部分其他平台:Windows CE, AmigaOS, Dreamcast, Atari, NetBSD, AIX, OSF/Tru64, RISC OS和SymbianOS。当然SDL本身是针对2D图像编程的,如果使用到

3、3D编程,那么需要将SDL和OpenGL结合使用。SDL是用C编写的,但是也支持C+,同时其他多种语言,下面给出了其他语言的SDL的开发包的相关信息:Ada AdaSDL - /adasdl/ C# SDL.Net - http:/cs- Eiffel ewg - Erlang ESDL - /dgud/esdl/ Euphoria SDL_Wrap - _wrap.zip Guile guile-sdl - /guile-sdl/ Java JSDL - sdljava - Lisp CL-SDL - http:/cl- SDL for Corman Common Lisp - _sdl.p

4、hp3 Lua luaSDL - http:/lua-users.org/wiki/LuaModuleLuaSdl ML SDLML - /SDLML.html OCamlSDL - Objective C SDLOBJC - /sdlobjc/ Pascal SDL4Freepascal - JEDI-SDL - -jedi.org/Jedi:TEAM_SDL_HOME Perl SDLPerl - PHP PHP SDL module - Pike Natively supported (module SDL) - .se/ Pliant Pligame - Python PyGame -

5、 Ruby Ruby/SDL - -u.ac.jp/ohai/index.en.html RUDL - 功能视频 设置8bpp或更高的任意色彩深度的视频模式。如果某个模式硬件不支持,可以选择转化为另一模式。 直接写入线性的图像帧缓冲(framebuffer)。 用颜色键值(colorkey)或者alpha混合属性创建用于绘图的表面(surface)。 Surface的blit能自动的转化为目标格式。blit是优化过的,并能使用硬件加速。x86平台上有针对MMX优化过的blit。 硬件加速的blit和fill(填充)操作,如果硬件支持的话。 事件 提供以下事件: o 应用程序的visibilit

6、y(可视性)发生改变 o 键盘输入 o 鼠标输入 o 用户要求的退出 每种事件都能通过SDL_EventState()关闭或者打开。 事件经由用户指定的过滤函数再被加入到内部的事件队列。 线程安全的事件队列。音频 设置8位和16位的音频,单声道或者立体声,如果格式硬件不支持,可以选择转换。由独立的线程执行音频部分,并提供用户回调(callback)机制。 设计上考虑到了客户定制的软混音器,但实际上在例程中就包含了一个完整的音频/音乐输出库。CD音频 完整的CD音频控制API 线程 简单的线程创建API 用于同步的简单的二进制信号量(semaphores) 定时器 读取已流逝的毫秒数。 等待指定

7、的毫秒数。 设置一个10毫秒精度的周期性定时器。字节序无关 侦测当前系统的字节序 快速转换数据的函数 读写指定字节序的数据 下载SDL的官方下载地址为-1.2.php, 最新版本为1.2.8,分为运行库Runtime Library和开发库Development Library,使用SDL开发需要下载的是后者。由于SDL支持多平台和多个开发工具如VC6、Visual Studio.NET 2003、Dev-C+等等,所以可以根据需要选择合适自己的平台版本。由于笔者采用VC6给朋友们讲解SDL的使用,因此文章中只介绍了VC6下的安装方式,并使用了一个小例子做说明。如果您使用其他的平台和工具,请在

8、官方网站上查找相应的说明并按照要求去安装使用。VC6下SDL的安装和初步使用首先,我们为所有的工程创建一个文件夹tutorial,将下载的开发库SDL-devel-,并保证如下的文件夹层次(图2)如下:下面我们打开Visual Studio6.0,开发一个非常简单的小例子。选择File-New,新建一个工程,选择Win32 Application,将工程gp保存为tutorial目录下,如图3所示。在图4中,保持默认设置,点击Finish。为了使用SDL,我们需要进行相关的设置,选择Project-Settings.,选择C/C+属性页,在Category中选择Code Generation,

9、在Use run-time library中选择Debug Multithreaded DLL,如图5所示。在Category中选择Preprocessor,在Additional include directories的文本框中填上.SDL-,如图6所示。选择Link属性页,在Object/library modules文本框的首部增加SDLmain.lib和sdl.lib,如图7所示。仍然是Link属性页,选择Category中的Input,在Additional library path文本框中填写.SDL-,如图8所示。这样我们就完成了编程前的设置工作,不过这是针对Debug版本的,如

10、果要设置Release版本,需要选择Build-Set Active Configuration,选择Release,然后再次如上配置一次。下面我们正式开始编程,将E:tutorialSDL-,然后给gp工程增加一个C+文件main.cpp。如图9所示。将以下代码拷贝到main.cpp并保存。Copy code#include #if defined(_MSC_VER)#include SDL.h#else#include SDL/SDL.h#endifSDL_Surface *screen;void render() / 独占资源,将surface 锁定if (SDL_MUSTLOCK(sc

11、reen) if (SDL_LockSurface(screen) 0) return;/ 获取当前时间,以毫秒计时int tick = SDL_GetTicks();/ 声明变量int i, j, yofs, ofs;/ 对窗口进行绘制yofs = 0;for (i = 0; i 480; i+)for (j = 0, ofs = yofs; j pixels)ofs = i * i + j * j + tick;yofs += screen-pitch / 4;/ 解除锁定if (SDL_MUSTLOCK(screen) SDL_UnlockSurface(screen);/ 使用SDL对

12、窗口进行更新SDL_UpdateRect(screen, 0, 0, 640, 480); / Entry pointint main(int argc, char *argv)/ 初始化SDL子系统,这里只对视频进行初始化if ( SDL_Init(SDL_INIT_VIDEO) 0 ) fprintf(stderr, Unable to init SDL: %sn, SDL_GetError();exit(1);/ 注册SDL_Quit,当退出时调用,使得退出时程序自动清理atexit(SDL_Quit);/ 使用32位象素创建640x480的窗口screen = SDL_SetVideo

13、Mode(640, 480, 32, SDL_SWSURFACE);/ 若失败,则退出if ( screen = NULL ) fprintf(stderr, Unable to set 640x480 video: %sn, SDL_GetError();exit(1);/ 主循环while (1)/ Render stuffrender();/ SDL中的事件轮询机制SDL_Event event;while (SDL_PollEvent(&event) /对消息进行处理switch (event.type) / 如果按下某键的消息响应case SDL_KEYDOWN: break;/如果

14、某键按下后弹起的消息响应case SDL_KEYUP:/若按下ESC键,则退出if ( = SDLK_ESCAPE)return 0;break;/退出消息响应case SDL_QUIT:return(0);return 0;对工程gp进行编译,可以看看动态水波纹的效果了:) 如图10所示。如果你能够看到图10中的美丽动态窗口,那么恭喜你,你可以开始漫游SDL的精彩世界了。下面我们将正式开始我们的SDL之旅。简单的象素绘制下文从使用SDL的编程函数开始,介绍了如何使用SDL在屏幕上进行象素绘制的基本知识,并给出了一个简单的例子。如果要在VC中用SDL库,必须在源文件头部包含以下头文件:#inc

15、lude “SDL.h” 初始化SDL是通过SDL_Init()函数来实现的。如果初始化失败,函数返回值为0。函数只接受初始化对象作为参数。如果要初始化视频屏幕,传入常数SDL_INIT_VIDEO作为参数;初始化音频,传入常数SDL_INIT_AUDIO;如果同时初始化视频和音频,传入SDL_INIT_VIDEO|SDL_INIT_AUDIO。其它还有一些量可以传入作为参数的(如果同时传入多个量要使用|将它们隔开):SDL_INIT_TIMERSDL_INIT_AUDIOSDL_INIT_VIDEOSDL_INIT_CDROMSDL_INIT_JOYSTICKSDL_INIT_NOPARAC

16、HUATESDL_INIT_EVENTTHREADSDL_INIT_EVERYTHING如果我们要初始化,可以使用如下语句:if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) format, R, G, B); switch (screen-format-BytesPerPixel) case 1: / Assuming 8-bpp Uint8 *bufp; bufp = (Uint8 *)screen-pixels + y*screen-pitch + x; *bufp = color; break; case 2: / Probably 15-bp

17、p or 16-bpp Uint16 *bufp; bufp = (Uint16 *)screen-pixels + y*screen-pitch/2 + x; *bufp = color; break; case 3: / Slow 24-bpp mode, usually not used Uint8 *bufp; bufp = (Uint8 *)screen-pixels + y*screen-pitch + x * 3; if(SDL_BYTEORDER = SDL_LIL_ENDIAN) bufp0 = color;bufp1 = color 8; bufp2 = color 16;

18、 else bufp2 = color; bufp1 = color 8; bufp0 = color 16; break; case 4: / Probably 32-bpp Uint32 *bufp; bufp = (Uint32 *)screen-pixels + y*screen-pitch/4 + x; *bufp = color; break; 通过这个函数,可以传递给surface要绘制的点的(x,y)坐标和RGB值。同时,由于绘制的屏幕不能同时接受两个函数的同时操作,我们需要其他两个辅助函数,用于在绘制前对屏幕进行锁定,以及在绘制完成之后解除锁定。这两个工作一般由SDL_MUS

19、TLOK(SDL_Surface *screen)和SDL_UnlockSurface(SDL_Surface *screen)完成。使用如下两个自定义的函数会更加简单:void Slock(SDL_Surface *screen)if ( SDL_MUSTLOCK(screen) )if ( SDL_LockSurface(screen) 0 )return;void Sulock(SDL_Surface *screen)if ( SDL_MUSTLOCK(screen) )SDL_UnlockSurface(screen);这样,我们可以得到一个简单的主程序框架如下:#include #include #include SDL.h/ The functions are not shown to save space void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B); void Slock(SDL_Surface *screen); void

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2