0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享一个有趣的鸿蒙分布式小游戏

OpenHarmony技术社区 来源:鸿蒙技术社区 作者:维京战斧 2021-11-01 14:29 次阅读

今天给大家分享一个有趣的鸿蒙分布式小游戏:你画我猜。

开发心得(如有错误还请大佬及时指正):

  • 分布式流转:一个 APP 应用在设备之间互相拉起迁移,只在一个终端上运行。

  • 分布式协同:一个 APP 同时在多个设备上运行,画面实时共享,数据实时传输。

在工程创立之后,首先有个很重要的事情那就是验权。

①这个分布式协同会用到一个权限接口,去 MainAbilitySlice 里面申请

分布式数据管理 ohos.permission.DISTRIBUTED_DATASYNC 允许不同设备间的数据交换。
voidgrantPermission(){//获取验证权限数据交互允许不同设备间的数据交换。
if(verifySelfPermission(DISTRIBUTED_DATASYNC)!=IBundleManager.PERMISSION_GRANTED){
if(canRequestPermission(DISTRIBUTED_DATASYNC)){
requestPermissionsFromUser(newString[]{DISTRIBUTED_DATASYNC},PERMISSION_CODE);
}
}
}

权限接口文档链接

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-available-0000001051089272

②权限申请

开发者需要在 config.json 文件中的“reqPermissions”字段中声明所需要的权限。

{
"module":{
"reqPermissions":[
{
"name":"ohos.permission.CAMERA",
"reason":"$string:permreason_camera",
"usedScene":
{
"ability":["com.mycamera.Ability","com.mycamera.AbilityBackground"],
"when":"always"
}
},{
...
}
]
}
}
}

351c9594-3ac5-11ec-82a9-dac502259ad0.png
{
"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"//允许获取分布式组网内设备的状态变化。
},
{
"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"//允许获取分布式组网内的设备列表和设备信息
},
{
"name":"ohos.permission.GRT_BUNDLE_INFO"//查询其他应用的信息。
},
{
"name":"ohos.permission.INTERNET"//允许使用网络socket。
}

应用权限列表文档链接:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-guidelines-0000000000029886

再看页面结构:

在 resources 下面的:
  • graphic:页面样式效果调配

  • layoput:此 demo 的 java UI 页面布局结构

主页面入口布局代码 ability_main:



<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical"
ohos:background_element="$graphic:background_button">

<Text
ohos:height="match_content"
ohos:width="match_content"
ohos:top_margin="150px"
ohos:layout_alignment="horizontal_center"
ohos:text="你好鸿蒙_你画我猜"
ohos:text_size="38fp"
/>

<Image
ohos:id="$+id:imageComponent"
ohos:height="200vp"
ohos:width="1080"
ohos:top_margin="150px"
ohos:image_src="$media:HM"
/>

<Button
ohos:id="$+id:help_btn"
ohos:height="100vp"
ohos:width="300vp"
ohos:background_element="$graphic:background_button"
ohos:layout_alignment="horizontal_center"
ohos:left_padding="15vp"
ohos:right_padding="15vp"
ohos:text="进入游戏"
ohos:text_size="30vp"
ohos:top_margin="20vp">
Button>


DirectionalLayout>

游戏匹配页面布局 math_game:



<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">

<Button
ohos:id="$+id:help_btn"
ohos:height="match_content"
ohos:width="500px"
ohos:background_element="$graphic:background_begin"
ohos:layout_alignment="horizontal_center"
ohos:left_padding="15vp"
ohos:right_padding="15vp"
ohos:text="匹配对手"
ohos:text_size="30vp"
ohos:top_margin="200vp">
Button>
<Image
ohos:id="$+id:imageComponent"
ohos:height="200vp"
ohos:width="1080"
ohos:top_margin="100px"
ohos:image_src="$media:NHWC"

/>

DirectionalLayout>

MainAbilitySlice:

packagecom.huawei.codelab.slice;

importstaticohos.security.SystemPermission.DISTRIBUTED_DATASYNC;

importcom.huawei.codelab.ResourceTable;
importcom.huawei.codelab.utils.CommonData;
importcom.huawei.codelab.utils.LogUtil;
importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.content.Intent;
importohos.aafwk.content.Operation;
importohos.agp.components.Component;
importohos.bundle.IBundleManager;



publicclassMainAbilitySliceextendsAbilitySlice{
privatestaticfinalStringTAG=CommonData.TAG+MainAbilitySlice.class.getSimpleName();

privatestaticfinalintPERMISSION_CODE=10000000;

@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
grantPermission();
initView();
}

voidgrantPermission(){//获取验证权限数据交互允许不同设备间的数据交换。
if(verifySelfPermission(DISTRIBUTED_DATASYNC)!=IBundleManager.PERMISSION_GRANTED){
if(canRequestPermission(DISTRIBUTED_DATASYNC)){
requestPermissionsFromUser(newString[]{DISTRIBUTED_DATASYNC},PERMISSION_CODE);
}
}
}
//
privatevoidinitView(){
findComponentById(ResourceTable.Id_help_btn).setClickedListener(newButtonClick());

}

privatevoidmathGame(){//数学游戏
LogUtil.info(TAG,"ClickResourceTableId_math_game");
IntentmathGameIntent=newIntent();
OperationoperationMath=newIntent.OperationBuilder().withBundleName(getBundleName())
.withAbilityName(CommonData.ABILITY_MAIN)
.withAction(CommonData.MATH_PAGE)
.build();
mathGameIntent.setOperation(operationMath);
startAbility(mathGameIntent);
}

//进入游戏
privateclassButtonClickimplementsComponent.ClickedListener{
@Override
publicvoidonClick(Componentcomponent){
mathGame();
}
}

}

MathGameAbilitySlice:

packagecom.huawei.codelab.slice;
importcom.huawei.codelab.ResourceTable;
importcom.huawei.codelab.devices.SelectDeviceDialog;
importcom.huawei.codelab.utils.CommonData;
importcom.huawei.codelab.utils.LogUtil;
importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.content.Intent;
importohos.aafwk.content.Operation;
importohos.agp.components.Button;
importohos.agp.components.Component;
importohos.data.distributed.common.KvManagerConfig;
importohos.data.distributed.common.KvManagerFactory;
importohos.distributedschedule.interwork.DeviceInfo;
importohos.distributedschedule.interwork.DeviceManager;
importjava.util.ArrayList;
importjava.util.List;


publicclassMathGameAbilitySliceextendsAbilitySlice{
privatestaticfinalStringTAG=CommonData.TAG+MathGameAbilitySlice.class.getSimpleName();

privateButtonhelpBtn;

privateListdevices=newArrayList<>();

@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_math_game);
initView();

}

privatevoidinitView(){

if(findComponentById(ResourceTable.Id_help_btn)instanceofButton){
helpBtn=(Button)findComponentById(ResourceTable.Id_help_btn);
}
helpBtn.setClickedListener(newButtonClick());
}


privatevoidgetDevices(){
if(devices.size()>0){
devices.clear();
}
ListdeviceInfos=
DeviceManager.getDeviceList(ohos.distributedschedule.interwork.DeviceInfo.FLAG_GET_ONLINE_DEVICE);
LogUtil.info(TAG,"MathGameAbilitySlicedeviceInfossizeis:"+deviceInfos.size());
devices.addAll(deviceInfos);
showDevicesDialog();
}

privatevoidshowDevicesDialog(){
newSelectDeviceDialog(this,devices,deviceInfo->{
startLocalFa(deviceInfo.getDeviceId());
startRemoteFa(deviceInfo.getDeviceId());
}).show();
}

privatevoidstartLocalFa(StringdeviceId){
LogUtil.info(TAG,"startLocalFa......");
Intentintent=newIntent();
intent.setParam(CommonData.KEY_REMOTE_DEVICEID,deviceId);
intent.setParam(CommonData.KEY_IS_LOCAL,true);
Operationoperation=newIntent.OperationBuilder().withBundleName(getBundleName())
.withAbilityName(CommonData.ABILITY_MAIN)
.withAction(CommonData.DRAW_PAGE)
.build();
intent.setOperation(operation);
startAbility(intent);
}

privatevoidstartRemoteFa(StringdeviceId){
LogUtil.info(TAG,"startRemoteFa......");
StringlocalDeviceId=
KvManagerFactory.getInstance().createKvManager(newKvManagerConfig(this)).getLocalDeviceInfo().getId();
Intentintent=newIntent();
intent.setParam(CommonData.KEY_REMOTE_DEVICEID,localDeviceId);
intent.setParam(CommonData.KEY_IS_LOCAL,false);
Operationoperation=newIntent.OperationBuilder().withDeviceId(deviceId)
.withBundleName(getBundleName())
.withAbilityName(CommonData.ABILITY_MAIN)
.withAction(CommonData.DRAW_PAGE)
.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
.build();
intent.setOperation(operation);
startAbility(intent);
}

privateclassButtonClickimplementsComponent.ClickedListener{
@Override
publicvoidonClick(Componentcomponent){
getDevices();//启动机器匹配
}
}
}

责任编辑:haq


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2634

    浏览量

    66138
  • HarmonyOS
    +关注

    关注

    79

    文章

    1966

    浏览量

    29955

原文标题:鸿蒙版你画我猜,请接招!

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙ArkTS声明开发:跨平台支持列表【分布式迁移标识】 通用属性

    组件的分布式迁移标识,指明了该组件在分布式迁移场景下可以将特定状态恢复到对端设备。
    的头像 发表于 06-07 21:15 330次阅读

    鸿蒙开发接口数据管理:【@ohos.data.distributedData (分布式数据管理)】

    分布式数据管理为应用程序提供不同设备间数据库的分布式协同能力。通过调用分布式数据各个接口,应用程序可将数据保存到分布式数据库中,并可对分布式
    的头像 发表于 06-07 09:30 859次阅读
    <b class='flag-5'>鸿蒙</b>开发接口数据管理:【@ohos.data.distributedData (<b class='flag-5'>分布式</b>数据管理)】

    鸿蒙HarmonyOS开发实战:【分布式音乐播放】

    本示例使用fileIo获取指定音频文件,并通过AudioPlayer完成了音乐的播放完成了基本的音乐播放、暂停、上曲、下曲功能;并使用DeviceManager完成了分布式设备列表的显示和
    的头像 发表于 04-10 17:51 795次阅读
    <b class='flag-5'>鸿蒙</b>HarmonyOS开发实战:【<b class='flag-5'>分布式</b>音乐播放】

    鸿蒙OS 分布式任务调度

    鸿蒙OS 分布式任务调度概述 在 HarmonyO S中,分布式任务调度平台对搭载 HarmonyOS 的多设备构筑的“超级虚拟终端”提供统的组件管理能力,为应用定义统
    的头像 发表于 01-29 16:50 436次阅读

    什么是分布式架构?

    分布式架构是指将系统或应用拆分成多个独立的节点,这些节点通过网络连接进行通信和协作,以实现共同完成任务的种架构模式。这种架构模式旨在提高系统的可扩展性、可靠性和性能表现。
    的头像 发表于 01-12 15:04 1122次阅读
    什么是<b class='flag-5'>分布式</b>架构?

    鸿蒙千帆起】《开心消消乐》完成鸿蒙原生应用开发,创新多端联动用户体验

    加强游戏与玩家之间交互的提醒,用户不需要频繁打开游戏就能接收到游戏中的关键信息,比如精力恢复、新关卡开放、活动信息提醒等,给玩家提供了更加便捷的游戏体验。 同时,HarmonyOS 特
    发表于 01-03 10:22

    鸿蒙千帆起】桌游卡牌游戏品类首发!《三国杀》完成鸿蒙原生应用开发

    中心的深度合作已逾10年,在今年HDC上更荣获了“鸿蒙生态先锋游戏”等重要奖项。依托鸿蒙分布式技术,《三国杀》系列游戏将为用户带来更流畅、更
    的头像 发表于 12-21 21:15 710次阅读
    【<b class='flag-5'>鸿蒙</b>千帆起】桌游卡牌<b class='flag-5'>游戏</b>品类首发!《三国杀》完成<b class='flag-5'>鸿蒙</b>原生应用开发

    网易游戏与华为就鸿蒙生态达成合作

    网易游戏与华为就鸿蒙生态达成合作 基于鸿蒙分布式技术、原生智能等方面能力,鸿蒙生态发展越发迅速。 12月15日网易
    的头像 发表于 12-15 18:24 788次阅读

    鸿蒙原生应用开发——分布式数据对象

    01、什么是分布式数据对象 在可信组网环境下,多个相互组网认证的设备将各自创建的对象加入同一个 sessionId,使得加入的多个数据对象之间可以同步数据,也就是说,当某数据对象属性发生
    发表于 12-08 10:01

    分布式系统硬件资源池原理和接入实践

    无中心对称的分布式硬件外设管理系统。同时,分布式硬件框架定义了外设热插拔,虚拟硬件保活等机制,保证业务可靠性。在运行时,各个硬件外设的业务运行于独立进程中,在进程层面保证不同硬件的
    发表于 12-06 10:02

    如何实现Redis分布式

    Redis是开源的内存数据存储系统,可用于高速读写操作。在分布式系统中,为了保证数据的致性和避免竞态条件,常常需要使用分布式锁来对共享
    的头像 发表于 12-04 11:24 632次阅读

    redis分布式锁三方法

    Redis是种高性能的分布式缓存和键值存储系统,它提供了种可靠的分布式锁解决方案。在分布式系统中,由于多个节点之间的并发访问,需要使用
    的头像 发表于 12-04 11:22 1374次阅读

    zookeeper分布式原理

    Zookeeper是开源的分布式协调服务,可以用于构建高可用、高性能的分布式系统。它提供了
    的头像 发表于 12-03 16:33 598次阅读

    分布式通信是什么 分布式网络搭建

    智能机器人的功能繁多,全都放在计算机里,经常会遇到计算能力不够、处理出现卡顿等情况,如果可以将这些任务拆解,分配到多个计算机中运行岂不是可以减轻压力? 这就是分布式系统,可以实现多计算平台
    的头像 发表于 11-27 15:49 719次阅读
    <b class='flag-5'>分布式</b>通信是什么 <b class='flag-5'>分布式</b>网络搭建

    springclould分布式教程

    Spring Cloud是基于Spring Boot的分布式系统开发工具,它提供了系列的分布式系统解决方案,可以帮助开发者快速构建和部
    的头像 发表于 11-16 10:59 450次阅读