C++版本简易Flappy bird
大一,上学期学完了C,写了几个控制台游戏
这学期自学C++,由于学校课程第七周才有C++
边学边写了这个小游戏,SDL 图形库完成的图形绘画
时间匆忙,BUG也有,代码效率比较低
和原作品还是很大的差别, 源代码在附件游戏文件夹中
演示图
#include <stdlib.h> #include<windows.h> #include <time.h> #include<conio.h> #include <iostream> #include <mmsystem.h> #include "SDL\SDL_image.h" #include "SDL\SDL_ttf.h" #include "SDL\SDL.h" using namespace std; #pragma comment(lib, "winmm.lib") #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") int iii=0; int score =0; int y=0; int posi[3][2]= {{640,-300},{940,-300},{1240,-300}}; int i=0,n=3; //n为管道对数 SDL_Color textColor_1 = { 37, 134, 108 };//绿色 //SDL_Color textColor_2 = { 112, 112, 35 }; SDL_Color textColor_2 = { 255, 255, 255 }; //白色 SDL_Color textColor_3 = { 0, 88, 132 }; //白色 class Event { public: SDL_Event event; Uint8 *keystates; Event() { keystates=SDL_GetKeyState( NULL ); } }; Event thing; class Data { public: int bird_y; int score; int posi[20][2]; SDL_Rect bird_1; SDL_Rect bird_2; SDL_Rect bg; SDL_Rect welcome; SDL_Rect pipe_up; SDL_Rect pipe_down; SDL_Rect bird_cls; SDL_Rect foot; SDL_Surface* load_imag(char *s) { SDL_Surface* temp; temp=IMG_Load(s); bg.x=0; bg.y=0; bg.w=640; bg.h=480; welcome.x=681; welcome.y=0; welcome.w=640; welcome.h=480; bird_1.x=17; bird_1.y=508; bird_1.w=52; bird_1.h=34; bird_2.x=461; bird_2.y=531; bird_2.w=52; bird_2.h=33; bird_cls.w=52; bird_cls.h=33; bird_cls.x=0; bird_cls.y=0; pipe_up.x=1361; pipe_up.y=11; pipe_up.w=103; pipe_up.h=410; pipe_down.x=1487; pipe_down.y=14; pipe_down.w=103; pipe_down.h=443; foot.x=0; foot.y=404; foot.w=640; foot.h=80; return temp;//SDL_DisplayFormat( temp ); } TTF_Font* load_font() { SDL_Init( SDL_INIT_EVERYTHING ); TTF_Init(); return TTF_OpenFont( "main_1.dat", 36 ); } }; Data data; class Pri { public: SDL_Surface* out; //输出 SDL_Surface* main ; //主窗口 TTF_Font *font; SDL_Rect a; //设置初始位置 SDL_Surface*bird; SDL_Rect xy; SDL_Surface*font_1; SDL_Surface*font_2; SDL_Surface*font_11; SDL_Surface*font_22; Pri() { TTF_Font *font = NULL; init();//初始化输出设备 } int init() { SDL_Init( SDL_INIT_EVERYTHING ); TTF_Init(); main= SDL_SetVideoMode( 640, 478, 32, SDL_SWSURFACE ); SDL_WM_SetCaption("Flappy bird",NULL);//标题 font=data.load_font(); out=data.load_imag("main_2.dat"); y=150; posi[0][0]=640; posi[0][1]=-300; posi[1][0]=940; posi[1][1]=-300; posi[2][0]=1240; posi[2][1]=-300; return 1; } int pipe() { } int bir(int y)//x=150 {int ii; i+=1; xy.x=150; xy.y=y; if(i<14) { xy.x=150; xy.y=y; SDL_BlitSurface(out,&data.bg,main,NULL); for(ii=0;ii<n;ii++) { xy.x=posi[ii][0]; xy.y=posi[ii][1]; SDL_BlitSurface(out,&data.pipe_down,main,&xy); xy.x=posi[ii][0]; xy.y=posi[ii][1]+600; SDL_BlitSurface(out,&data.pipe_up,main,&xy); } xy.x=150; xy.y=y; SDL_BlitSurface(out,&data.bird_1,main,&xy); xy.x=0; xy.y=404; SDL_BlitSurface(out,&data.foot,main,&xy); } else { xy.x=150; xy.y=y; SDL_BlitSurface(out,&data.bg,main,NULL); for(ii=0;ii<n;ii++) { xy.x=posi[ii][0]; xy.y=posi[ii][1]; SDL_BlitSurface(out,&data.pipe_down,main,&xy); xy.x=posi[ii][0]; xy.y=posi[ii][1]+600; SDL_BlitSurface(out,&data.pipe_up,main,&xy); } xy.x=150; xy.y=y; SDL_BlitSurface(out,&data.bird_2,main,&xy); xy.x=0; xy.y=404; SDL_BlitSurface(out,&data.foot,main,&xy); if(i>28)i=0; } return 0; } int bg() { SDL_BlitSurface(out,&data.bg,main,&xy); return 0; } int over() { int x=0,y=0,i=0; xy.x=250; xy.y=150; font_1=TTF_RenderText_Solid( font, "Game over !", textColor_3); SDL_BlitSurface( font_1 , NULL, main, &xy); SDL_Flip(main); xy.x=350; xy.y=200; font_1=TTF_RenderText_Solid( font, "Retry game", textColor_1 ); font_11=TTF_RenderText_Solid( font, "Retry game", textColor_2 ); SDL_BlitSurface( font_1 , NULL, main, &xy); xy.x=350; xy.y=280; font_2=TTF_RenderText_Solid( font, " Exit game", textColor_1 ); font_22=TTF_RenderText_Solid( font, " Exit game", textColor_2 ); SDL_BlitSurface( font_2 , NULL, main, &xy); /* xy.x=10; xy.y=440; //野指针 SDL_BlitSurface( TTF_RenderText_Solid( font, "Esc:exit game Space:to jump hekun ", textColor_1 ) , NULL, main, &xy); SDL_Flip( main ); //更新窗口 */ while(SDL_PollEvent( &thing.event ), 1) { i+=2; Sleep(1); if( thing.keystates[ SDLK_ESCAPE] )exit(0); if( thing.event.type == SDL_QUIT )// 点击了SDL关闭按钮 { exit(0); } if((x>350&&x<540)&&(y<240)&&(y>200)) { if(thing. event.type == SDL_MOUSEBUTTONDOWN) if(thing.event.button.button== SDL_BUTTON_LEFT ) { SDL_FreeSurface(font_1); SDL_FreeSurface(font_11); SDL_FreeSurface(font_22); SDL_FreeSurface(font_2); WinExec("Flappy bird.exe",NULL); exit(0); return 11; } } else { } if((x>350&&x<540)&&(y<320)&&(y>280)) //结束游戏 { if(thing. event.type == SDL_MOUSEBUTTONDOWN) if(thing.event.button.button== SDL_BUTTON_LEFT )exit(0); } if(thing. event.type == SDL_MOUSEMOTION ) { x=thing.event.motion.x; y=thing.event.motion.y; //获得鼠标坐标 if((thing.event.motion.x>350&&thing.event .motion .x<540)&&(thing.event.motion.y<240)&&(thing.event.motion.y>200)) { xy.x=350; xy.y=200; SDL_BlitSurface( font_11, NULL, main, &xy); SDL_Flip(main); } else { xy.x=350; xy.y=200; SDL_BlitSurface( font_1 , NULL, main, &xy); SDL_Flip(main); } if((thing.event.motion.x>350&&thing.event .motion .x<540)&&(thing.event.motion.y<320)&&(thing.event.motion.y>280)) { xy.x=350; xy.y=280; SDL_BlitSurface( font_22 , NULL, main, &xy); SDL_Flip(main); } else { xy.x=350; xy.y=280; SDL_BlitSurface( font_2 , NULL, main, &xy); SDL_Flip(main); } } } return 0; } int welcome() { int x=0,y=0,i=0; SDL_BlitSurface(out,&data.welcome,main,NULL); bird=out; xy.x=350; xy.y=200; font_1=TTF_RenderText_Solid( font, "Start game", textColor_1 ); font_11=TTF_RenderText_Solid( font, "Start game", textColor_2 ); SDL_BlitSurface( font_1 , NULL, main, &xy); xy.x=350; xy.y=280; font_2=TTF_RenderText_Solid( font, " Exit game", textColor_1 ); font_22=TTF_RenderText_Solid( font, " Exit game", textColor_2 ); SDL_BlitSurface( font_2 , NULL, main, &xy); xy.x=10; xy.y=440; //野指针 SDL_BlitSurface( TTF_RenderText_Solid( font, "Esc:exit game Space:to jump hekun ", textColor_1 ) , NULL, main, &xy); SDL_Flip( main ); //更新窗口 while(SDL_PollEvent( &thing.event ), 1) { i+=2; Sleep(1); if( thing.keystates[ SDLK_ESCAPE] )exit(0); if( thing.event.type == SDL_QUIT )// 点击了SDL关闭按钮 { exit(0); } if((x>350&&x<540)&&(y<240)&&(y>200)) { if(thing. event.type == SDL_MOUSEBUTTONDOWN) if(thing.event.button.button== SDL_BUTTON_LEFT ) { SDL_FreeSurface(font_1); SDL_FreeSurface(font_11); SDL_FreeSurface(font_22); SDL_FreeSurface(font_2); return 0; } } else { } if((x>350&&x<540)&&(y<320)&&(y>280)) //结束游戏 { if(thing. event.type == SDL_MOUSEBUTTONDOWN) if(thing.event.button.button== SDL_BUTTON_LEFT )exit(0); } if(thing. event.type == SDL_MOUSEMOTION ) { x=thing.event.motion.x; y=thing.event.motion.y; //获得鼠标坐标 if((thing.event.motion.x>350&&thing.event .motion .x<540)&&(thing.event.motion.y<240)&&(thing.event.motion.y>200)) { xy.x=350; xy.y=200; SDL_BlitSurface( font_11, NULL, main, &xy); SDL_Flip(main); } else { xy.x=350; xy.y=200; SDL_BlitSurface( font_1 , NULL, main, &xy); SDL_Flip(main); } if((thing.event.motion.x>350&&thing.event .motion .x<540)&&(thing.event.motion.y<320)&&(thing.event.motion.y>280)) { xy.x=350; xy.y=280; SDL_BlitSurface( font_22 , NULL, main, &xy); SDL_Flip(main); } else { xy.x=350; xy.y=280; SDL_BlitSurface( font_2 , NULL, main, &xy); SDL_Flip(main); } } if(i==400) { xy.x=150; xy.y=250; SDL_BlitSurface(bird,&data.bird_1,main,&xy); SDL_Flip(main); } if(i==800) { xy.x=150; xy.y=250; SDL_BlitSurface(bird,&data.bird_2,main,&xy); i=0; SDL_Flip(main); } } return 0; } }; Pri pri; int game_judge() {int i=0; if(y>370||y<-10) { if(pri.over()==11)return 12; } for(i=0;i<3;i++) { if(posi[i][0]<202 &&posi[i][0]>50) { if(y<posi[i][1]+ 420 ||y>posi[i][1]+570) {if(pri.over()==11)return 12;} } } return 0; } int game_loop() { y=150,i=0; int ii=0,iii=0; SDL_Surface *font; pri.bg(); char s[50]; Uint32 start = 0; sprintf(s," FPS:%d\t\t\t\t\t\t\t\tScore:%d",1000/(SDL_GetTicks()-start),score); int q=0; while(SDL_PollEvent( &thing.event ), 1) { start = SDL_GetTicks(); i++; Sleep(1); SDL_Flip(pri.main); y+=4; if(y>430)y=100; if(thing.event.button.state==SDL_PRESSED)y-=20; if( thing.keystates[ SDLK_SPACE] )y-=20; if( thing.keystates[ SDLK_ESCAPE] )exit(0); if( thing.event.type == SDL_QUIT )// 点击了SDL关闭按钮 { exit(0); } if(game_judge()==12)return 0; pri.bir(y); //显示 每秒循环的次数 ii++; if(ii>20) { sprintf(s," FPS:%d\t\t\t\t\t\t\t\tScore:%d",1000/(SDL_GetTicks()-start)+rand()%5,score); ii=0; } font=TTF_RenderText_Solid( pri.font, s, textColor_2 ); SDL_BlitSurface(font , NULL,pri. main, NULL); SDL_Flip(pri.main); SDL_FreeSurface(font); posi[0][0]-=2; posi[1][0]-=2; posi[2][0]-=2; if(posi[0][0]<=(-110)) {posi[0][0]=posi[2][0]+300;posi[0][1]=-(rand()%180)-220;} if(posi[1][0]<=(-110)) {posi[1][0]=posi[0][0]+300;posi[1][1]=-(rand()%180)-220;} if(posi[2][0]<=(-110)) {posi[2][0]=posi[1][0]+300;posi[2][1]=-(rand()%180)-220;} iii++; if(iii>50) for(iii=0;iii<3;iii++) { if(posi[iii][0]<50); score++; iii=0; break; } } return 0; } int main(int argc, char* argv[]) { while(1) { pri.init();//初始化输出设备 pri.welcome(); game_loop(); } return 0; }
以上所述就是本文的全部内容了,希望大家能够喜欢。
赞 (0)