【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(中)
小伙伴们久等了,在上一篇《【开发板试用报告】用OLED板实现FlappyBird小游戏(上)》中,我们本着拿来主义的原则,成功的让小鸟在OLED屏幕上自由飞翔起来,下面我们将加入按钮交互功能。
这里感谢唐佐林老师的无私分享,利用他开发的按钮组件,开箱即用,节省了大量的开发时间(链接)。首先将按钮组件的初始化函数InitButton搬到我们的主程序中,再写一个按钮事件回调函数Button_Callback,里面加入对逻辑的判断和处理即可。
//按钮事件回调函数 static void Button_Callback(const char* sender, BtnEvent event) { printf("[Button] Button_Callback() : %s -> %d\n", sender, event); if( event == Pressed ) { /* Pressed == 1 按下事件处理代码 */ if(isStarted == 0) { BirdStart(); }else{ BirdFlap(); } } } //按钮组件初始化 int InitButton(void) { printf("InitButton\n"); int ret = 0; ret += DTButton_Init(); // 初始化按键事件处理上下文 /* 设置GPIO_8按键的回调函数,同时需要响应按下,释放以及长按三个事件 */ /* 按键触发顺序: Pressed -> LongPressed(optional) -> Released */ ret += DTButton_Enable("GPIO_8", Button_Callback, Pressed | LongPressed | Released); /* 设置S1按键的回调函数 */ ret += DTButton_Enable("S1", Button_Callback, Pressed); printf("InitButton: %d\n", ret); return ret; }
其中isStart是一个全局变量,定义在Bird.h中,作为游戏是否开始的标志。
由于加入了游戏标题界面,在按钮按下时,这里有两种情况,如果是在游戏标题界面中,则开始游戏,即调用BirdInit和BirdStart函数;如果已经在游戏中,则调用小鸟扑腾函数BirdFlap。而BirdFlap就做一件事情,把小鸟的垂直方向速度置为固定值。这个值我经过多次调优,最终固定在-3.5。
看这张图能更容易理解坐标系和物体的运动:
其他的改进,包括右上角增加了一个分数指示器,具体就是用飞过的距离除以10得到。
相较第一篇,游戏流程基本没有变化,增加的是按钮的控制,由于使用了回调函数,即异步处理,代码阅读起来更友好也更简洁。
下面是效果图:
本来打算到此结束,后来一想其实还能做更多功能,比如联网对战?也欢迎大家留言告诉你的想法。
代码奉上。
作者:老船夫
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C++语言中std::array的神奇用法总结,你需要知道!
摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发。 td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能。也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素是直接存放在实例内部,而不是在堆上分配空间;std::array的大小必须在编译期确定;std::array的构造函数、析构函数和赋值操作符都是编译器隐式声明的……这让很多用惯了std::vector这类容器的程序员不习惯,觉得std::array不好用。 但实际上,std::array的威力很可能被低估了。在这篇文章里,我会从各个角度介绍下std::array的用法,希望能带来一些启发。 本文的代码都在C++17环境下编译运行。当前主流的g++版本已经能支持C++17标准,但是很多版本(如gcc 7.3)的C++17特性不是默认打开的,需要手工添加编译选项-std=c++17。 自动推导数组大小 很多项目中都会有类似这样的全局数组作为配置参数: uint32_t g_cfgPara[] = {1, 2...
- 下一篇
学会这几招,轻松搞定领导最爱看的动态数据报表
不知不觉2020就剩最后一个月,接下来的12月相信都是大家最忙的时候,各种年度总结、汇报、答辩述职,这其中更加少不了各种数据统计,分析工作。 不论在哪个公司,一到月底、季末、年底,财务、人事、销售等等业务部都要写各种各样的数据报表,但是领导拿到手却很少仔细看,自己辛苦加班好几天的成果也换不来领导的一句夸奖。 为什么领导不看? 首要原因就是报表太丑,很多人做出来的报表都是简单的数据表格,比如下面这样的,密密麻麻的数据,最后一列汇总计算一下,让调3个地区的销售分析表,交上来就是3张样式一样,数据更换了的表格 而报表最根本的目的是要传达数据信息,而不是单纯展示数据,报表是给人看的,所以好的报表绝对不是枯燥的表格堆叠,而应该是简洁、美观、准确、讲人话的,也就是说报表也讲究“颜值”,而让报表动起来则是提高报表颜值最省力的方法,也是我们说的动态报表 动态报表的作用不光是提升报表颜值,同样也让报表展示的信息更加丰富,同时也省去了很多的重复制表工作。比如上面这样报表,通过报表之间的联动和钻取,以及筛选条件,在一张报表中呈现更多的数据信息,让领导快速了解到数据展现的业务信息。 如何实现动态报表 最...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)