Demo目录

  • 导语
  • 序章
  • 游戏总体设计
    • 游戏流程图
    • 游戏中数据与函数介绍
  • 游戏实现
    • 开始界面实现
    • bird控制
    • 游戏绘图
    • 碰撞与得分实现
  • 结语

导语

这是C语言高级demo。用C语言实现Flappy Bird这款经典的游戏,最终的效果要达到与原著有一定的相似度。示意图如下:(完整的代码在结语部分)

本demo的要求有:

  1. 游戏画面精美,尽力达到原汁原味。
  2. 在游戏中没有图像的闪烁,画质良好且稳定。
  3. 对游戏的数据以文件形式储存。
  4. 实现积分。
  5. 游戏有玩法提示,良好的交互。
  6. 合适的音效。

序章

首先介绍我用到了那些技术。

  1. C语言
  2. EasyX图形库。EasyX 是针对 C++ 的图形库,可以帮助 C++语言初学者快速上手图形和游戏编程。它的内部调用Windows API 兼容性良好,对新手友好,使用简单,支持鼠标,批量绘图技术,支持真彩色。在项目开发中熟练使用图像库中对图片操作的函数,理解批量绘图函数并运用
  3. Window.h中的一些函数的使用:
    • 键盘处理函数GetAsyncKeyState(),它是一个用来判断函数调用时指定虚拟键的状态,确定用户当前是否按下了键盘上的一个键的函数。如果按下,则返回值最高位为1;
    • mciSendString(),它是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等。

总的来说,运用的技术没有太多,但是我在实际编码时发现了不少问题,比如图片的黑边如何处理,按键灵敏度等,在后面我会解释如何处理它们的。

游戏总体设计

游戏流程图


(并不标准的流程图,但基本额能够表达清楚整个游戏的运行过程)

游戏中数据与函数介绍

以下内容全部定义在一个头文件中:FB_headfile.h

  1. 一, bird数据
struct Bird
{int birdhigh;int birdpicture;int number;float flow;float up;
};
  1. 游戏中的图片数据
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;//最新的高分
};
  1. 游戏其他数据
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数据
};
  1. 用到的函数
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;

游戏实现

开始界面实现


实现前的讲解:(之后会默认你已经明白这些知识了)

  1. 黑边处理:仔细的你可能已经发现了,几乎所有的图片数据都是二维,并且第二维的元素为2。我简单解释一下:因为素材图片都是网上找到,如果直接画上去会有很难看的黑边,我用的图形库又不能使用透明背景的图片,但它支持绘图时,将要绘制的图像像素与他要覆盖范围内的原像素进行位运算并显示运算后的结果图像,基于这个功能,我们可以自己实现去黑边,首先每张图片需要制作它的掩码图,比如:

    有了它的掩码图,就可以去掉黑边了。具体的原理可以自行百度,我提供一份参考资料:点这里
  2. 闪烁处理: 大多数情况下,我们直接绘制在屏幕上的图片会有严重的闪烁!这十分影响游戏的效果,发生闪烁的原因可以自行百度,这里不再赘述。好在图形库位我们实现了批量绘图的技术,简单提及一下它是如何实现的:在开始批量绘图时(调用:BeginBatchDraw()),他就另外创建了一个画板,你的只有所有绘制的图像都会这这个画板上,而不是直接显示在你的显示器上,当你本次绘画完成时(调用FlushBatchDraw();),它会一次性把你之前画的内容显示出来。最后记得关闭批量绘图
    tips:不同的图形库对于批量绘图有不同实现。
  3. 这一部分编码难度在分数排名的绘制,它涉及到文件操作、界面的跳转等。

代码示例

  1. 掩码图的运用与批量绘图技术:
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();//结束批量绘图

bird控制

实现前的讲解:

  1. 这个部分实现的难点在于捕获键盘信息。我使用了window的api(GetAsyncKeyState)来获取按键信息。
  2. 设置bird的下降速度。

流程图:

实现函数:birdct()

游戏绘图

流程图:

实现函数:drowpicture()

碰撞与得分实现

这是游戏中最复杂的部分。

  1. 碰撞的设计思路:

    实现函数:collision()

结语

感谢你的参阅,游戏还有很多不完善的地方,有兴趣的话你可以添加自己的玩法。最后附上项目的地址:点这里

C语言高级demo Flappy Bird游戏相关推荐

  1. flappy bird游戏源代码揭秘和下载后续---移植到android真机上

    前言:         上一篇博客 flappy bird游戏源代码揭秘和下载,源码是运行在window或者mac系统上的,现在我们需要把代码移植到android真机上,让小鸟在手机里飞起来! ps: ...

  2. flappy bird游戏源代码揭秘和下载后续---移植到html5网页浏览器

    前言:      我们分析了flappy bird的代码思路(flappy bird游戏源代码揭秘和下载),也移植到了android平台(flappy bird游戏源代码揭秘和下载后续---移植到an ...

  3. flappy bird游戏源代码揭秘和下载

    背景: 最近火爆全球的游戏flappy bird让笔者叹为观止,于是花了一天的时间山寨了一个一模一样的游戏,现在把游戏的思路和源码分享出来,代码是基于javascript语言,cocos2d-x游戏引 ...

  4. cocos2dx-html5 实现网页版flappy bird游戏

    我也是第一次使用cocos2d_html5,对js和html5也不熟,看引擎自带的例子和引擎源码,边学边做,如果使用过cocos2d-x的话,完成这个游戏还是十分简单的.游戏体验地址: http:// ...

  5. 飞翔的圆(Flappy Bird)游戏源码完整版

    2019独角兽企业重金招聘Python工程师标准>>> 这个源码是一个不错的休闲类的游戏源码,飞翔的圆(Flappy Bird)游戏源码V1.0,本项目是一个仿Flappy Bird ...

  6. 利用python开发的flappy bird 游戏

    python 中 pygame模块能让我们很方便的编写游戏,16年我用python 仿制了flappy bird 游戏,下面是游戏的完整代码以及素材,分享给大家. 第一个python文件,flappy ...

  7. Python详细了解强化学习算法并基于强化学习Q_learning让电脑玩flappy bird游戏

    完整代码:https://github.com/Connor666/flappy_bird-RL 首先,如果你是为了追求一个非常高的强化学习效果,也就是flappy bird的分数,那么建议出门右拐选 ...

  8. HTML5版Flappy Bird游戏源码下载

    Flappy Bird相信大家都很熟悉了,2014年最热门的手机游戏之一.Flappy Bird这款游戏是一位来自越南河内的独立游戏开发者阮哈东开发,形式简易但难度极高的休闲游戏,很容易让人上瘾.今天 ...

  9. 做游戏,学编程(C语言) 4 flappy bird

    在学习数组之前,我们再做一个好玩的游戏:flappy bird.大家可以按照上一个教程中空战游戏的思路,先按照我们的提示,逐步地实现,如果有困难,再参考我们分步骤的代码,这样的锻炼效果最好. 备注:# ...

最新文章

  1. Goods:图书模块按分类查询各层实现
  2. ACM入门之【ST表/RMQ】
  3. [SDOI2008]SUE的小球
  4. python应用领域介绍
  5. arch linux系统安装教程,Arch Linux系统的安装(BIOS)教程,archlinux
  6. STM32Cube_FW_F1_V1.0.0固件库学习(四)外部中断 中
  7. 吴恩达机器学习(六)神经网络(前向传播)
  8. 第 11 章 装饰者设计模式
  9. 扑克牌自定义排序,使用集合TreeSet实现实体对象排序,通过实现Comparable接口,重写compareTo比较器;
  10. php常用标签,PHP 过滤常用标签的正则表达式
  11. linux下copy命令c实现,C语言自己实现linux下cp文件复制命令
  12. 剑指offer题目系列二
  13. [unity]网游中实现资源动态加载
  14. [转]信息安全相关理论题(四)
  15. Java里的数组冒泡排序代码
  16. OGG故障集锦(一)
  17. Android调用系统应用打开各种类型文件
  18. 单元格的边框没有被显示出来
  19. 【檀越剑指大厂--ElasticSearch】ElasticSearch进阶
  20. 批量挖掘SRC思路与实践一

热门文章

  1. qt 设置按钮大小_Python GUI教程(六):使用Qt设计师进行窗口布局
  2. 2021年安全员-C证最新解析及安全员-C证考试试题
  3. 【Python算法】数值分析—牛顿迭代法
  4. 求1000以内的所有素数(质数)
  5. batch - 黑魂3存档备份程序
  6. 输入字符串,找出其中大写字母、小写字母、空格、数字、以及其他字符各有多少。
  7. kettle实战之调用接口
  8. 【Vue3】Vue的事件类型
  9. java dijkstra算法 指定源宿_一种路径计算的方法和装置与流程
  10. 操作元素实例-时间戳 :根据不同时间显示不同图片极其文字