这是C语言高级demo。用C语言实现Flappy Bird这款经典的游戏,最终的效果要达到与原著有一定的相似度。示意图如下:(完整的代码在结语部分)
本demo的要求有:
首先介绍我用到了那些技术。
总的来说,运用的技术没有太多,但是我在实际编码时发现了不少问题,比如图片的黑边如何处理,按键灵敏度等,在后面我会解释如何处理它们的。
(并不标准的流程图,但基本额能够表达清楚整个游戏的运行过程)
以下内容全部定义在一个头文件中:FB_headfile.h
struct Bird
{
int birdhigh;
int birdpicture;
int number;
float flow;
float up;
};
typedef struct Picture
{
IMAGE birdpt[3][2];//bird图片
IMAGE bandpt[5][2];//障碍物图片
IMAGE backgroundpt;//背景图片
IMAGE landpt;//下方可以移动土地
IMAGE big_num[10][2];//大号的数字
IMAGE mid_num[10][2];//中号数字
IMAGE sm_num[10];//小号数字
IMAGE gametitle[2];//游戏的标题
IMAGE getready[2];//准备阶段标题
/*所有的按钮和得分面板
0:button_play; 1:button_score;
2:tutorial.jpg; 3;score_panel*/
IMAGE button[4][2];
IMAGE copyright[2];//开始界面的版权文字
IMAGE medals[4][2];//奖牌
IMAGE gameover[2];//游戏结束
IMAGE newscore;//最新的高分
};
typedef struct Data
{
int landdata;//下方移动土地
//障碍物 0是障碍物的x坐标,1是上障碍物的y坐标 2是下方障碍物y坐标
int banddata[5][3];
int nowscore;//本次得分
int speed;//移动速度
int oldscore[3];//0第一,1第二,2第三
int scoreblock;//分数锁
bool life;//bird是否存活
Bird bird;//bird数据
};
void initdata(Data &data);//初始化游戏数据
void birdct(Data &data);// bird控制
bool play();//开始游戏
void databack(Data &data);//数据处理
void gamestartmenu(Picture picture, Data data);//绘制开始界面
void getread(Picture picture,Data data);//绘制getready界面
void picturedeal(Picture &picture,int n);//游戏图片处理(加载与旋转) n=1 是加载图片
void drowpicture(Picture picture, Data data);//绘制游戏内容
void collision(Data &data);//碰撞
void scorepanl(Picture picture,Data &data);//得分面板
void changeband(Data &data, int n);//改变障碍物的Y轴数据
using namespace std;
代码示例
BeginBatchDraw();//开始批量绘图
putimage(0, 0, &picture.backgroundpt);
putimage(50, 100, &picture.gametitle[0], SRCAND);
putimage(50, 100, &picture.gametitle[1], SRCPAINT);
putimage(115, 180, &picture.birdpt[number][0], SRCAND);
putimage(115, 180, &picture.birdpt[number][1], SRCPAINT);
putimage(20, 345, &picture.button[0][0], SRCAND);
putimage(20, 345, &picture.button[0][1], SRCPAINT);
putimage(150, 340, &picture.button[1][0], SRCAND);
putimage(150, 340, &picture.button[1][1], SRCPAINT);
putimage(n, 400, &picture.landpt);
putimage(70, 425, &picture.copyright[0], SRCAND);
putimage(70, 425, &picture.copyright[1], SRCPAINT);
FlushBatchDraw();//将已经绘制的图像一次性显示出来
Sleep(50);
putimage(0, 0, &picture.backgroundpt);
putimage(50, 100, &picture.gametitle[0], SRCAND);
putimage(50, 100, &picture.gametitle[1], SRCPAINT);
putimage(115, 180, &picture.birdpt[number][0], SRCAND);
putimage(115, 180, &picture.birdpt[number][1], SRCPAINT);
putimage(20, 340, &picture.button[0][0], SRCAND);
putimage(20, 340, &picture.button[0][1], SRCPAINT);
putimage(150, 340, &picture.button[1][0], SRCAND);
putimage(150, 340, &picture.button[1][1], SRCPAINT);
putimage(n, 400, &picture.landpt);
putimage(70, 425, &picture.copyright[0], SRCAND);
putimage(70, 425, &picture.copyright[1], SRCPAINT);
FlushBatchDraw();//将已经绘制的图像一次性显示出来
EndBatchDraw();//结束批量绘图
实现前的讲解:
这是游戏中最复杂的部分。
感谢你的参阅,游戏还有很多不完善的地方,有兴趣的话你可以添加自己的玩法。最后附上项目的地址:点这里 。