嵌入式网络协议及其应用开发课程设计报告基于SDL的记忆小游戏Word文档格式.docx
《嵌入式网络协议及其应用开发课程设计报告基于SDL的记忆小游戏Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式网络协议及其应用开发课程设计报告基于SDL的记忆小游戏Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
8.问题及心得体会18
9.对本设计过程及方法、手段的改进建议18
10.任务分配18
11.参考文献18
课程设计报告
1.课程设计内容
本课程设计的内容是设计一个基于SDL的记忆小游戏。
2.课程设计目的
考察自己对课程的掌握程度,以及自己实际的动手能力,编程能力。
3.背景知识
网络应用程序的基本实现方法
网络游戏的基本实现原理
●SDL是SimpleDirectMediaLayer(简易直控媒体层)的缩写。
它是一个跨平台的多媒体库,以用于直接控制底层的多媒体硬件的接口。
●这些多媒体功能包括了音频、键盘和鼠标(事件)、游戏摇杆等。
●当然,最为重要的是提供了2D图形帧缓冲(framebuffer)的接口,以及为OpenGL与各种操作系统之间提供了统一的标准接口以实现3D图形。
●SDL是一个跨平台的多媒体函数库,被用来设计成在低层访问音频,键盘,鼠标,游戏杆,基于OPENGL(一个3D图象开发函数库)的3D硬件,和2D图象帧缓冲区。
它被广泛的用于基于MPEG的媒体播放软件,模拟器,和许多著名的游戏。
●SDL是一个跨平台的函数库,几乎支持现今所有平台:
Linux,Windows,WindowsCE,BeOS,MacOS,MacOSX,FreeBSD,NetBSD,OpenBSD,BSD/OS,Solaris,IRIX,andQNX。
4.工具/准备工作
硬件:
安装有windowsXP以上版本的操作系统PC机一台
建议配置是CPUPIV以上,512M内存以上,20G硬盘空间以上
ARM2200教学实验开发平台
软件:
安装Photoshop
VMware6.0,debian
5.设计步骤与方法
在photoshop下编辑图片
编译程序
安装SDL
使用命令“sdl-config-cflags”来检查是否已安装SDL。
如果没有安装,可以选择上网安装,或从源码包安装:
✧上网安装:
首先确保能联上internet(如果没有联上互联网可参考《Linux相关实验常见问题.doc》).并在命令行下输入:
apt-getinstalllibsdl1.2-devlibsdl-image1.2-devlibsdl-mixer1.2-devlibsdl-ttf2.0-dev。
系统将自动完成安装
✧从源码包安装:
拷贝SDL-1.2.13.tar.gz至linux主机/home/test目录,然后执行命令:
tarxvzftarxvzfSDL-1.2.13.tar.gzSDL-1.2.13.tar.gz,执行后,将在本地生成一个SDL-1.2.13的目录,进入这个目录,在root权限下,依次执行./configure;
make;
makeinstall
linux下编译执行
1)将源文件sdl_simple_game.cpp拷贝到linux主机
2)进行编译:
g++-otsdl_simple_game.cpp–L/usr/lib–lSDL,生成可执行文件
3)执行,在命令行输入./t
设计游戏代码
//Theheaders
#include"
SDL/SDL.h"
SDL/SDL_image.h"
#include<
string>
math.h>
//Screenattributes
constintSCREEN_WIDTH=721;
constintSCREEN_HEIGHT=721;
constintSCREEN_BPP=32;
//Theframespersecond
constintFRAMES_PER_SECOND=10;
//Thedimenstionsofthestickfigure
constintFOO_WIDTH=180;
constintFOO_HEIGHT=180;
constintBegin=0;
constintRun=1;
constintEnd=2;
boolflag[4][4];
inttu[4][4];
inttu_x;
inttu_y;
intm_x;
intm_y;
boolm_s;
boollock=true;
boolquit=false;
intg_s;
intend_y;
//Thesurfaces
SDL_Surface*foo=NULL;
SDL_Surface*screen=NULL;
SDL_Surface*menu=NULL;
SDL_Surface*begin=NULL;
SDL_Surface*end=NULL;
SDL_Surface*pai1=NULL;
SDL_Surface*pai2=NULL;
SDL_Surface*pai3=NULL;
SDL_Surface*pai4=NULL;
SDL_Surface*pai5=NULL;
SDL_Surface*pai6=NULL;
SDL_Surface*pai7=NULL;
SDL_Surface*pai8=NULL;
//Theeventstructure
SDL_Eventevent;
//Theareasofthespritesheet
SDL_Rectmenu_rect[2];
SDL_Rectend_rect[2];
//Thestickfigure
classFoo
{
private:
//Theoffset
intoffSet;
//Itsrateofmovement
intvelocity;
//Itscurrentframe
intframe;
public:
//Initializesthevariables
Foo();
//Handlesinput
voidhandle_events();
//Showsthestickfigure
voidshow();
};
SDL_Surface*load_image(std:
:
stringfilename)
//Theimagethat'
sloaded
SDL_Surface*loadedImage=NULL;
//Theoptimizedsurfacethatwillbeused
SDL_Surface*optimizedImage=NULL;
//Loadtheimage
loadedImage=IMG_Load(filename.c_str());
//Iftheimageloaded
if(loadedImage!
=NULL)
{
//Createanoptimizedsurface
optimizedImage=SDL_DisplayFormat(loadedImage);
//Freetheoldsurface
SDL_FreeSurface(loadedImage);
//Ifthesurfacewasoptimized
if(optimizedImage!
//Colorkeysurface
SDL_SetColorKey(optimizedImage,SDL_SRCCOLORKEY,\
SDL_MapRGB(optimizedImage->
format,0,0xFF,0xFF));
}
//Returntheoptimizedsurface
returnoptimizedImage;
}
voidapply_surface(intx,inty,SDL_Surface*source,\
SDL_Surface*destination,SDL_Rect*clip=NULL)
//Holdsoffsets
SDL_Rectoffset;
//Getoffsets
offset.x=x;
offset.y=y;
//Blit
SDL_BlitSurface(source,clip,destination,&
offset);
/*voidset_clips()
//Clipthesprites
clipsRight[0].x=0;
clipsRight[0].y=0;
clipsRight[0].w=FOO_WIDTH;
clipsRight[0].h=FOO_HEIGHT;
clipsRight[1].x=FOO_WIDTH;
clipsRight[1].y=0;
clipsRight[1].w=FOO_WIDTH;
clipsRight[1].h=FOO_HEIGHT;
clipsRight[2].x=FOO_WIDTH*2;
clipsRight[2].y=0;
clipsRight[2].w=FOO_WIDTH;
clipsRight[2].h=FOO_HEIGHT;
clipsRight[3].x=FOO_WIDTH*3;
clipsRight[3].y=0;
clipsRight[3].w=FOO_WIDTH;
clipsRight[3].h=FOO_HEIGHT;
clipsLeft[0].x=0;
clipsLeft[0].y=FOO_HEIGHT;
clipsLeft[0].w=FOO_WIDTH;
clipsLeft[0].h=FOO_HEIGHT;
clipsLeft[1].x=FOO_WIDTH;
clipsLeft[1].y=FOO_HEIGHT;
clipsLeft[1].w=FOO_WIDTH;
clipsLeft[1].h=FOO_HEIGHT;
clipsLeft[2].x=FOO_WIDTH*2;
clipsLeft[2].y=FOO_HEIGHT;
clipsLeft[2].w=FOO_WIDTH;
clipsLeft[2].h=FOO_HEIGHT;
clipsLeft[3].x=FOO_WIDTH*3;
clipsLeft[3].y=FOO_HEIGHT;
clipsLeft[3].w=FOO_WIDTH;
clipsLeft[3].h=FOO_HEIGHT;
}*/
boolinit()
//InitializeallSDLsubsystems
if(SDL_Init(SDL_INIT_EVERYTHING)==-1)
returnfalse;
//Setupthescreen
screen=SDL_SetVideoMode(SCREEN_WIDTH,\
SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);
//Iftherewasanerrorinsettingupthescreen
if(screen==NULL)
//Setthewindowcaption
SDL_WM_SetCaption("
AnimationTest"
NULL);
//Ifeverythinginitializedfine
returntrue;
voidCs_Index()
srand(time(NULL));
inti,j,x,y,t;
intk=0;
m_s=true;
tu_x=-1;
lock=false;
quit=false;
end_y=30;
g_s=Begin;
for(i=0;
i<
4;
i++)
for(j=0;
j<
j++)
tu[i][j]=k;
k++;
k%=8;
}
x=rand()%4;
y=rand()%4;
t=tu[i][j];
tu[i][j]=tu[x][y];
tu[x][y]=t;
memset(flag,0,sizeof(flag));
menu_rect[0].x=0;
menu_rect[0].y=0;
menu_rect[0].w=250;
menu_rect[0].h=120;
menu_rect[1].x=0;
menu_rect[1].y=120;
menu_rect[1].w=250;
menu_rect[1].h=120;
end_rect[0].x=0;
end_rect[0].y=300;
end_rect[0].w=720;
end_rect[0].h=30;
end_rect[1].x=0;
end_rect[1].y=360;
end_rect[1].w=720;
end_rect[1].h=30;
boolload_files()
//Loadthespritesheet
foo=load_image("
foo.bmp"
);
begin=load_image("
begin.bmp"
end=load_image("
end.bmp"
menu=load_image("
menu.bmp"
pai1=load_image("
pai1.bmp"
pai2=load_image("
pai2.bmp"
pai3=load_image("
pai3.bmp"
pai4=load_image("
pai4.bmp"
pai5=load_image("
pai5.bmp"
pai6=load_image("
pai6.bmp"
pai7=load_image("
pai7.bmp"
pai8=load_image("
pai8.bmp"
//Iftherewasaprobleminloadingthesprite
if(foo==NULL||begin==NULL||end==NULL||menu==NULL||pai1==NULL||pai2==NULL||pai3==NULL||pai4==NULL||
pai5==NULL||pai6==NULL||pai7==NULL||pai8==NULL)
//bg=load_image("
1.png"
//Ifeverythingloadedfine
voidclean_up()
//Freethesurface
SDL_FreeSurface(foo);
SDL_FreeSurface(begin);
SDL_FreeSurface(end);
SDL_FreeSurface(menu);
SDL_FreeSurface(pai1);
SDL_FreeSurface(pai2);
SDL_FreeSurface(pai3);
SDL_FreeSurface(pai4);
SDL_FreeSurface(pai5);
SDL_FreeSurface(pai6);
SDL_FreeSurface(pai7);
SDL_FreeSurface(pai8);
//QuitSDL
SDL_Quit();
Foo:
Foo()
//Initializemovementvariables
offSet=0;
velocity=0;
voidFoo:
handle_events()
intx=0,y=0;
if(event.type==SDL_MOUSEBUTTONUP)
{
if(event.button.button==SDL_BUTTON_LEFT)
x=event.button.x;
y=event.button.y;
if(g_s==Begin)
if(y>
=300&
&
y<
=360&
x>
=240&
x<
490)
g_s=Run;
elseif(y>
=420&
quit=true;
//g_s=End;
elseif(g_s==Run)
if(lock&
!
flag[y/180][x/180])
flag[y/180][x/180]=true;
m_s=!
m_s;
m_x=x;
m_y=y;
voidmove()
if(g_s==Run&
lock==false)
if(m_s)
if((tu_x!
=-1)&
(tu[tu_x][tu_y]!
=tu[m_y/180][m_x/180]))
flag[tu_x][tu_y]=false;
flag[m_y/180][m_x/180]=false;
else
tu_x=m_y/180;
tu_y=m_x/180;
lock=true;
boolisopen=true;
for(inti=0;
i<
i++)
for(intj=0;
j<
j++)
if(flag[i][j]==false)
isopen=false;
if(isopen)
g_s=End;
elseif(g_s==End)
end_y+=60;
if(end_y>
360)
end_y=360;
end_rect[0].y=360-end_y;
end_rect[0].h=end_y;
end_rect[1].h=end_y;
show()
inti,j;
if(g_s==Begin)//如果开始状态,显示开始图片
apply_surface(0,0,begin,screen);
for(i=0;
2;
apply_surface(240,300+i*60,menu,screen,&
menu_rect[i]);
//遍历图像索引,在相应位置显示图像
for(j=0;
if(flag[i][j])//翻开
switch(tu[i][j])
case0:
apply_surface(180*j,180*i,pai1,screen);
break;
case1:
apply_surface(180*j,180*i,pai2,screen);
case2:
apply_surface(180*j,180*i,pai3,screen);
case3:
apply_surface(180*j,180*i,pai4,screen);
case4:
apply_surface(180*j,180*i,pai5,screen);
case5:
apply_surface(180*j,180*i,pai6,screen);
case6:
apply_surface(180*j,180*i,pai7,screen);
case7:
apply_surface(180*j,180*i,pa