当前位置: 首页 > 科技观察

鸿蒙用OLED面板实现FlappyBird小游戏(下)

时间:2023-03-21 11:43:32 科技观察

更多内容请访问:鸿蒙与华为官方共建的技术社区https://harmonyos.51cto.com/#zz相信这次在最后oftheyear大家和我一样很忙,最近有点空闲,赶紧更新我们的FlappyBird吧。上次讲到加入联机对战功能,觉得这鸟不适合改成对战类,不过没关系,这不妨碍我们研究开发板联网的方法。所以这篇文章主要介绍一下我是如何让开发板连接wifi并打开socket服务器,然后开发一个基于HarmonyOS的手机遥控器,也可以说是一个虚拟控制器的雏形。说起来,这就是鸿蒙OS手机和鸿蒙Hi3861开发板之间的故事了。我们HarmonyHi3861Wifi物联网开发板本来就是为Wifi智能家居量身定做的,所以一定少不了Wifi的支持。看了各种官方文档和代码,又看了连志安老师的几篇文章(链接),终于有眉毛了。一般来说,wifi相关的接口都在“\vendor\hisi\hi3861\hi3861\third_party\lwip_sack\include\lwip\netifapi.h”头文件中,仔细阅读代码中的注释会有帮助。这次我没有包含手机网络分发功能,因为我觉得每次运行手机都要操作起来很麻烦。我使用直连STA方式连接指定AP。以后可以改进为一触即通的组网方式。跟进研究。话不多说,上图:这是整体架构图,路由器充当AP,手机和开发板分别连接同一个Wifi。这是开发板上启动服务器的流程图:启动socket服务器后,接受客户端的连接请求,然后循环接收数据,根据指令执行动作。另外需要注意的是,网络相关的操作函数是在单独的线程中执行的,即在后台连接网络,避免阻塞程序的主线程。这里socket服务器监听端口设置为8888。很快发现不知道开发板的IP地址。虽然在路由器管理页面可以查看所有设备IP,但总觉得不方便。得到处找路由器管理员。所以我添加了一键显示IP地址的功能。具体调用netifapi_netif_get_addr函数(netifapi.h),函数声明如下:建议使用net(此APIin)@param[in]netif表示网络接口获取。*@param[in]ipaddr表示IP地址。*@param[in]netmask表示网络掩码。*@param[in]gw表示默认网关IP地址。**@returns*0:Onsuccess\n*负值:Onfailure\n**@parRelatedTopics*netif_get_addr()**@note*-netmaskand/orgw可以传递NULL,如果不需要这些关于netif的详细信息*/err_tnetifapi_netif_get_addr(structnetif*netif,ip4_addr_t*ipaddr,ip4_addr_t*netmask,ip4_addr_t*gw);之前用到的第一个连接参数netif,netif结构体指针,其他三个是用来返回的ip地址,子网掩码,网关。那么如何将返回的ip4_addr_t结构体转换成数字和句点组成的通用字符串格式(如192.168.1.1)呢?答案是ip4addr_ntoa函数。char*ip=ip4addr_ntoa(ipAddr);printf("ip:%s\n",ip);free(ip)//用完记得释放。其实就是在\vendor\hisi\hi3861\hi3861\third_party\lwip_sack\include\lwip\ip4_addr.h头文件中定义了一系列转换函数。它们的定义如下,我们可以根据需要使用:char*ip4addr_ntoa_r(constip4_addr_t*addr,char*buf,intbuflen);intinet_pton4(constchar*src,unsignedchar*dst);constchar*lwip_inet_ntop4(constunsignedchar*src,char*dst,u32_tsize);手机控制器方面,我在DevEcoStudio做了一个基于鸿蒙OS的App版本,主要实现了Tcp方法连接指定IP发送命令。但是因为没有真机,没法调试,所以只能再做一个Android版本的App,不调试。可惜了,希望能借此机会拿到P40,完成这个梦想,见识一下鸿蒙OS的美好。这是DevEcoStudio中工程的截图:模拟器运行时是这样的:模拟器无法联网,无奈。不过,这并不妨碍制作安卓版本进行测试。核心代码如下:publicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//添加按钮事件回调this.findViewById(R.id.btn_go).setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){newThread(newRunnable(){@Overridepublicvoidrun(){EditTexteditIp=findViewById(R.id.edit_ip);//接口添加了一个IP地址输入框Stringip=editIp.getText().toString();sendCmd(ip);//发送指令到指定IP}}).start();}});}privateSocketsocket;privatevoidsendCmd(StringipAddr){intport=8888;//开发板socket服务器监听端口号8888try{if(socket==null){socket=newSocket(ipAddr,port);//创建socket客户端Log.i("JoyStick","Createsocket!!");}StringcmdData="A";//发送一个Abytedata[]=cmdData.getBytes();socket.getOutputStream().write(data);Log.i("JoyStick","Sendsuccess!!");showMessage("Sendsuccess!",Toast.LENGTH_SHORT);}catch(Exceptione){e.printStackTrace();Log.e("JoyStick",e.toString());showMessage("SendError!\n"+e.toString(),Toast.LENGTH_SHORT);}}}APP在我的mate20上了运行界面如下:这里只发送了一条命令“A”,因为FlappyBird只用了一个控制按钮。如果考虑通用性,可以制定一套协议来实现手柄所有按钮的命令发送。比如:左L,右R,上U,下D,按A/B/P/Q等,待后期完善。好了,编译,烧板,运行。实际操作中,感觉还是不错的。上图:这是按S2显示IP的演示:这是手机控制的演示:这是演示视频:https://harmonyos.51cto.com/show/2767提供代码:https://gitee.com/pleiades/harmonyos_flappy_bird感谢大家的支持~我打算加入一些套件中没有的外设,比如GPS模块、摄像头、蓝牙等,应该可以碰撞出更多创意的火花.你怎么认为?关于什么??版权归作者和HarmonyOS技术社区共同所有。如需转载请注明出处,否则追究责任。更多信息请访问:与华为共建鸿蒙OS技术社区https://harmonyos.51cto.com/#zz