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

    文章

    2642

    浏览量

    70218
  • HarmonyOS
    +关注

    关注

    80

    文章

    2157

    浏览量

    36374

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    AI Ceph 分布式存储教程资料大模型学习资料2026

    开销与延迟。 三、 弹性扩展与数据致性:面向未来的存储底座 大模型的训练是动态伸缩的过程,可能从几十张卡扩展到几千张卡。AI 分布式存储必须具备无感知的弹性扩展能力。通过采用纠
    发表于 05-01 17:35

    分布式迭代求解策略:分布式混合电推进系统飞发体化设计与能量管理协同优化方法

    随着全球航空业对绿色环保要求的不断提高,分布式混合电推进系统作为传统航空动力向全电飞行器过渡的关键技术,展现出巨大的发展潜力。本文围绕半涡电分布式推进系统的动态实时建模与控制方法展开系统研究。
    的头像 发表于 03-27 08:54 313次阅读
    <b class='flag-5'>分布式</b>迭代求解策略:<b class='flag-5'>分布式</b>混合电推进系统飞发<b class='flag-5'>一</b>体化设计与能量管理协同优化方法

    TiDB分布式数据库运维实践

    TiDB 是 PingCAP 开发的开源分布式关系型数据库,兼容 MySQL 5.7 协议,底层存储基于 TiKV(分布式 KV 存储)和 RocksDB。它解决的核心问题是:当单机 MySQL 无法承载数据量或写入压力时,提供
    的头像 发表于 03-04 15:44 379次阅读

    千万归乡人,与鸿蒙无网小游戏共度的第一个春节

    鸿蒙生态,把无网场景变成黄金货架
    的头像 发表于 03-02 20:22 240次阅读
    千万归乡人,与<b class='flag-5'>鸿蒙</b>无网<b class='flag-5'>小游戏</b>共度的第<b class='flag-5'>一个</b>春节

    分布式 IO 选型注意事项

    定义​ 分布式IO是种脱离传统集中式 IO 柜,将输入 / 输出模块分散部署在工业现场设备附近,通过工业总线(如 Profinet、EtherNet/IP、Modbus TCP 等)与 PLC、MES 等控制系统实现数据交互的工业控制设备。其核心架构由 “主站 +
    的头像 发表于 12-30 14:14 613次阅读
    <b class='flag-5'>分布式</b> IO 选型注意事项

    SC-3568HA:解锁鸿蒙全权限API与分布式能力的工业控制平台

    传统嵌入开发面临硬件碎片化、高权限功能缺失、分布式协同复杂及自动化测试不足等痛点。SC-3568HA开发板基于鸿蒙系统,通过统内核抽象层和硬件驱动框架解决兼容问题,开放全量系统AP
    的头像 发表于 12-18 11:27 7731次阅读
    SC-3568HA:解锁<b class='flag-5'>鸿蒙</b>全权限API与<b class='flag-5'>分布式</b>能力的工业控制平台

    深入理解分布式共识算法 Raft

    “不可靠的网络”、“不稳定的时钟”和“节点的故障”都是在分布式系统中常见的问题,在文章开始前,我们先来看下:如果在分布式系统中网络不可靠会发生什么样的问题。 有以下 3 服务构成的
    的头像 发表于 11-27 14:51 492次阅读
    深入理解<b class='flag-5'>分布式</b>共识算法 Raft

    如何解决分布式光伏计量难题?

    分布式光伏成增长主力 据《2025-2030年中国分布式光伏行业市场前景预测及未来发展趋势研究报告》显示,2024年中国分布式光伏新增装机118.18GW,同比增长23%,占光伏新增装机总量的43
    的头像 发表于 11-07 14:55 483次阅读
    如何解决<b class='flag-5'>分布式</b>光伏计量难题?

    【节能学院】Acrel-1000DP分布式光伏监控系统在奉贤平高食品 4.4MW 分布式光伏中应用

    摘要:在“双碳”和新型电力系统建设背景下,分布式光伏接入比例不断提高,对配电网电压、调度运行及调峰等环节造成强烈冲击。本文设计包含平台层、设备层二层架构体系的分布式光伏管控平台,以及小容量工商业
    的头像 发表于 08-23 08:04 3731次阅读
    【节能学院】Acrel-1000DP<b class='flag-5'>分布式</b>光伏监控系统在奉贤平高食品 4.4MW <b class='flag-5'>分布式</b>光伏中应用

    分布式光伏发电监测系统技术方案

    分布式光伏发电监测系统技术方案 柏峰【BF-GFQX】、系统目标 :分布式光伏发电监测系统旨在通过智能化的监测手段,实现对分布式光伏电站的全方位、高精度、实时化管理。该系统能
    的头像 发表于 08-22 10:51 3574次阅读
    <b class='flag-5'>分布式</b>光伏发电监测系统技术方案

    键部署无损网络:EasyRoCE助力分布式存储效能革命

    分布式存储的性能瓶颈往往在于网络。如何构建高带宽、超低时延、零丢包的无损网络,是释放分布式存储全部潜力、赋能企业关键业务(如实时数据库、AI训练、高性能计算)的关键挑战。
    的头像 发表于 08-04 11:34 1895次阅读
    <b class='flag-5'>一</b>键部署无损网络:EasyRoCE助力<b class='flag-5'>分布式</b>存储效能革命

    分布式光伏总出问题?安科瑞分布式光伏监控系统来“救场”

    分布式光伏的痛点大揭秘 在 “双碳” 目标的大力推动下,分布式光伏作为绿色能源领域的重要力量,正以前所未有的速度蓬勃发展,越来越多的企业和家庭选择安装分布式光伏系统。然而,随着
    的头像 发表于 07-16 16:50 1011次阅读
    <b class='flag-5'>分布式</b>光伏总出问题?安科瑞<b class='flag-5'>分布式</b>光伏监控系统来“救场”

    双电机分布式驱动汽车高速稳定性机电耦合控制

    和控制器的工作强度。 纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:双电机分布式驱动汽车高速稳定性机电耦合控制.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第时间告知,删除内容!
    发表于 06-18 16:37

    鸿蒙5开发宝藏案例分享---应用接续提升内容发布体验

    : Record<string, Object>) { // 生成分布式会话ID(像快递单号样重要!) let sessionId
    发表于 06-03 18:25

    鸿蒙5开发宝藏案例分享---多开发实例(游戏

    十年前藏的现金样惊喜!)这些藏在文档深处的\"武功秘籍\",能帮我们轻松实现分布式游戏、跨端协同这些听起来很酷的功能。快上车,带你解锁鸿蒙开发的正确姿势!
    发表于 06-03 18:22