96SEO 2026-02-20 03:29 12
完成本篇Codelab需要两台开发板#xff0c;一台开发板作为游…介绍

本篇Codelab是基于TS扩展的声明式开发范式编程语言以及OpenHarmony的分布式能力实现的一个手柄游戏。
完成本篇Codelab需要两台开发板一台开发板作为游戏端一台开发板作为手柄端实现如下功能
游戏端呈现飞机移动、发射子弹等效果。
游戏端分布式拉起手柄端FA。
手柄端与游戏端建立连接发送指令给游戏端比如移动飞机发射子弹和释放技能等。
完成本篇Codelab我们首先要完成开发环境的搭建本示例以RK3568开发板为例参照以下步骤进行
Studio的安装和开发环境配置。
开发环境配置完成后请参考使用工程向导创建工程模板选择“Empty
Ability”选择JS或者eTS语言开发。
工程创建完成后选择使用真机进行调测。
本章节以系统自带的音乐播放器为例具体以实际的应用为准介绍如何完成两台设备的分布式组网。
硬件准备准备两台烧录相同的版本系统的RK3568开发板A、B。
开发板A、B连接同一个WiFi网络。
打开设置--WLAN--点击右侧WiFi开关--点击目标WiFi并输入密码。
设备A打开音乐点击左下角流转按钮弹出列表框在列表中会展示远端设备的id。
设备B点击允许设备B将会弹出随机PIN码将设备B的PIN码输入到设备A的PIN码填入框中。
HandleEtsOpenHarmonyGameEtsOpenHarmony
本篇Codelab只对核心代码进行讲解首先介绍一下整个工程的代码结构
其中HandleEtsOpenHarmony为手柄端工程代码GameEtsOpenHarmony为游戏端工程代码。
pages/index.ets应用主页面。
common/images存放图片资源的目录。
ServiceAbility存放ServiceAbility相关文件。
pages/index.ets应用主页面。
common/images存放图片资源。
model存放获取组网内的设备列表相关文件。
RemoteDeviceModel.ets获取组网内的设备列表。
GameElement.ets游戏端界面元素的实体类用于封装子弹、飞机等元素的属性。
ServiceAbility存放ServiceAbility相关文件。
手柄端有两个功能向游戏端发送指令和实时获取游戏端得分数据。
界面上有三个功能组件蓝色图形组件用于控制游戏端飞机移动方向黄色图形组件用于发射子弹绿色图形组件用于释放技能效果图如下
{Image(/common/images/bigcircle.png).width(300).height(300)Image(/common/images/smallcircle.png).width(140).height(140).position({
{Image(/common/images/a.png).width(160).height(160).margin({
})Image(/common/images/b.png).width(200).height(200)}.alignItems(VerticalAlign.Bottom)...}}
给摇杆蓝色小圆图形添加TouchEvent动态改变摇杆position属性使摇杆跟随手指移动主要代码如下
event.touches[0].screenX;this.startY
event.touches[0].screenY;break;case
event.touches[0].screenX;this.curY
event.touches[0].screenY;this.getSmallCurrentPos(this.curX
Math.round(this.calculateAngle());break;default:break;}
当手柄端被游戏端拉起时获取游戏端传递的数据游戏端deviceId和分数score。
然后通过deviceId连接游戏端Service主要代码如下
want.parameters.deviceIdconnectRemoteService(remoteDeviceId)}});
featureAbility.connectAbility({deviceId:
com.huawei.cookbook,abilityName:
com.huawei.cookbook.ServiceAbility,},{onConnect:
onConnectCallback,onDisconnect:
连接游戏端Service之后摇杆角度angle和操作类型actionType1为发射子弹2为释放技能发送给游戏端主要代码如下
rpc.MessageParcel();data.writeInt(actionType);data.writeInt(angle);await
游戏界面主要由玩家飞机、敌机、子弹和道具降落伞等组成由于敌机和子弹都是多个的所以使用ForEach来实现主要代码如下
{Image(item.imgSrc).width(item.imgWidth).height(item.imgHeight).position({
item.timestamp.toString())ForEach(this.enemyPlanes,
{Image(item.imgSrc).width(item.imgWidth).height(item.imgHeight).position({
item.timestamp.toString())Image(/common/images/planeOne.png).width(this.planeSize).height(this.planeSize).position({
{this.onTouchEvent(event)})Image(/common/images/props.png).width(this.propsSize).height(this.propsSize).position({
})...}.height(100%).width(100%)}
飞机、子弹和道具等元素的移动是通过动态改变Image的position属性来实现的。
使用定时器setInterval每隔16ms重新设置界面元素position属性的值主要实现代码如下
that.bullets[i]bullet.positionY
{bulletsTemp.push(bullet)}}that.bullets
that.enemyPlanes[j]enemyPlane.positionY
{enemyPlanesTemp.push(enemyPlane)}}that.enemyPlanes
在setInterval中改变元素位置的时候同时检测元素之间是否发生碰撞子弹和敌机发生碰撞则分数值改变摧毁小飞机加50分摧毁大飞机加100分玩家飞机和道具发生碰撞则道具加1主要实现代码如下
50sendMessageToRemoteService(that.score)}
100sendMessageToRemoteService(that.score)}//
清除被子弹打中敌机that.bullets.splice(j,
falsethis.bombNumthis.propsPosY
点击界面右上角的“电脑”图标调用registerDeviceListCallback()发现设备列表并弹出设备列表选择框DeviceListDialog
{Text(选择设备).fontWeight(FontWeight.Bold).fontSize(20).margin({
{Text(item).fontSize(12).margin({
{startRemoteAbility(item)this.controller.close();}).padding({
item.toString())}.height(30%).align(Alignment.TopStart)
com.huawei.cookbook,abilityName:
com.huawei.cookbook.MainAbility,deviceId:
params};featureAbility.startAbility({want:
拉起远端后连接远端serviceconnectRemoteService(deviceId)});
(remoteDeviceModel.deviceList.length
featureAbility.connectAbility({deviceId:
com.huawei.cookbook,abilityName:
com.huawei.cookbook.ServiceAbility,},{onConnect:
onConnectCallback,onDisconnect:
sendMessageToRemoteService(score)
{console.log([game]connectRemoteService
rpc.MessageParcel();data.writeInt(score);await
通过Service接收手柄端数据然后使用CommonEvent模块将数据发送给FA主要代码如下
data.readInt();reply.writeInt(100);var
com.huawei.cookbook,parameters:
发布公共事件commonEvent.publish(publish_action,
订阅公共事件接收从Service发送的公共事件数据actionType
为飞机移动的角度。
接收到数据后执行手柄端发送的指令移动玩家飞机、发射子弹和释放技能摧毁所有敌机主要代码如下
data.parameters.actionType;that.angle
{that.bombNum--that.destroyAllEnemy()}}if
{that.movePlaneByHandle()}}//创建订阅者回调function
data;//订阅公共事件commonEvent.subscribe(subscriber,
SubscribeCallBack);}//创建订阅者commonEvent.createSubscriber(subscribeInfo,
通过CommonEvent发布与订阅实现Service和FA之间通信。
为了帮助大家更深入有效的学习到鸿蒙开发知识点小编特意给大家准备了一份全套最新版的HarmonyOS
NEXT学习资源获取完整版方式请点击→《HarmonyOS教学视频》
鸿蒙语法ArkTS、TypeScript、ArkUI等.....视频教程
获取白皮书完整版方式请点击→《鸿蒙生态应用开发白皮书V2.0PDF》
应用基础知识配置文件应用数据管理应用安全管理应用隐私保护三方应用调用管控机制资源分类与访问学习ArkTS语言……
Ability开发UI开发公共事件与通知窗口管理媒体安全网络与链接电话服务数据管理后台任务(Background
Task)管理设备管理设备使用信息统计DFX国际化开发折叠屏系列……
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback