更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zzzi曾经说过有元神,一切皆有可能。世界上之所以战争和冲突不断激化,是因为分歧无法公正判断。我们小时候都玩过锤子、布、剪刀的游戏。事实上,这是解决分歧最原始、最有效的方式。但是为什么我们长大后不用呢?这个方法怎么样?因为它有两个缺点。一是出手的速度,二是手型的临时变化。终端的出现一举解决了这个问题。那么,问题来了,这么好的跨代产品,为什么没有得到。晋升呢?因为它有两个缺点:一是不方便携带,二是……贵(划掉)……鸿蒙分布式分支终端的问世,不开源不开源,一下子解决了这个问题一举成名。那么,构建这样一个鸿蒙分布式分支终端的**原型**需要多长时间呢?10分钟?不,可能……一个周末。具体来说,需要三个步骤:第一步,在家哄宝宝。第二步是打开计算机并编写错误(划掉)代码。第三步是调试。第一步总是最难的。处理完第一步,后面两步就简单了。下面详细分析一下鸿蒙分布式分支终端原型的设计原理。#鸿蒙分布式分支终端原型设计##一、需求分析1).您可以**输入**您自己的决定2)。中立的第三方将做出**判断**3)。可以**查看**TheFinalJudgment**Result**##二、模块划分。根据需求,采用鸿蒙的分布式设计思想,我们将发散终端分为两个核心模块:1)。发散终端的交互模块,简称FA,用于输入决策和查看结果2)。发散端计算模块,简称PA,作为中立的第三方,做出最终决定##再次,流程。假设A和B两个人存在分歧,需要解决分歧,一个典型的分歧解决流程可以如下:1).A启动分流终端的交互模块(FA-A)。2).B启动发散终端。交互模块(FA-B)3)。A和B都连接到同一个分支终端计算模块,假设为计算模块A(PA-A)4)。A和B在各自分支终端的交互模块上输入他和她的决定(INPUT-A,INPUT-B)5)。发散端计算模块根据A和B的输入自动计算结果:RESULT6)。A和B在各自的分歧终端进行交互在线查看结果RESULT,如果B对结果不满意,她可以再做一次裁决,直到她满意为止。##同样,详细设计。###1.不同的终端交互模块(FA)交互模块需要为用户提供输入界面和显示界面,所以使用了鸿蒙的FA,也就是FeatureAbility。FA也叫PageAbility,一个Page可以有多个AbilitySlices(能力切片),也就是子页面:根据决策过程的不同阶段,我们用AbilitySlice设计了3个子页面,分别是:*1)。初始准备页面HomeSlice用于连接分支终端的计算模块(PA)。在这里,我们需要使用a)HarmonyDistributedSoftbus。设备自动发现能力对于同一个网络下的Harmony设备,如果满足条件可以自动发现对方,无需调用网络接口(udp/tcp等),不需要针对不同的网络情况做不同的实现(wifi/蓝牙/nfc等)。b).设备直连能力通过connectAbility接口,可以直接连接到需要连接的计算模块,而无需了解其所在设备的实际网络情况。*2).等待页面,WaitingSlice,首先加入争议解决的人需要在此页面等待其他人加入。当发现所有人都加入后,会自动进入下一个页面,即“差异决定页面”。*3).决策页面,GameSlice,争议解决相关人员在此页面输入自己的决策,查看最终裁决结果。本模块的技术要点:1)。子页面之间的切换:使用本方法2)。决策结果刷新:可以使用定时器轮询结果并刷新。注意在定时器刷新UI时,相关代码需要在UI线程上运行,可以使用EventRunner,参考代码:publicvoidrunInMainThread(Runnabletask){EventRunnerrunner=EventRunner.getMainEventRunner();EventHandlerhandler=newEventHandler(runner);handler.postTask(task);}privatevoidstartGameLoop(){if(gameTimer==null){gameTimer=newIntervalTimer(1000,1000){@OverridepublicvoidonInterval(longl){runInMainThread(newRunnable(){@Overridepublicvoidrun(){onLoop(l);}});}@OverridepublicvoidonFinish(){gameTimer.schedule();}};gameTimer.schedule();}}privatevoidstopGameLoop(){if(gameTimer!=null){gameTimer.cancel();gameTimer=null;}}参考文档1).页面能力开发指南https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-concept-00000000000335732)。JAVAUI框架开发指南https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-overview-0000000000500404###2.分支终端核心计算模块(PA)的核心任务计算模块是处理数据而不是显示,所以使用的是鸿蒙的PA,也就是ParticleAbility。计算模块需要实现的功能有:a)。从交互模块b)收集决策输入。根据各自的决定做出最终决定。决策过程基本就是一个判断a>b的过程,就不细说了。技术要点1).连接到PA时,使用connectAbility2)。多线程数据同步可能存在问题3).跨设备操作需要在项目模块的config.json中的代码中手动申请必要的权限:"reqPermissions":[{"name":"ohos.permission.DISTRIBUTED_DATASYNC"},{"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"},{"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"},{"name":"ohos.permission.GET_BUNDLE_INFO"},{"name":"ohos.permission.servicebus.ACCESS_SERVICE"},{"name":"ohos.permission.servicebus.DISTRIBUTED_DEVICE_STATE_CHANGE"},{"name":"ohos.permission.servicebus.GET_BUNDLE_INFO"}],MainAbility启动时申请权限:publicclassMainAbilityextendsAbility{privatestaticfinalStringTAG=MainAbility.class.getSimpleName();@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(HomeSlice.class.getName());GameClient.getInstance().init();requestPermissionsFromUser(newString[]{“ohos.permission.DISTRIBUTED_DATASYNC","ohos.permission.GET_DISTRIBUTED_DEVICE_INFO","ohos.permission.servicebus.ACCESS_SERVICE"},0);}}参考文档1).服务能力开发指南https://developer.harmonyos.com/en/docs/documentation/doc-guides/ability-service-concept-00000000000444572).分布式任务调度https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-distributed-overview-0000001050419345###3、由于交互模块和计算模块之间的数据通信是两个模块之间的交互,所以必然涉及到数据通信,除了调用相关的通信接口外,还有一个很重要的一点就是对数据进行打包和解包。整个通信过程是通过鸿蒙分布式软总线完成的,当然我们可以使用软总线提供的接口来实现通信过程,定义数据结构,以及打包解包的方法。但是,所以没有办法在10分钟内完成。幸运的是,鸿蒙提供了一个非常方便的工具IDL(HongmengInterfaceDefinitionLanguage)来帮助我们完成这个光头工作。>IDL官方文档>https://developer.harmonyos.com/cn/docs/documentation/doc-references/idl-overview-0000001050762835使用IDL工具,只需3步即可实现数据通信功能:1).在IDL文件中定义接口、方法、方法的输入输出参数2).使用DevEcoStudio工具将IDL文件转换为代码3)。实现具体的业务逻辑定义好接口后,我们就可以像调用本地方法一样调用远程方法了。IDL代码示例://IGameServiceInterface.idl//Declareanynon-defaulttypesherewithsequenceableorinterfacestatements//声明一个可序列化的结构体,具体定义是Java写的,详见IDL文档sequenceablecom.blackshadowgame.rps.GameResultData;interfacecom.blackshadowgame.rps。IGameServiceInterface{intecho([in]inta);//加入游戏intjoinGame([in]StringplayerId);//与AI战斗intplayWithAI([in]intpid);//获取当前游戏的对手列表int[]getPlayers([in]intpid);//打卡intsendInput([in]intpid,[in]ininputCode);//查询结果GameResultDataqueryGameResult([in]intpid);//离开游戏intleaveGame([in]intpid);intnextGame([in]intpid);}###4.组装测试既然所有模块都准备好了,组装FA/PA/IDL,进行联合...调试...测试...。尝试...如果你够幸运,10分钟就能调试完。如果运气不好,经过无数次的测试和修改,终于可以调试出一个没有明显bug的版本来体验了。至此,一个鸿蒙分布式分支终端的原型就完成了!###6、关于界面美化,你说界面需要美化吗?##Pro版鸿蒙分布式分支终端也可以升级到Pro版,增加更多“专业”功能。利用鸿蒙的分布式能力,这些都可以轻松实现,例如:1)。AI讨论:给无聊的人讨论2)。围观者:供吃瓜群众观看差异化决策过程3)。多人讨论:2人以上上面4)的玩法。Invite/Force:邀请他人参与游戏5).任意设备:除了手机,还支持其他设备作为游戏的输入,比如手表等。6).在自己的设备上输入,然后在大屏上显示结果##开源代码本项目的代码已经上传到gitee,供大家参考。>https://gitee.com/devonzhang/rock-paper-scissors##References完成本项目所需的技能点可以在鸿蒙OS开发者官网找到。1).鸿蒙操作系统应用开发指南https://developer.harmonyos.com/cn/docs/documentation/doc-guides/document-outline-00000010645891842)。能力开发指南https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-ability-overview-00000000000298523)。页面能力开发指南https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-concept-00000000000335734)。服务能力开发指南https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-service-concept-00000000000444575)。分布式任务调度https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-distributed-overview-00000010504193456)。JAVAUI框架开发指南https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-overview-00000000005004047)。HarmonyOSIDL接口使用规范https://developer.harmonyos.com/cn/docs/documentation/doc-references/idl-overview-0000001050762835##最后,本项目代码仅供学习,请勿使用直接在生产环境中使用,如有BUG概不负责~#最后,既然大家看到了,我是全栈游戏开发者阿斌,欢迎1.订阅我的鸿蒙学习专栏:《跟阿斌一起学鸿蒙》https://harmonyos.51cto.com/专栏/252。关注我的个人资料公众号:正直IT男阿斌3.查看我的技术博客:https://xmanyou.com/?版权归作者及HarmonyOS技术社区所有,如需转载请注明出处,否则你将被追究法律责任。更多信息请访问:与华为联合成立的Harmonyos技术社区https://harmonyos.51cto.com/#zz
