世界上有一种鸟是没有脚的,它只能不停的飞呀飞。累了,就睡在风里。它一生只能落地一次,就是它死的时候……——对Flappybird的说法
Flappybird游戏,相信从事互联网都知道,毫无征兆地突然之间一夜火起来,然后迅速的被抄袭改编……近期自己使用C语言在linux终端下模仿制作Flappybird(真正像素级:D),记录一下整个实现过程的思路,代码附在文末。
Flappybird最重要的
对于像Templerun与Flappybird这类游戏,最大的特点是:游戏的场景与障碍似乎是无尽的,只要你不损失掉生命就可以一直玩下去获得更高的积分。这里的实现方式是准备两块“屏幕”做切换。开始使用主屏,然后对主屏内容进行偏移,完全偏移至辅屏后再对主频重新初始化,这样循环下去。参考图示:
终端相关
涉及到二个问题:光标控制,输入控制。光标控制,首先是隐藏光标,linux终端默认情况下会在输出末端显示光标表示当前输出的位置;其次是光标的移动,Flappybird是在固定的行列进行游戏的,我们得控制光标达到重复利用行列的目的。
这里有一篇参考博文,其核心思想是利用printf(“\033[xxx”),来解决光标控制的二个问题。
输入控制,需要做的是:一、输入不回显;二、输入非阻塞。这两点都是比较好解决的。利用linux的struct termios term与设置STDIN_FILENO属性O_NONBLOCK可以完美解决。适配与本游戏的设置代码:
static struct termios oterm; int set_term_mode(int fd) { struct termios term; if (tcgetattr(fd, &term) == -1 || tcgetattr(fd, &oterm) == -1) { printf("Cannot get the attribution of the terminal"); return -1; } term.c_lflag &= ~(ECHO | ICANON); if (tcsetattr(fd, TCSAFLUSH, &term) == -1) { printf("Cannot set the attribution of the terminal"); return -1; } /* set stdin nonblock */ int flag = fcntl(STDIN_FILENO, F_GETFL); flag |= O_NONBLOCK; if (fcntl(STDIN_FILENO, F_SETFL, flag) == -1) { printf("Cannot set the O_NONBLOCK of the STDIN_FILENO"); return -1; } return 0; } int resume_term_mode(int fd) { if (tcsetattr(fd, TCSAFLUSH, &oterm) == -1) { printf("Cannot resume the attribution of the terminal"); return -1; } return 0; }
Bird相关
原则是不移动x轴(横轴),只移动y轴(纵轴),在终端上只用一个字符显示,这样的话我们每次跳跃与下落只需计算y轴的偏移坐标。检测碰撞有三处:上边界、下边界、障碍物,也可以考虑重力相关(本文未考虑)。
最后附上代码 – 请点击这里
(全文结束)
转载文章请注明出处:漫漫路 - lanindex.com