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

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

3天内不再提示

OpenHarmony传炸弹应用如何进行开发

OpenHarmony技术社区 来源:HarmonyOS技术社区 作者:HarmonyOS技术社区 2022-01-04 13:52 次阅读

在 9 月 30号更新的 OpenHarmony3.0 LTS 上,标准系统新增支持了方舟开发框架(ArkUI)、分布式组网和 FA 跨设备迁移能力等新特性,因此我们结合了这三种特性使用 ets 开发了一款如下图所示传炸弹应用。

打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作,然后通过分布式流转实现随机传递炸弹给下一位用户的效果。

那么这样一款传炸弹应用如何进行开发呢?完整的项目结构目录如下:

├─entry
│└─src
│└─main
││config.json//应用配置
││
│├─ets
││└─MainAbility
│││app.ets//ets应用程序主入口
│││
││└─pages
││CommonLog.ets//日志类
││game.ets//游戏首页
││RemoteDeviceManager.ets//设备管理类
││
│└─resources//静态资源目录
│├─base
││├─element
│││
││├─graphic
││├─layout
││├─media//存放媒体资源
│││
││└─profile
│└─rawfile

我们可以分为如下 3 步:

编写声明式 UI 界面

添加分布式能力

编写游戏逻辑

编写声明式UI 界面

①新增工程

在 DevEco Studio 中点击 File→New Project→Standard Empty Ability→Next,Language 选择 ETS 语言,最后点击 Finish 即创建成功。

②编写游戏页面

效果图如下可以分为两部分:

顶部状态提示栏:

首先在 @entry 组件入口 build() 中使用 Stack 作为容器,达到图片和文字堆叠的效果。

接着依次写入 Image 包裹的两个 Text 组件。

Stack(){
Image($r("app.media.title")).objectFit(ImageFit.Contain).height(120)
Column(){
Text(this.duration.toString()+'ms').fontColor(Color.White)
Text(this.touchText).fontColor(Color.White)
}
}

中间游戏炸弹九宫格区域:

使用 Grid 网格容器来编写九宫格区域。

在 GridItem 中 Stack (容器依次添加方块背景图片和炸弹图片。

在 visibility 属性中用 bombIndex 变量值来决定炸弹显示的位置。

通过 onClick 点击事件和 GestureGroup 组合手势加入单击、双击和长按的监听事件。

Stack(){
Image($r("app.media.background")).objectFit(ImageFit.Contain)
Grid(){
ForEach(this.grid,(item)=>{
GridItem(){
Stack(){
Image($r("app.media.squares")).objectFit(ImageFit.Contain)
Image($r("app.media.bomb"))
.width('50%')
.objectFit(ImageFit.Contain)
.visibility(this.bombIndex==item?Visibility.Visible:Visibility.Hidden)
//炸弹点击事件
.onClick((event)=>{
//单击
this.judgeGame(RuleType.click)
})
.gesture(
GestureGroup(GestureMode.Exclusive,
LongPressGesture({repeat:false})
.onAction((event:GestureEvent)=>{
//长按
this.judgeGame(RuleType.longPress)
}),
TapGesture({count:2})
.onAction(()=>{
//双击
this.judgeGame(RuleType.doubleClick)
})
)
}
}.forceRebuild(false)
},item=>item)
}
.columnsTemplate('1fr1fr1fr')
.rowsTemplate('1fr1fr1fr')
.columnsGap(10)
.rowsGap(10)
.width('90%')
.height('75%')
}.width('80%').height('70%')
③添加弹窗

创建规则游戏弹窗:通过@CustomDialog 装饰器来创建自定义弹窗,使用方式可参考《自定义弹窗文档》:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/js-reference/ts-based-declarative-development-paradigm/ts-methods-custom-dialog-box.md

规则弹窗效果如下,弹窗组成由两个 Text 和两个 Image 竖向排列组成,所以我们可以在 build() 下使用 Column 容器来包裹。

组件代码如下:

@CustomDialog
structRuleDialog{
controller:CustomDialogController
confirm:()=>void
invite:()=>void
@ConsumedeviceList:RemoteDevice[]

build(){
Column(){
Text('游戏规则').fontSize(30).margin(20)
Text('炸弹会随机出现在9个方块内,需要在规定时间内完成指定操作(点击、双击或长按),即可将炸弹传递给下一个人,小心炸弹可是会越来越快的喔!')
.fontSize(24).margin({bottom:10})
Image($r("app.media.btn_start")).objectFit(ImageFit.Contain).height(80).margin(10)
.onClick(()=>{
console.info(TAG+'Clickstartgame')
if(checkTrustedDevice(this.remoteDeviceModel)){
this.controller.close()
this.confirm()
}
})
Image($r("app.media.btn_Invite")).objectFit(ImageFit.Contain).height(80).margin(10)
.onClick(()=>{
this.invite()
})
}.width('90%')
.margin(20)
.backgroundColor(Color.White)
}
}

在 @entry 创建 CustomDialogController 对象并传入弹窗所需参数,后面可通过该对象 open() 和 close() 方法进行打开和关闭弹窗。

@ProvidedeviceList:RemoteDevice[]=[]
privateruleDialog:CustomDialogController=newCustomDialogController({
builder:RuleDialog({
invite:()=>this.InvitePlayer(),
confirm:()=>this.startGame(),
deviceList:this.deviceList
}),
autoCancel:false
})

创建游戏失败弹窗,并添加动画效果,如下图:

编写弹窗布局:将游戏失败文本、炸弹图片和再来一局按钮图片放置于 Column 容器中。

用变量来控制动画起始和结束的位置:用 Flex 容器包裹炸弹图片,并用 @State 装饰变量 toggle,通过变量来动态修改 [Flex] 的 direction 属性。

@Statetoggle:boolean=true
privatecontroller:CustomDialogController
@ConsumedeviceList:RemoteDevice[]
privateconfirm:()=>void
privateinterval=null

build(){
Column(){
Text('游戏失败').fontSize(30).margin(20)
Flex({
direction:this.toggle?FlexDirection.Column:FlexDirection.ColumnReverse,
alignItems:ItemAlign.Center
})
{
Image($r("app.media.bomb")).objectFit(ImageFit.Contain).height(80)
}.height(200)

Image($r("app.media.btn_restart")).objectFit(ImageFit.Contain).height(120).margin(10)
.onClick(()=>{
this.controller.close()
this.confirm()
})
}
.width('80%')
.margin(50)
.backgroundColor(Color.White)
}

设置动画效果:使用 animateTo 显式动画接口炸弹位置切换时添加动画,并且设置定时器定时执行动画。

aboutToAppear(){
this.setBombAnimate()
}

setBombAnimate(){
letfun=()=>{
this.toggle=!this.toggle;
}
this.interval=setInterval(()=>{
animateTo({duration:1500,curve:Curve.Sharp},fun)
},1600)
}

添加分布式流转

分布式流转需要在同一网络下通过 DeviceManager 组件进行设备间发现和认证。

获取到可信设备的 deviceId 调用 FeatureAbility.startAbility(parameter),即可把应用程序流转到另一设备。

原本分布式流转应用流程如下:

创建 DeviceManager 实例。

调用实例的 startDeviceDiscovery(),开始设备发现未信任设备。

设置设备状态监听 on('deviceStateChange',callback),监听设备上下线状态。

设置设备状态监听 on('deviceFound',callback),监听设备发现。

传入未信任设备参数,调用实例 authenticateDevice 方法,对设备进行 PIN 码认证。

若是已信任设备,可通过实例的 getTrustedDeviceListSync() 方法来获取设备信息

将设备信息中的 deviceId 传入featureAbility.startAbility 方法,实现流转。

流转接收方可通过 featureAbility.getWant() 获取到发送方携带的数据。

注销设备发现监听 off('deviceFound')。

注销设备状态监听 off('deviceStateChange')。

项目中将上面设备管理封装至 RemoteDeviceManager,通过 RemoteDeviceManager 的四个方法来动态维护 deviceList 设备信息列表。

项目实现分布式流转只需如下流程:

①创建 RemoteDeviceManager 实例

导入 RemoteDeviceManager:

import{RemoteDeviceManager}from'./RemoteDeviceManager'

声明 @Provide 装饰的设备列表变量 deviceList,和创建 RemoteDeviceManager 实例。

@ProvidedeviceList:RemoteDevice[]=[]
privateremoteDm:RemoteDeviceManager=newRemoteDeviceManager(this.deviceList)

②刷新设备列表

在生命周期 aboutToAppear 中,调用刷新设备列表和开始发现设备。

aboutToAppear 定义:函数在创建自定义组件的新实例后,在执行其 build 函数之前执行。

aboutToAppear(){
this.remoteDm.refreshRemoteDeviceList()//刷新设备列表
this.remoteDm.startDeviceDiscovery()//开始发现设备
}

③设备认证

代码如下:

invitePlayer(remoteDevice:RemoteDevice){
if(remoteDevice.status==RemoteDeviceStatus.ONLINE){
prompt.showToast({message:"Alreadyinvited!"})
return
}
this.remoteDm.authDevice(remoteDevice).then(()=>{
prompt.showToast({message:"Invitesuccess!deviceName="+remoteDevice.deviceName})
}).catch(()=>{
prompt.showToast({message:"Invitefail!"})
})
}

④跨设备流转

从 deviceList 中获取设备列表在线的设备 Id,通过 featureAbility.startAbility 进行流转。

asyncstartAbilityRandom(){
letdeviceId=this.getRandomDeviceId()//随机获取设备id
CommonLog.info('featureAbility.startAbilitydeviceId='+deviceId);
letbundleName=awaitgetBundleName()
letwantValue={
bundleName:bundleName,
abilityName:'com.sample.bombgame.MainAbility',
deviceId:deviceId,
parameters:{
ongoing:true,
transferNumber:this.transferNumber+1
}
};
featureAbility.startAbility({
want:wantValue
}).then((data)=>{
CommonLog.info('featureAbility.startAbilityfinished,'+JSON.stringify(data));
featureAbility.terminateSelf((error)=>{
CommonLog.info('terminateSelffinished,error='+error);
});
});
}
⑤注销监听

在声明周期 aboutToDisappear 进行注销监听。

aboutToDisappear 定义:函数在自定义组件析构消耗之前执行。

aboutToDisappear(){
this.remoteDm.stopDeviceDiscovery()//注销监听
}

编写游戏逻辑

①开始游戏

代码如下:

startGame(){
CommonLog.info('startGame');
this.randomTouchRule()//随机游戏点击规则
this.setRandomBomb()//随机生成炸弹位置
this.stopCountDown()//停止倒计时
if(this.transferNumber< 10) {
    this.duration = 3000 - this.transferNumber * 100
  } else {
    this.duration = 2000
  }
  const interval: number = 500
  // 开始倒计时
  this.timer = setInterval(() =>{
if(this.duration<= interval) {
      this.duration = 0
      clearInterval(this.timer)
      this.timer = null
      this.gameFail()
    } else {
      this.duration -= interval
    }
  }, interval)
}

②判断输赢

编写判断逻辑,用于不同的点击事件中调用。

/**
*判断游戏输赢
*@paramoperation点击类型
*/
judgeGame(operation:RuleType){
this.stopCountDown()
if(operation!=this.ruleText){
this.gameFail()
}else{
prompt.showToast({message:"finish"})
this.bombIndex=-1
this.startAbilityRandom()
}
}

③游戏失败

游戏失败,弹出游戏失败弹框。

gameFail(){
prompt.showToast({
message:'GameFail'
})
CommonLog.info('gameFail');
this.gameFailDialog.open()
}

项目下载和导入

项目仓库地址:

https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/FA/Entertainment/BombGame

git 下载:

gitclonehttps://gitee.com/openharmony-sig/knowledge_demo_temp.git

项目导入:打开 DevEco Studio,点击 File→Open→下载路径/FA/Entertainment/BombGame。

约束与限制

①设备编译约束

获取 OpenHarmony 源码(OpenHarmony 版本须 3.0LTS 以上):

https://www.openharmony.cn/pages/0001000202/#%E5%AE%89%E8%A3%85%E5%BF%85%E8%A6%81%E7%9A%84%E5%BA%93%E5%92%8C%E5%B7%A5%E5%85%B7

安装开发板环境:

https://www.openharmony.cn/pages/0001000400/#hi3516%E5%B7%A5%E5%85%B7%E8%A6%81%E6%B1%82

开发板烧录:

https://www.openharmony.cn/pages/0001000401/#%E4%BD%BF%E7%94%A8%E7%BD%91%E5%8F%A3%E7%83%A7%E5%BD%95

②应用编译约束

参考《应用开发快速入门》:

https://www.openharmony.cn/pages/00090000/

集成开发环境:DevEco Studio 3.0.0.601 版本以上,下载地址:

https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta

OpenHarmony SDK 3.0.0.0 以上。

作者:林嘉成 OpenAtom OpenHarmony

原文标题:OpenHarmony上玩“传炸弹”小游戏

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

审核编辑:彭菁

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

    关注

    0

    文章

    481

    浏览量

    21876
  • OpenHarmony
    +关注

    关注

    23

    文章

    3284

    浏览量

    15159

原文标题:OpenHarmony上玩“传炸弹”小游戏

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

收藏 人收藏

    评论

    相关推荐

    Android APP如何进行访问硬件驱动

    本文我们要讲的是在用 i.MX8 平台开发时,Android APP 如何进行访问硬件驱动。
    的头像 发表于 12-04 13:50 470次阅读
    Android APP如<b class='flag-5'>何进行</b>访问硬件驱动

    JTAG开发板与ST-Link是如何进行连接的

    怎样去设计一种JTAG开发板的电路?如何对JTAG开发进行仿真?JTAG开发板与ST-Link是如何进行连接的?
    发表于 08-09 06:51

    HarmonyOS与OpenHarmony应用开发差异

    DevEco Studio是HarmonyOS的配套的开发IDE,因为HarmonyOS是基于OpenHarmony开发的,因此,使用DevEco Studio(配套HarmonyOS)也可以
    发表于 10-22 10:35

    请问PC和开发板之间如何进行传输文件?

    请问PC和开发板之间如何进行传输文件?
    发表于 10-26 06:10

    应用热更新如何进行嵌入式设备开发调试?

    应用热更新如何进行嵌入式设备开发调试?
    发表于 12-23 06:02

    OpenHarmony标准设备应用开发笔记汇总

    1、如何在标准设备上运行一个最简单的OpenHarmony程序本文是 OpenAtom OpenHarmony(以下简称“OpenHarmony”)标准设备应用开发的第一篇文章。这一篇
    发表于 03-28 14:19

    请问鸿蒙如何进行native开发

    鸿蒙如何进行native开发,类似安卓的jni,有没有相关文档
    发表于 03-29 10:21

    何进行 OpenHarmony 设备开发

    为了方便开发者正确获取内容,本导读基于OpenHarmony学习路径同时结合开发者具体业务对相关资料资源进行了分类。 系统类型 在正式学习OpenH
    发表于 05-07 10:22

    赵海鹏:如何进行 OpenHarmony 音频特性架构设计和开发工作

    OpenHarmony目前仍处在开发探索阶段,很多共建单位和生态伙伴还不清楚开源项目的玩法,或不知该如何着手进行开发。可以请您给大家分享一条,您认为最重要或最值得分享的心得吗?我觉得
    发表于 05-11 10:31

    openharmony开发企业有哪些

    OpenHarmony是开放原子开源基金会上的一个孵化项目,支持多种设备。OpenHarmony 使用了组件化的设计方案,能够依据设备来进行裁剪,满足各种形态终端设备的需求。OpenHarmo
    的头像 发表于 06-23 11:13 1853次阅读

    openharmony二次开发

    当前OpenHarmony已开放了源码下载,用户可随时随地进行查阅,另外,也可以为华为OpenHarmony项目做贡献,提交代码等。因为它是开源项目,所以用户都可以参与其中。当然,如果你的团队
    的头像 发表于 06-23 11:49 1246次阅读

    何进行OPCDCOM配置

    何进行OPCDCOM配置(四会理士电源技术有限公司招聘)-如何进行OPCDCOM配置                      
    发表于 09-18 14:23 11次下载
    如<b class='flag-5'>何进行</b>OPCDCOM配置

    openharmony开源社区 OpenHarmony开发样例上新了

    openharmony开源社区 OpenHarmony开发样例上新了 OpenHarmony 开源项目是由开放原子开源基金会孵化及运营的开源项目,由开放原子开源基金会
    的头像 发表于 04-25 16:37 2115次阅读

    OpenHarmony Tech Day技术日 基于OpenHarmony的创新应用开发

    深圳大学韩雨就“基于OpenHarmony的创新应用开发”微专业建设成效进行演讲,主要送三个方面进行分享
    的头像 发表于 04-25 16:39 705次阅读
    <b class='flag-5'>OpenHarmony</b> Tech Day技术日 基于<b class='flag-5'>OpenHarmony</b>的创新应用<b class='flag-5'>开发</b>

    何进行电源设计 - 第1部分

    何进行电源设计 - 第1部分
    发表于 11-02 08:16 1次下载
    如<b class='flag-5'>何进行</b>电源设计 - 第1部分