【C++图形化编程】flappy bird(2)—游戏逻辑与完善
0.前言
上一篇中,我们简单完成了flappy的图像导入和基本架构。这一篇文章中,我们继续完善。
1.游戏逻辑
这个游戏的简单逻辑就是:
(1)初始状态(游戏一开始),小鸟就一直往下落,如果落地,则游戏结束
意为:小鸟的坐标会一直变化(往下),如果坐标到游戏边框的底部(高度),则游戏结束
(2) 用户按下某个按键,小鸟往上移动,来躲避 ’移动‘过来的柱子。
意为:用户按下按键,小鸟的坐标发生变化,
(3)碰撞检测:如果小鸟碰到柱子,则游戏结束
意为:如果小鸟的坐标与柱子的坐标有重合,则游戏结束
(4)移动逻辑:是小鸟不断的往前,柱子不断的往后
2.基础画面显示
这一步我们要加载游戏的整个画面和声音部分。原理一样,上一篇中,我们已经下载下了图像和声音的资源文件,那么我们需要定义一些变量,然后把他们都加载出来。
void startup()
{
initgraph(350, 600);
loadimage(&img_bk, "background.jpg"); //背景
loadimage(&img_bd1, "bird1.jpg"); //小鸟1
loadimage(&img_bd2, "bird2.jpg"); //小鸟2
loadimage(&img_bar_up1, "bar_up1.gif"); //上方障碍物1
loadimage(&img_bar_up2, "bar_up2.gif"); //上方障碍物2
loadimage(&img_bar_down1, "bar_down1.gif"); //下方障碍物1
loadimage(&img_bar_down2, "bar_down2.gif"); //下方障碍物2
bird_x = 50;
bird_y = 200;
BeginBatchDraw();
mciSendString("open background.mp3 alias bkmusic", NULL, 0, NULL);//打开背景音乐
mciSendString("play bkmusic repeat", NULL, 0, NULL); // 循环播放
}然后画面展示部分:
void show()
{
putimage(0, 0, &img_bk); // 显示背景
putimage(150, -300, &img_bar_up1,NOTSRCERASE); // 显示上一半的障碍物
putimage(150, -300, &img_bar_up2,SRCINVERT);
putimage(150, 400, &img_bar_down1,NOTSRCERASE); // 显示下一半的障碍物
putimage(150, 400, &img_bar_down2,SRCINVERT);
putimage(bird_x, bird_y, &img_bd1,NOTSRCERASE); // 显示小鸟
putimage(bird_x, bird_y, &img_bd2,SRCINVERT);
FlushBatchDraw();
Sleep(50);
}效果如下:
参考代码:
#include <graphics.h>
#include <conio.h>
// 引用 Windows Multimedia API
#pragma comment(lib,"Winmm.lib")
IMAGE img_bk; //背景
IMAGE img_bd1,img_bd2; //小鸟1,小鸟2
IMAGE img_bar_up1,img_bar_up2,img_bar_down1,img_bar_down2; //上部障碍物1和2 、 下部障碍物1和2
int bird_x; //小鸟的x坐标
int bird_y; //小鸟的y坐标
void startup()
{
initgraph(350, 600);
loadimage(&img_bk, "background.jpg");
loadimage(&img_bd1, "bird1.jpg");
loadimage(&img_bd2, "bird2.jpg");
loadimage(&img_bar_up1, "bar_up1.gif");
loadimage(&img_bar_up2, "bar_up2.gif");
loadimage(&img_bar_down1, "bar_down1.gif");
loadimage(&img_bar_down2, "bar_down2.gif");
bird_x = 50;
bird_y = 200;
BeginBatchDraw();
mciSendString("open background.mp3 alias bkmusic", NULL, 0, NULL);//打开背景音乐
mciSendString("play bkmusic repeat", NULL, 0, NULL); // 循环播放
}
void show()
{
putimage(0, 0, &img_bk); // 显示背景
putimage(150, -300, &img_bar_up1,NOTSRCERASE); // 显示上一半的障碍物
putimage(150, -300, &img_bar_up2,SRCINVERT);
putimage(150, 400, &img_bar_down1,NOTSRCERASE); // 显示下一半的障碍物
putimage(150, 400, &img_bar_down2,SRCINVERT);
putimage(bird_x, bird_y, &img_bd1,NOTSRCERASE); // 显示小鸟
putimage(bird_x, bird_y, &img_bd2,SRCINVERT);
FlushBatchDraw();
Sleep(50);
}
void updateWithoutInput()
{
}
void updateWithInput(){
}
void gameover()
{
EndBatchDraw();
getch();
closegraph();
}
int main()
{
startup(); // 数据初始化
while (1) // 游戏循环执行
{
show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
gameover(); // 游戏结束、后续处理
return 0;
}3.让小鸟自由下落
游戏逻辑中,初始状态是让小鸟自由下落,这个操作是与用户输入无关的操作,我们让小鸟的坐标一直下降即可。但是也不能一直下降,因为屏幕是有范围的,一直下降就出范围了。所以在屏幕范围之内会一直下降。
效果:
参考代码:
void updateWithoutInput()
{
if (bird_y<500)
bird_y = bird_y+3;
}4.用户操作让小鸟上升
这一步的本质还是移动小鸟的坐标,所以,当用户按下某个按键时,我们要让小鸟的坐标进行移动操作。
效果图:
参考:
void updateWithInput()
{
char input;
if(kbhit()) // 判断是否有输入
{
input = getch();
if (input == ' ' && bird_y>20)
{
bird_y = bird_y - 60;
mciSendString("close jpmusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
mciSendString("open Jump.mp3 alias jpmusic", NULL, 0, NULL); // 打开跳动音乐
mciSendString("play jpmusic", NULL, 0, NULL); // 仅播放一次
}
}
}这一步中,同时注意音乐需要播放。
扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。




