嵌入式结构课程设计.docx
- 文档编号:8401747
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:27
- 大小:90.52KB
嵌入式结构课程设计.docx
《嵌入式结构课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式结构课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
嵌入式结构课程设计
嵌入式结构课程设计
(2011/2012学年第二学期)
------基于SDL自定义游戏
-
系别:
软件学院
指导教师:
班级:
学号:
姓名:
一、需求分析:
1.问题描述:
编写一个程序基于SDL库的自定义游戏。
2.具体介绍:
在SDL的基础上编写一个程序,使其完成对游戏的实现。
本次课程设计做的是一个小人打飞机的游戏,利用小人在最下边可以左右移动,发射子弹(,分别用三个按钮:
左移动,右移动,发射子弹按钮。
飞机从上边飞出,被子弹击中则爆炸消失,如果没被打中的,飞机由上往下漂移,碰到小人则,游戏结束。
例如:
本实验实现小人与飞机的移动,子弹的发射,爆炸。
在最后将此游戏移植到开发板上,实现触屏功能。
二、总体设计:
系统构架:
详细设计
1、初始化以及创建屏幕
if(SDL_Init(SDL_INIT_VIDEO)<0)
{
printf("Couldn'tinitializeSDL:
%s\n",SDL_GetError());
exit
(2);
}
screen=SDL_SetVideoMode(640,480,0,SDL_SWSURFACE);
if(screen==NULL)
{
printf("Couldn'tset640x480videomode:
%s\n",SDL_GetError());
exit
(2);
2、加载背景图片
intLoadData(void)
{
inti;
/*Loadgraphics*/
player.image=LoadImage(DATAFILE("player.gif"),1);
if(player.image==NULL){
return(0);
}
shots[0].image=LoadImage(DATAFILE("shot.gif"),0);
if(shots[0].image==NULL){
return(0);
}
for(i=1;i shots[i].image=shots[0].image; } aliens[0].image=LoadImage(DATAFILE("alien.gif"),1); if(aliens[0].image==NULL){ return(0); } for(i=1;i aliens[i].image=aliens[0].image; } explosions[0].image=LoadImage(DATAFILE("explosion.gif"),1); for(i=1;i explosions[i].image=explosions[0].image; } background=LoadImage(DATAFILE("background.gif"),0); /*Setuptheupdaterectanglepointers*/ for(i=0;i blits[i].srcrect=&srcupdate[i]; blits[i].dstrect=&dstupdate[i]; } return (1); } 3、添加按钮 if(strcmp(str,"left")==0) { roundedBoxColor(screen,100,400,180,440,3,0xfFF33F5f); for(i=0;i { if(! shots[i].alive) break; } if(i! =MAX_SHOTS) { shots[i].x=player.x+(player.image->w-shots[i].image->w)/2; shots[i].y=player.y-shots[i].image->h; shots[i].alive=1; } } if(strcmp(str,"mid")==0) { roundedBoxColor(screen,360,400,400,440,3,0x14E1F4ff); } if(strcmp(str,"right")==0) { roundedBoxColor(screen,560,400,600,440,3,0x17F438ff); } 4、设置触屏: inttsOpen() { ts=ts_open(DEV_NAME,0); if(! ts) { perror("Openerror! \n"); exit (1); } if(ts_config(ts)) { perror("ts_config\n"); exit (1); } return0; } inttsClose() { intret; ret=ts_close(ts); if(ret<0) { perror("Closeerror! \n"); exit (1); } return0; } while(SDL_PollEvent(&event)) { intx=0,y=0; intret; tsOpen(); ret=ts_read(ts,&sample,1); if(ret<0) { perror("ts_read"); exit (1); } printf("x=%d,y=%d,press=%d\n",sample.x,sample.y,sample.pressure); tsClose(); if(sample.pressure==1) { x=sample.x; y=sample.y; if((x>=360&&x<=400)&&((y>=400)&&(y<=440))) { draw_button("mid",1); SDL_UpdateRect(screen,0,0,0,0); player.facing--; } if((x>=560&&x<=600)&&(y>=400&&y<=440)) { draw_button("right",1); SDL_UpdateRect(screen,0,0,0,0); player.facing++; } if((x>=100&&x<=180)&&(y>=400&&y<=440)) { draw_button("left",1); SDL_UpdateRect(screen,0,0,0,0); } if((x>=250&&x<=290)&&(y>=400&&y<=440)) { draw_button("quit",1); SDL_UpdateRect(screen,0,0,0,0); }break; } } } 五、总结 在课程设计之前,对sdl很抽象,只知道SDL是跨平台的多媒体开发包,SDL里边有各种的库函数,通过调用sdl库可以实现界面的颜色,字体,声音的操作,是生成的界面看起来更美观。 可以说,这次课程设计的过程,就是一个自我认知的过程,本来毫无头绪的东西,在你一点点啃骨头似的学习中,慢慢发现了它的强大与兴趣,觉得SDL那么的神奇。 尽管在学习过程中有很多困难,遇到了很多想不到的问题,但是只要相信自己,请教老师同学,查阅资料,问题都可以迎刃而解。 这两周,不仅对SDL进行了比较全面的学习,收获也颇丰,以后面对什么问题,都要相信自己,只要自己愿意学习,愿意解决,就什么都阻挡不了自己。 虽然我做的这个游戏还不完善,还有很对可以改善的地方,但是我觉得这个游戏挺有创新的,我会继续努力的,谢谢老师的耐心指导。 在学习过程中认真仔细非常重要的,我在写程序时由于马虎犯了很多不应该的错误。 只有认真才能收获更多的知识。 我会继续努力,谢谢老师的指导。 六、参考文献 《嵌入式Linux上的C语言编程实践》电子工业出版社 源代码 #include #include #include #include #include #include #include #include #include #include #include #include #include"tslib.h" #defineDEV_NAME"/dev/event1" #defineDIR_SEP"/" #defineDIR_CUR"" #defineDATAFILE(X)DIR_CUR"data"DIR_SEPX #defineFRAMES_PER_SEC50 #definePLAYER_SPEED4 #defineMAX_SHOTS3 #defineSHOT_SPEED6 #defineMAX_ALIENS30 #defineALIEN_SPEED5 #defineALIEN_ODDS(1*FRAMES_PER_SEC) #defineEXPLODE_TIME4 #defineMAX_UPDATES3*(1+MAX_SHOTS+MAX_ALIENS) typedefstruct{ intalive; intfacing; intx,y; SDL_Surface*image; }object; SDL_Surface*screen; SDL_Surface*background; objectplayer; intreloading; objectshots[MAX_SHOTS]; objectaliens[MAX_ALIENS]; objectexplosions[MAX_ALIENS+1]; intnumupdates; SDL_Rectsrcupdate[MAX_UPDATES]; SDL_Rectdstupdate[MAX_UPDATES]; structblit{ SDL_Surface*src; SDL_Rect*srcrect; SDL_Rect*dstrect; }blits[MAX_UPDATES]; structtsdev*ts; structts_samplesample; //鎵撳紑璁惧 inttsOpen() { ts=ts_open(DEV_NAME,0); if(! ts) { perror("Openerror! \n"); exit (1); } if(ts_config(ts)) { perror("ts_config\n"); exit (1); } return0; } //鍏抽棴璁惧 inttsClose() { intret; ret=ts_close(ts); if(ret<0) { perror("Closeerror! \n"); exit (1); } return0; } SDL_Surface*LoadImage(char*datafile,inttransparent) { SDL_Surface*image,*surface; image=IMG_Load(datafile); if(image==NULL){ fprintf(stderr,"Couldn'tloadimage%s: %s\n", datafile,IMG_GetError()); return(NULL); } if(transparent){ /*Assuming8-bitBMPimage*/ SDL_SetColorKey(image,(SDL_SRCCOLORKEY|SDL_RLEACCEL), *(Uint8*)image->pixels); } surface=SDL_DisplayFormat(image); SDL_FreeSurface(image); return(surface); } intLoadData(void) { inti; /*Loadgraphics*/ player.image=LoadImage(DATAFILE("player.gif"),1); if(player.image==NULL){ return(0); } shots[0].image=LoadImage(DATAFILE("shot.gif"),0); if(shots[0].image==NULL){ return(0); } for(i=1;i shots[i].image=shots[0].image; } aliens[0].image=LoadImage(DATAFILE("alien.gif"),1); if(aliens[0].image==NULL){ return(0); } for(i=1;i aliens[i].image=aliens[0].image; } explosions[0].image=LoadImage(DATAFILE("explosion.gif"),1); for(i=1;i explosions[i].image=explosions[0].image; } background=LoadImage(DATAFILE("background.gif"),0); /*Setuptheupdaterectanglepointers*/ for(i=0;i blits[i].srcrect=&srcupdate[i]; blits[i].dstrect=&dstupdate[i]; } return (1); } voidFreeData(void) { inti; /*Freegraphics*/ SDL_FreeSurface(player.image); SDL_FreeSurface(shots[0].image); SDL_FreeSurface(aliens[0].image); SDL_FreeSurface(explosions[0].image); SDL_FreeSurface(background); } voidCreateAlien(void) { inti; /*Lookforafreealienslot*/ for(i=0;i if(! aliens[i].alive) break; } if(i==MAX_ALIENS){ return; } /*Figureoutwhichdirectionittravels*/ do{ aliens[i].facing=(rand()%3)-1; }while(aliens[i].facing==0); /*Figureoutit'sinitiallocation*/ aliens[i].y=0; if(aliens[i].facing<0){ aliens[i].x=screen->w-aliens[i].image->w-1; }else{ aliens[i].x=0; } aliens[i].alive=1; } voidDrawObject(object*sprite) { structblit*update; update=&blits[numupdates++]; update->src=sprite->image; update->srcrect->x=0; update->srcrect->y=0; update->srcrect->w=sprite->image->w; update->srcrect->h=sprite->image->h; update->dstrect->x=sprite->x; update->dstrect->y=sprite->y; update->dstrect->w=sprite->image->w; update->dstrect->h=sprite->image->h; } voidEraseObject(object*sprite) { structblit*update; intwrap; /*horizontallyacrossthescreen*/ update=&blits[numupdates++]; update->src=background; update->srcrect->x=sprite->x%background->w; update->srcrect->y=sprite->y; update->srcrect->w=sprite->image->w; update->srcrect->h=sprite->image->h; wrap=(update->srcrect->x+update->srcrect->w)-(background->w); if(wrap>0){ update->srcrect->w-=wrap; } update->dstrect->x=sprite->x; update->dstrect->y=sprite->y; update->dstrect->w=update->srcrect->w; update->dstrect->h=update->srcrect->h; /*Assumingspritescanonlywrapacrossonebackgroundtile*/ if(wrap>0){ update=&blits[numupdates++]; update->src=background; update->srcrect->x=0; update->srcrect->y=sprite->y; update->srcrect->w=wrap; update->srcrect->h=sprite->image->h; update->dstrect->x=((sprite->x/background->w)+1)*background->w; update->dstrect->y=sprite->y; update->dstrect->w=update->srcrect->w; update->dstrect->h=update->srcrect->h; } } voidUpdateScreen(void) { inti; for(i=0;i SDL_LowerBlit(blits[i].src,blits[i].srcrect, screen,blits[i].dstrect); } SDL_UpdateRects(screen,numupdates,dstupdate); numupdates=0; } intCollide(object*sprite1,object*sprite2) { if((sprite1->y>=(sprite2->y+sprite2->image->h))|| (sprite1->x>=(sprite2->x+sprite2->image->w))|| (sprite2->y>=(sprite1->y+sprite1->image->h))|| (sprite2->x>=(sprite1->x+sprite1->image->w))){ return(0); } return (1); } voidWaitFrame(void) { staticUint32next_tick=0; Uint32this_tick; /*Waitforthenextframe*/ this_tick=SDL_GetTicks(); if(this_tick SDL_Delay(next_tick-this_tick); } next_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 结构 课程设计