C语言+SDL编写俄罗斯方块(一)--在VS2005环境上配置SDL大家好,如果你已经从一名C语言菜鸟晋升为一名C语言入门者,那么从这篇文章开始你应该有新的提升。相信独立做一个俄罗斯方块的游戏是一个不错的途径,那么现在我们就开始吧!俗话说,“欲要利其事,必先利其器”。在动手之前必须选择合适的开发环境和游戏引擎,对于俄罗斯方块这样的2D小游戏而言,我们需要一个熟悉的开发工具再加一个简单实用的游戏引擎即可。SDL是一个不错的选择,SimpleDirectMediaLayer库,简称SDL,是为数不多的商业游戏开发公司使用的免费软件库之一。它提供跨平台的二维帧缓冲区图形和音频服务,它支持Linux、Win32和BeOS。也不同程度地支持其它平台,包括Solaris、IRIX、FreeBSD和MacOS。除了大量的服务,包括线程、独立于字节存储次序的宏和CD音频,SDL还提供了一个简单的API,它允许您尽可能接近本机硬件。使用SDL有三重优点:稳定、简单和灵活。因为SDL专门为游戏和多媒体应用而设计开发,所以它对图形的支持非常优秀,尤其是高级图形能力,比如Alpha混和、透明处理、YUV覆盖、Gamma校正等等。而且在SDL环境中能够非常方便地加载支持OpenGL的Mesa库,从而提供对二维和三维图形的支持。从网上下载针对VS2005的SDL软件开发包,由于SDL在搭配其它的编译环境也可以实现游戏开发,所以当你看到相关下载SDL软件开发包的网站时,通常会将SDL各种版本罗列出来,请下载时务必看清,否则,不同版本的SDL开发包张冠李戴到编译环境上是无法正常工作的。下面介绍详细步骤:一、下载SDL下载地址和链接:如下图所示:也可以从下面的链接直接下载:://二、解压缩假设你将下载下来的压缩文件解压至D:\SDL-1.2.13,如下图。三、拷贝文件找到VS2005的安装目录(在我的机器上,VC6被安装在了C:\ProgramFiles\MicrosoftVisualStudio8\VC,下面以此为例进行步骤描述)。打开C:\ProgramFiles\MicrosoftVisualStudio8\VC\include。在C:\ProgramFiles\MicrosoftVisualStudio8\VC\include下新建SDL文件夹。将\SDL-1.2.14\include下的所有文件拷贝到C:\ProgramFiles\MicrosoftVisualStudio8\VC\include\SDL中。将下的两个扩展名为.lib的文件(即SDL.lib和SDLmain.lib)拷贝到C:\ProgramFiles\MicrosoftVisualStudio8\VC\lib。将\SDL-1.2.14\lib下的SDL.dll拷贝到windows安装目录下的system32目录下。四、新建工程,进行测试新建win32consoleapplication的空工程。新建一个.cpp文件选择项目-点击项目的属性或者直接按ALT+F7。选择C/C++页,选择常规,进行如下修改,如下图:选择C/C++页,选择代码生成,进行如下修改,如下图:选择连接器页,选择输入-修改附加依赖项,如下图:注意:今后添加其他SDL的功能模块的时候,同样需要修改这里。单击确定。给刚才新建的cpp文件,输入文件的代码如下:#includestdio.h#includeSDL/SDL.hintmain(intargc,char*argv[]){if(SDL_Init(SDL_INIT_EVERYTHING)==-1){printf(“设备初始化失败!\n”);return-1;}printf(SDLinitialized.\n);SDL_Quit();system(pause);return0;}看是否调试通过了?如果通过了,恭喜恭喜!!!C语言+SDL编写俄罗斯方块(二)----显示BMP图片众所周知,游戏中,图片的显示是必不可少的,图片的格式也多种多样,比如:.bmp,.jpg,.gif,.bmp,.png等等,其中BMP位图格式的图片是SDL默认支持的唯一格式,可以说学会使用SDL显示BMP格式的图片是使用SDL开发游戏的基础。下面介绍详细步骤:1、在VS2005环境下正确配置SDL,配置方法详见上一篇博文。2、认真阅读下面代码及注释。#includestdio.h#includeSDL/SDL.h//functionname:initImg//parameter:constchar*aFileName,SDL_Surface**aImg//parameternote://aFileNameisapointerusetosavethenameofimagefile//aImgisapointerofimage//return:void//function:loadimagetomemoryintinitImg(constchar*aFileName,SDL_Surface**aImg){SDL_Surface*pTemp;//loadpicturefile,thefilemustbeBMPfilepTemp=SDL_LoadBMP(aFileName);//formatpictures’file*aImg=SDL_DisplayFormat(pTemp);if(pTemp==NULL||aImg==NULL){printf(%scann'tinitial,aFileName);return0;}//freetemporarypointerSDL_FreeSurface(pTemp);return1;}//functionname:showImg//parameter:SDL_Surface*aSource,intaLeft,intaTop,intaWidth,intaHeight,SDL_Surface*aDestination//parameternote://aSourceisthehandlerofimage//aLeftistheleftofimage//aTopisthetopofimage//aWidthisthewidthofimage//aHeightistheheightofimage//aDestinationisscreenhandler//return:void//function:showimagetodisplaymemoryvoidshowImg(SDL_Surface*aSource,intaLeft,intaTop,intaWidth,intaHeight,SDL_Surface*aDestination){SDL_RectpicPosition;picPosition.x=aLeft;picPosition.y=aTop;picPosition.w=(aWidth==0)?aSource-w:aWidth;picPosition.h=(aHeight==0)?aSource-h:aHeight;SDL_BlitSurface(aSource,NULL,aDestination,&picPosition);}#defineWIDTH600#defineHEIGHT400#defineCPP32intmain(intargc,char*argv[]){SDL_Surface*pic=NULL;SDL_Surface*screen=NULL;if(SDL_Init(SDL_INIT_EVERYTHING)==-1){printf(“设备初始化失败!\n”);return-1;}//initscreenscreen=SDL_SetVideoMode(WIDTH,HEIGHT,CPP,SDL_SWSURFACE|SDL_DOUBLEBUF);if(screen==NULL){printf(initscreenfailed,pleasecheckyourdisplaycard);returnfalse;//initscreenfailed}//比如,在同目录下有一个1.bmp的文件,如果要显示它可以像下面这样//第一步:将图片从硬盘载入内存initImg(1.bmp,&pic);//第二步:将内存中的图片显示到后台屏幕显存上showImg(pic,0,0,0,0,screen);//第三步:将后台屏幕显存显示到屏幕上SDL_Flip(screen);//停5s否则会一闪而过SDL_Delay(5000);//退出SDLSDL_Quit();system(pause);return0;}3、读懂代码后,在VS2005上新建工程,将代码敲到工程里,尝试运行。4、更换图片和函数实参,进一步熟练掌握显示图片的函数功能,并做到灵活运用。C语言+SDL编写俄罗斯方块(三)----其他格式图片显示BMP格式的图片虽然可以被SDL直接使用,但BMP格式本身最大的缺点是占据空间大,致使其存储时消耗大量磁盘空间,加载时又消耗大量内存。为了解决这个问题,我们希望SDL可以显示其他压缩格式的图片,如:.jpg,.png等。然而SDL本身并不能完成这项艰巨而光荣的任务,我们必须下载额外的类库来支持,具体的步骤如下:1、从下载图像显示的额外压缩包。2、这个压缩包解压后如图:3、按照配置SDL的方法,将include文件夹中的内容的.h文件放入VS2005安装目录下include文件夹下的SDL(没有自己建一个),将.lib文件夹中的lib文件放入VS2005安装目录下lib文件夹下,将.dll文件放入window/system32文件夹下。4、配置VS2005的IDE环境,配置方法如图:5、在源文件中键入如下代码:#includesdl/SDL.h#includesdl/SDL_image.hboolinitImg(constchar*aFileName,SDL_Surface**aImg){SDL_Surface*pTemp;//loadpicturefile,itissomethinglikeloadBMPfilepTemp=IMG_Load(aFileName);//pTemp=SDL_LoadBMP(aFileName);//formatpictures’file*aImg=SDL_DisplayFormat(pTemp);if(pTemp==NULL||aImg==NULL){coutaFileNameSDL_GetError();returnfalse;}//freetemporarypointerSDL_FreeSurface(pTemp);returntrue;}注意,这个实验的基础是上一篇文章,请先完成上一篇文章提到的代码和内容,完成后,除了将pTemp=SDL_LoadBMP(aFileName);改为pTemp=IMG_Load(aFileName);之外,还要加上头文件,其他的代码均不变,尝试加载其他格式的图片,并把图片显示在屏幕上,看是不是大功告成啦!最近,有不少学生和网友提到在VC++6.0环境下配置SDL的问题,下面给诸位详细讲解下配置的方法,为清楚明白起见,配有多幅图片,如果加载图片出现问题,一般刷新一次即可,至于SDL的简介请参看我的VS2005+SDL配置的文章,好了,闲话少叙,就让我们一起看看在VC++6.0环境下如何配置SDL