首先,我们为所有的工程创建一个文件夹tutorial,将下载的开发库SDL-devel-1.2.8-VC6.zip拷贝到tutorial下并解压,并保证如下的文件夹层次(图2)如下:
图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所示。
图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所示。
图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;
// 获取当前时间,以毫秒计时 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; }
// 解除锁定 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); }
// 注册SDL_Quit,当退出时调用,使得退出时程序自动清理 atexit(SDL_Quit);
// 使用32位象素创建640x480的窗口 screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
// 若失败,则退出 if ( screen == NULL ) { fprintf(stderr, "Unable to set 640x480 video: %s\n", SDL_GetError()); exit(1); }
// 主循环 while (1) { // Render stuff render();
// SDL中的事件轮询机制 SDL_Event event; while (SDL_PollEvent(&event)) { //对消息进行处理 switch (event.type) { // 如果按下某键的消息响应 case SDL_KEYDOWN: break; //如果某键按下后弹起的消息响应 case SDL_KEYUP: //若按下ESC键,则退出 if (event.key.keysym.sym == SDLK_ESCAPE) return 0; break; //退出消息响应 case SDL_QUIT: return(0); } } } return 0; } |
对工程gp进行编译,可以看看动态水波纹的效果了:) 如图10所示。
图10 |
如果你能够看到图10中的美丽动态窗口,那么恭喜你,你可以开始漫游SDL的精彩世界了。下面我们将正式开始我们的SDL之旅。
posted on 2010-08-11 10:35
我风 阅读(2097)
评论(0) 编辑 收藏 引用 所属分类:
SDL