使用SDL打造游戏世界之入门篇
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 解除锁定 if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
// 使用 SDL 对窗口进行更新 SDL_UpdateRect(screen, 0, 0, 640, 480); }
// Entry point int main(int argc, char *argv[]) { // 初始化 SDL 子系统,这里只对视频进行初始化 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); exit(1); }
·设置一个 10 毫秒精度的周期性定时器。 字节序无关 ·侦测当前系统的字节序 ·快速转换数据的函数 ·读写指定字节序的数据 下载 SDL 的官方下载地址为 http://www.libsdl.org/download-1.2.php, 最新版本为 1.2.8,分 为运行库 Runtime Library 和开发库 Development Library,使用 SDL 开发需要下载的是后 者。由于 SDL 支持多平台和多个开发工具如 VC6、Visual Studio.NET 2003、Dev-C++等等, 所以可以根据需要选择合适自己的平台版本。由于笔者采用 VC6 给朋友们讲解 SDL 的使用, 因此文章中只介绍了 VC6 下的安装方式,并使用了一个小例子做说明。如果您使用其他的 平台和工具,请在官方网站上查找相应的说明并按照要求去安装使用。 VC6 下 SDL 的安装和初步使用 首先,我们为所有的工程创建一个文件夹 tutorial。将下载的开发库 SDL-devel-1.2.8VC6.zip 拷贝到 tutorial 下并解压,并保证如下的文件夹层次(图 2)如下:
在 Win32 编程中,如果要操纵 2D 图像,可以选择使用 GDI 或者 DirectDraw,前者速 度较慢,而后者是特定针对 Microsoft 平台的,在非 Win3源自文库 平台上移植会带来很大的麻烦。 这时,你可以选择使用 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 图像编程的,如果使用到 3D 编程,那 么需要将 SDL 和 OpenGL 结合使用。
sdljava - http://sdljava.sourceforge.net ·Lisp CL-SDL - http://cl-sdl.sourceforge.net/ SDL for Corman Common Lisp - http://www.balooga.com/lisp_sdl.php3 ·Lua luaSDL - http://lua-users.org/wiki/LuaModuleLuaSdl ·ML SDLML - http://www.HardcoreProcessing.com/Freeware/SDLML.html OCamlSDL - http://ocamlsdl.sourceforge.net/ ·Objective C SDLOBJC - http://savannah.nongnu.org/projects/sdlobjc/ ·Pascal SDL4Freepascal - http://sdl4fp.sourceforge.net/ JEDI-SDL - http://www.delphi-jedi.org/Jedi:TEAM_SDL_HOME ·Perl SDLPerl - http://sdl.perl.org ·PHP PHP SDL module - http://phpsdl.sourceforge.net ·Pike Natively supported (module SDL) - http://pike.ida.liu.se/ ·Pliant Pligame - http://pligame.sourceforge.net/ ·Python PyGame - http://pygame.seul.org/ ·Ruby Ruby/SDL - http://www.kmc.kyoto-u.ac.jp/~ohai/index.en.html RUDL - http://rudl.sourceforge.net
图9 将以下代码拷贝到 main.cpp 并保存。 #include <stdlib.h> #if defined(_MSC_VER) #include "SDL.h" #else #include "SDL/SDL.h" #endif SDL_Surface *screen; void render() { // 独占资源,将 surface 锁定 if (SDL_MUSTLOCK(screen)) if (SDL_LockSurface(screen) < 0) return;
·硬件加速的 blit 和 fill(填充)操作,如果硬件支持的话。
事件 ·提供以下事件: o 应用程序的 visibility(可视性)发生改变 o 键盘输入 o 鼠标输入 o 用户要求的退出 ·每种事件都能通过 SDL_EventState()关闭或者打开。 ·事件经由用户指定的过滤函数再被加入到内部的事件队列。 ·线程安全的事件队列。 音频 ·设置 8 位和 16 位的音频,单声道或者立体声,如果格式硬件不支持,可以选择转换。
图2 下面我们打开 Visual Studio6.0,开发一个非常简单的小例子。选择 File->New,新建一 个工程,选择 Win32 Application,将工程 gp 保存为 tutorial 目录下,如图 3 所示。
图3 在图 4 中,保持默认设置,点击 Finish。
图4
为了使用 SDL,我们需要进行相关的设置,选择 Project->Settings...,选择 C/C++属 性页,在 Category 中选择 Code Generation,在 Use run-time library 中选择 Debug Multithreaded DLL,如图 5 所示。
使用 SDL 打造游戏世界之入门篇
简介
Simple DirectMedia Layer, 简称 SDL,是一个自由的跨平台的多媒体开发包,主要通 过 OpenGL 和 2D 视频帧缓冲(framebuffer)提供对音频、键盘、鼠标、游戏操纵杆(joystick)和 3D 硬件的底层访问。它被广泛的应用于 MPEG 回放软件、模拟器和多个著名游戏中,如获 得大奖的《文明:权倾天下》(Civilization: Call To Power)的 Linux 移植版本。它的官方站点 是:http://www.libsdl.org/ ,还有一个非常个性的 LOGO(图 1)。
// 获取当前时间,以毫秒计时 int tick = SDL_GetTicks();
// 声明变量 int i, j, yofs, ofs;
// 对窗口进行绘制 yofs = 0; for (i = 0; i < 480; i++) { for (j = 0, ofs = yofs; j < 640; j++, ofs++) { ((unsigned int*)screen->pixels)[ofs] = i * i + j * j + tick; } yofs += screen->pitch / 4; }
功 能
视频
·设置 8bpp 或更高的任意色彩深度的视频模式。如果某个模式硬件不支持,可以选择转 化为另一模式。
·直接写入线性的图像帧缓冲(framebuffer)。
·用颜色键值(colorkey)或者 alpha 混合属性创建用于绘图的表面(surface)。
·Surface 的 blit 能自动的转化为目标格式。blit 是优化过的,并能使用硬件加速。x86 平 台上有针对 MMX 优化过的 blit。
SDL 是用 C 编写的,但是也支持 C++,同时其他多种语言,下面给出了其他语言的 SDL 的开发包的相关信息:
·Ada AdaSDL - http://sourceforge.net/projects/adasdl/ ·C# SDL.Net - http://cs-sdl.sourceforge.net/ ·Eiffel ewg - http://ewg.sourceforge.net/ ·Erlang ESDL - http://www.ericsson.com/cslab/~dgud/esdl/ ·Euphoria SDL_Wrap - http://www.rapideuphoria.com/sdl_wrap.zip ·Guile guile-sdl - http://sourceforge.net/projects/guile-sdl/ ·Java JSDL - http://jsdl.sourceforge.net/
// 注册 SDL_Quit,当退出时调用,使得退出时程序自动清理 atexit(SDL_Quit);
// 使用 32 位象素创建 640x480 的窗口 screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
// 若失败,则退出 if ( screen == NULL )
·由独立的线程执行音频部分,并提供用户回调(callback)机制。 ·设计上考虑到了客户定制的软混音器,但实际上在例程中就包含了一个完整的音频/ 音乐输出库。 CD 音频 ·完整的 CD 音频控制 API 线程 ·简单的线程创建 API ·用于同步的简单的二进制信号量(semaphores) 定时器 ·读取已流逝的毫秒数。 ·等待指定的毫秒数。
图5 在 Category 中选择 Preprocessor,在'Additional include directories'的文本框中填上.. \SDL-1.2.8\include\,如图 6 所示。
图6 选择 Link 属性页,在'Object/library modules'文本框的首部增加 SDLmain.lib 和 sdl.lib,如图 7 所示。
图7 仍然是 Link 属性页,选择 Category 中的 Input,在'Additional library path'文本框中填 写..\SDL-1.2.8\lib\,如图 8 所示。
图8 这样我们就完成了编程前的设置工作,不过这是针对 Debug 版本的,如果要设置 Release 版本,需要选择 Build->Set Active Configuration,选择 Release,然后再次如上配 置一次。 下面我们正式开始编程,将 E:\tutorial\SDL-1.2.8\lib\SDL.dll 拷贝到 gp 文件夹下,然 后给 gp 工程增加一个 C++文件 main.cpp。如图 9 所示。
// 使用 SDL 对窗口进行更新 SDL_UpdateRect(screen, 0, 0, 640, 480); }
// Entry point int main(int argc, char *argv[]) { // 初始化 SDL 子系统,这里只对视频进行初始化 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); exit(1); }
·设置一个 10 毫秒精度的周期性定时器。 字节序无关 ·侦测当前系统的字节序 ·快速转换数据的函数 ·读写指定字节序的数据 下载 SDL 的官方下载地址为 http://www.libsdl.org/download-1.2.php, 最新版本为 1.2.8,分 为运行库 Runtime Library 和开发库 Development Library,使用 SDL 开发需要下载的是后 者。由于 SDL 支持多平台和多个开发工具如 VC6、Visual Studio.NET 2003、Dev-C++等等, 所以可以根据需要选择合适自己的平台版本。由于笔者采用 VC6 给朋友们讲解 SDL 的使用, 因此文章中只介绍了 VC6 下的安装方式,并使用了一个小例子做说明。如果您使用其他的 平台和工具,请在官方网站上查找相应的说明并按照要求去安装使用。 VC6 下 SDL 的安装和初步使用 首先,我们为所有的工程创建一个文件夹 tutorial。将下载的开发库 SDL-devel-1.2.8VC6.zip 拷贝到 tutorial 下并解压,并保证如下的文件夹层次(图 2)如下:
在 Win32 编程中,如果要操纵 2D 图像,可以选择使用 GDI 或者 DirectDraw,前者速 度较慢,而后者是特定针对 Microsoft 平台的,在非 Win3源自文库 平台上移植会带来很大的麻烦。 这时,你可以选择使用 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 图像编程的,如果使用到 3D 编程,那 么需要将 SDL 和 OpenGL 结合使用。
sdljava - http://sdljava.sourceforge.net ·Lisp CL-SDL - http://cl-sdl.sourceforge.net/ SDL for Corman Common Lisp - http://www.balooga.com/lisp_sdl.php3 ·Lua luaSDL - http://lua-users.org/wiki/LuaModuleLuaSdl ·ML SDLML - http://www.HardcoreProcessing.com/Freeware/SDLML.html OCamlSDL - http://ocamlsdl.sourceforge.net/ ·Objective C SDLOBJC - http://savannah.nongnu.org/projects/sdlobjc/ ·Pascal SDL4Freepascal - http://sdl4fp.sourceforge.net/ JEDI-SDL - http://www.delphi-jedi.org/Jedi:TEAM_SDL_HOME ·Perl SDLPerl - http://sdl.perl.org ·PHP PHP SDL module - http://phpsdl.sourceforge.net ·Pike Natively supported (module SDL) - http://pike.ida.liu.se/ ·Pliant Pligame - http://pligame.sourceforge.net/ ·Python PyGame - http://pygame.seul.org/ ·Ruby Ruby/SDL - http://www.kmc.kyoto-u.ac.jp/~ohai/index.en.html RUDL - http://rudl.sourceforge.net
图9 将以下代码拷贝到 main.cpp 并保存。 #include <stdlib.h> #if defined(_MSC_VER) #include "SDL.h" #else #include "SDL/SDL.h" #endif SDL_Surface *screen; void render() { // 独占资源,将 surface 锁定 if (SDL_MUSTLOCK(screen)) if (SDL_LockSurface(screen) < 0) return;
·硬件加速的 blit 和 fill(填充)操作,如果硬件支持的话。
事件 ·提供以下事件: o 应用程序的 visibility(可视性)发生改变 o 键盘输入 o 鼠标输入 o 用户要求的退出 ·每种事件都能通过 SDL_EventState()关闭或者打开。 ·事件经由用户指定的过滤函数再被加入到内部的事件队列。 ·线程安全的事件队列。 音频 ·设置 8 位和 16 位的音频,单声道或者立体声,如果格式硬件不支持,可以选择转换。
图2 下面我们打开 Visual Studio6.0,开发一个非常简单的小例子。选择 File->New,新建一 个工程,选择 Win32 Application,将工程 gp 保存为 tutorial 目录下,如图 3 所示。
图3 在图 4 中,保持默认设置,点击 Finish。
图4
为了使用 SDL,我们需要进行相关的设置,选择 Project->Settings...,选择 C/C++属 性页,在 Category 中选择 Code Generation,在 Use run-time library 中选择 Debug Multithreaded DLL,如图 5 所示。
使用 SDL 打造游戏世界之入门篇
简介
Simple DirectMedia Layer, 简称 SDL,是一个自由的跨平台的多媒体开发包,主要通 过 OpenGL 和 2D 视频帧缓冲(framebuffer)提供对音频、键盘、鼠标、游戏操纵杆(joystick)和 3D 硬件的底层访问。它被广泛的应用于 MPEG 回放软件、模拟器和多个著名游戏中,如获 得大奖的《文明:权倾天下》(Civilization: Call To Power)的 Linux 移植版本。它的官方站点 是:http://www.libsdl.org/ ,还有一个非常个性的 LOGO(图 1)。
// 获取当前时间,以毫秒计时 int tick = SDL_GetTicks();
// 声明变量 int i, j, yofs, ofs;
// 对窗口进行绘制 yofs = 0; for (i = 0; i < 480; i++) { for (j = 0, ofs = yofs; j < 640; j++, ofs++) { ((unsigned int*)screen->pixels)[ofs] = i * i + j * j + tick; } yofs += screen->pitch / 4; }
功 能
视频
·设置 8bpp 或更高的任意色彩深度的视频模式。如果某个模式硬件不支持,可以选择转 化为另一模式。
·直接写入线性的图像帧缓冲(framebuffer)。
·用颜色键值(colorkey)或者 alpha 混合属性创建用于绘图的表面(surface)。
·Surface 的 blit 能自动的转化为目标格式。blit 是优化过的,并能使用硬件加速。x86 平 台上有针对 MMX 优化过的 blit。
SDL 是用 C 编写的,但是也支持 C++,同时其他多种语言,下面给出了其他语言的 SDL 的开发包的相关信息:
·Ada AdaSDL - http://sourceforge.net/projects/adasdl/ ·C# SDL.Net - http://cs-sdl.sourceforge.net/ ·Eiffel ewg - http://ewg.sourceforge.net/ ·Erlang ESDL - http://www.ericsson.com/cslab/~dgud/esdl/ ·Euphoria SDL_Wrap - http://www.rapideuphoria.com/sdl_wrap.zip ·Guile guile-sdl - http://sourceforge.net/projects/guile-sdl/ ·Java JSDL - http://jsdl.sourceforge.net/
// 注册 SDL_Quit,当退出时调用,使得退出时程序自动清理 atexit(SDL_Quit);
// 使用 32 位象素创建 640x480 的窗口 screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
// 若失败,则退出 if ( screen == NULL )
·由独立的线程执行音频部分,并提供用户回调(callback)机制。 ·设计上考虑到了客户定制的软混音器,但实际上在例程中就包含了一个完整的音频/ 音乐输出库。 CD 音频 ·完整的 CD 音频控制 API 线程 ·简单的线程创建 API ·用于同步的简单的二进制信号量(semaphores) 定时器 ·读取已流逝的毫秒数。 ·等待指定的毫秒数。
图5 在 Category 中选择 Preprocessor,在'Additional include directories'的文本框中填上.. \SDL-1.2.8\include\,如图 6 所示。
图6 选择 Link 属性页,在'Object/library modules'文本框的首部增加 SDLmain.lib 和 sdl.lib,如图 7 所示。
图7 仍然是 Link 属性页,选择 Category 中的 Input,在'Additional library path'文本框中填 写..\SDL-1.2.8\lib\,如图 8 所示。
图8 这样我们就完成了编程前的设置工作,不过这是针对 Debug 版本的,如果要设置 Release 版本,需要选择 Build->Set Active Configuration,选择 Release,然后再次如上配 置一次。 下面我们正式开始编程,将 E:\tutorial\SDL-1.2.8\lib\SDL.dll 拷贝到 gp 文件夹下,然 后给 gp 工程增加一个 C++文件 main.cpp。如图 9 所示。