鸿蒙应用开发游戏(二)---大鱼吃小鱼(摇杆控制)(1),HarmonyOS鸿蒙开发简历源码

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

  • 大圆有半径,有中心点(可以理解为初始点)
  • 小圆(做摇杆用)有半径,有拖动位置

// 摇杆的中心位置
@State centerX: number = 120
@State centerY: number = 120

//摇杆的初始位置
@State positionX: number = this.centerX
@State positionY: number = this.centerY

//半径
@State radiusMax: number = 100
// 小圆半径
@State radiusMin: number = 20

定义好之后就可以初始化位置了

Row() {
Circle({ width: this.radiusMax * 2, height: this.radiusMax * 2 })
.fill(‘#50f1eded’)
.position({ x: this.centerX - this.radiusMax, y: this.centerY - this.radiusMax })

Circle({ width: this.radiusMin * 2, height: this.radiusMin * 2 })
.fill(‘#50f1eded’)
.position({ x: this.positionX - this.radiusMin, y: this.positionY - this.radiusMin })
}
.width(240)
.height(240)
.position({ x: 0, y: 120 })
.justifyContent(FlexAlign.Center)

上面需要注意的是x: this.centerX - this.radiusMax,我们知道屏幕的起始点是从左上角开始延伸的,组件的起始位置也是从左上角开始的,我们定义的是中心点,所以要减去圆半径,不然的话就偏移了

.justifyContent(FlexAlign.Center)

你看到了Row,这是左右布局,加上这句话可以让内容居中。

效果如下

添加点击事件(Row布局)

.onTouch(this.handleTouchEvent.bind(this))

handleTouchEvent是我们自定义的方法,传入一个 TouchEvent。

  • TouchEvent.Down:按下事件(1次)
  • TouchEvent.Move:移动事件(0-无数次)
  • TouchEvent.Up(1次)

当我们一个事件产生后,就会触发一次down事件,0次移动事件(用户手指不移动)和无数次移动事件(用户疯狂移动手指),之后抬起手指触发一次up事件。

handleTouchEvent(event: TouchEvent) {
switch (event.type) {
case TouchType.Down:

break
case TouchType.Move:
this.setMovePosition(event)
break
case TouchType.Up:

break
}

OK,那就开始吧,由于Move代码有点多,这里抽取一个方法叫做

setMovePosition(event: TouchEvent) {

}

在这我们要开始思考了,竟然是通过摇杆去控制鱼,那我们得知道摇杆滑动的方向

当你的手机从红圆点滑动到指定位置时,他的坐标我们可以得到,从而获取手指与圆点的距离,vy,vx,通过tan可以获取到夹角。通过夹角计算出手指离中心点的距离从而设置摇杆的位置。

1、计算手指的位置

let x = event.touches[0].x;
let y = event.touches[0].y;

2、计算手指与中心点的差值

let vx = x - this.centerX;
let vy = y - this.centerY;

3、计算夹角

let angle = Math.atan2(vy, vx)

4、利用夹角计算出手指离中心点的距离

let distance = this.getDistance(vx, vy)

单独写个方法
getDistance(x: number, y: number) {
let distance = Math.sqrt(x * x + y * y)
return Math.min(distance, this.radiusMax)
}

这里需要注意一下,计算的距离不能超过大圆,我们要始终保持摇杆(小圆)在大圆区域内

5、计算小圆的坐标

this.sin = Math.sin(angle)
this.cos = Math.cos(angle)
this.positionX = distance * this.cos + this.centerX
this.positionY = distance * this.sin + this.centerY

OK,到这就摇杆就完成了,你快去试试效果吧。

调试中。。。。。。。。。。

问题1

你会发现这小鱼没有动只是摇杆动了,我们还需要设置小鱼的位置xfish,yfish

//6、设置小鱼的移动位置,
this.xFish += this.speed * this.cos
this.yFish += this.speed * this.sin

记得给他一个速度speed。

试试效果吧…

问题2

是不是还有问题,就是我们滑动摇杆时小鱼动了,一旦我们停止滑动摇杆时小鱼就停止了,那这是为什么呢,安卓开发应该都会自定义view,当我们需要对view进行重绘时,会用到invalidate,对,这就是通知系统要刷新view了,在这的问题就是这,所以我们需要通知系统也对view进行刷新。

这里我们开启一个定时器

this.intervalId = setInterval(() => {
//6、设置小鱼的移动位置,
this.xFish += this.speed * this.cos
this.yFish += this.speed * this.sin

//目的是触碰到边缘时不溢出
this.xFish = this.getBorderX(this.xFish)
//还原角度
// this.angle = 0

}, 40)

这里我们传入40毫秒,肉眼一秒26帧左右会很顺滑,1000/26 约等于38,我们直接写40。

那么这个定时器我们不能一直开着,主要是没必要,当我们在按压down时设置,抬起时释放掉

clearInterval(this.intervalId)

完整代码是

handleTouchEvent(event: TouchEvent) {
switch (event.type) {
case TouchType.Down:
this.intervalId = setInterval(() => {
//6、设置小鱼的移动位置,
this.xFish += this.speed * this.cos
this.yFish += this.speed * this.sin

//目的是触碰到边缘时不溢出
this.xFish = this.getBorderX(this.xFish)
//还原角度
// this.angle = 0

}, 40)
break
case TouchType.Move:
this.setMovePosition(event)
break
case TouchType.Up:
clearInterval(this.intervalId)
//恢复摇杆位置
animateTo({
curve: curves.springMotion()
}, () => {
this.positionX = this.centerX
this.positionY = this.centerY
})

this.speed = 0
break
}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

rY
})

this.speed = 0
break
}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-FXKmbJZR-1713465607987)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值