当前位置:首页 > 趣味小程序 > 正文内容

【C++图形化编程】flappy bird(2)—游戏逻辑与完善

亿万年的星光4年前 (2021-11-06)趣味小程序2128

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); // 仅播放一次
		}
	}
}


这一步中,同时注意音乐需要播放。

扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

C++小游戏——flappy bird简单实现

C++小游戏——flappy bird简单实现

上一篇小游戏中,我们简单实现了打砖块小游戏。这一篇中,我们根据前面的框架,简单实现flappy bird小游戏。1.游戏框架   2.实现下落的小鸟#include &l...

【C++图形化编程】飞机大战2——运动与碰撞检测

上一篇中,简单实现了飞机大战的基本框架,这篇文章继续完善,使其可以进行游戏。#include <graphics.h> #include <conio.h>...

C++ 如何监听用户按下了哪个按键

想做一款小游戏,键盘事件是必须要了解的。前面的文章简单介绍过键盘事件,这篇文章简单实现了监听用户键盘的操作,主要监听“WASD”以及“上下左右”键参考代码#include<cstdio>...

 【C++图形化编程】飞机大战1—基础资源导入与基本框架

【C++图形化编程】飞机大战1—基础资源导入与基本框架

0.前言前面几篇文章中,我们实现了flappy的小游戏,这篇文章中,我们尝试制作飞机大战的游戏。首先,效果图如下:基础资源导入下载图片及音乐资源:https://box356.lanzoui.com/...

C++小游戏—反弹球实现打砖块

C++小游戏—反弹球实现打砖块

0.前言在上一篇中,我们用C++代码实现了弹球小游戏,上一篇链接可以点击这里查看。这一篇中,我们继续优化代码,使用上一篇的弹球小游戏进行扩展,实现打砖块效果。1.思路底部挡板跟随键盘移动在顶部生成目标...

【C++图形化编程】EasyX函数~鼠标操作相关函数

在EasyX中,我们可以用控制鼠标的相关函数。FlushMouseMsgBuffer清空鼠标消息缓冲区GetMouseMsg获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待PeekMouseM...