前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制)

鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制)

作者头像
cMusketeer
发布于 2024-02-11 00:39:33
发布于 2024-02-11 00:39:33
20700
代码可运行
举报
文章被收录于专栏:Android机器圈Android机器圈
运行总次数:0
代码可运行

鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署

鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制)

鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)

鸿蒙开发游戏(四)---大鱼吃小鱼(互吃升级)

鸿蒙开发游戏(五)---大鱼吃小鱼(添加音效)

鸿蒙开发游戏(六)---大鱼吃小鱼(称霸海洋)

前言:上一篇介绍了鸿蒙新建项目以及界面部署,并未实现方向逻辑,上下左右控制,这篇来搞一下。首先如果我们用上下左右来控制很显然是不行的,因为我们还希望斜着也能游动,所以只能使用摇杆来试下,大家都肯定玩过王者荣耀,左下角的摇杆控制英雄走动,而且滑动的时候手指不自觉就滑出摇杆圈了,但是任务已经在动,这就物理摇杆和虚拟摇杆的区别,小时候玩过手柄吧,你手柄就不会出现摇出界的情况,因为是实体的,一旦出界你是有感触的,下意识就会修正,但虚拟的摇杆就很容易出界,所以我们要保证就算出界了只要手指没有抬起依旧可以触发事件。

1、摇杆布局

我们需要把←↑↓→替换成圆圈,方式有多种,看你喜欢。

  • 我们可以通过设置组件的弧度让其成圆形
  • Circle:系统给我们提供的圆形

开干

首先我们先看一下需要哪些变量,一定要提前定义好,统一操作一个变量。

  • 大圆有半径,有中心点(可以理解为初始点)
  • 小圆(做摇杆用)有半径,有拖动位置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 摇杆的中心位置
@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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,我们知道屏幕的起始点是从左上角开始延伸的,组件的起始位置也是从左上角开始的,我们定义的是中心点,所以要减去圆半径,不然的话就偏移了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.justifyContent(FlexAlign.Center)

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

效果如下

添加点击事件(Row布局)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.onTouch(this.handleTouchEvent.bind(this))

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
handleTouchEvent(event: TouchEvent) {
  switch (event.type) {
    case TouchType.Down:

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

      break
  }

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setMovePosition(event: TouchEvent) {
 

  }

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

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

1、计算手指的位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let x = event.touches[0].x;
let y = event.touches[0].y;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let vx = x - this.centerX;
let vy = y - this.centerY;

3、计算夹角

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let angle = Math.atan2(vy, vx)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、计算小圆的坐标

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//6、设置小鱼的移动位置,
this.xFish += this.speed * this.cos
this.yFish += this.speed * this.sin

记得给他一个速度speed。

试试效果吧...................

问题2

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

这里我们开启一个定时器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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时设置,抬起时释放掉

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
clearInterval(this.intervalId)

完整代码是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
  }


}

完.....

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)
前两篇文章我们做了摇杆控制小鱼移动,这篇将会添加一个NPC,让其自动在海洋里游荡,然后玩家控制吃掉它。在这之前我们想思考一些问题,
cMusketeer
2024/02/17
2150
鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)
鸿蒙开发游戏(四)---大鱼吃小鱼(互吃升级)
该篇对NPC进行了升级,这里可以投入多个NPC,且互不影响,npc之间不会触发eat,只和玩家触发eat,且每个NPC有自己的属性,他们的等级在他们的头顶
cMusketeer
2024/03/05
1630
鸿蒙开发游戏(四)---大鱼吃小鱼(互吃升级)
曲柄摇杆机构实例应用
如果铰链四杆机构的两个连架杆一个是曲柄,另一个是摇杆,则该四杆机构称为曲柄摇杆机构,如图1所示。
枫桦
2022/08/02
5.3K0
曲柄摇杆机构实例应用
漫画:大鱼吃小鱼,小鱼吃虾米。小鱼为什么不能躲起来?
总有一条更大的鱼(Always a Bigger Fish)不但是电影情节中的经典桥段,也是各种恶搞的灵感来源——小鱼总是被大鱼吃掉,而大鱼上面始终还有更大的鱼。久而久之,聪明的大鱼或许就不会去吃小鱼了,否则按照传统剧情,它身后会出现一条更大的鱼吃掉自己。让我们完整叙述一下问题:
程序员小浩
2020/04/14
1K0
漫画:大鱼吃小鱼,小鱼吃虾米。小鱼为什么不能躲起来?
EasyTouch☀️ 六、摇杆控制人物方向
星河造梦坊官方
2024/08/14
1120
EasyTouch☀️ 六、摇杆控制人物方向
Unity3d+moba+UGUI摇杆
使用UGUI制作摇杆,摇杆的初始位置是可变的,当按下同时改变Bg位置和thumb位置,当松手时Bg,thumb返回初始原位。主要函数:ScreenPointToLocalPointInRectangle,Vector3.Distance。
立羽
2023/08/24
1940
Unity3d+moba+UGUI摇杆
Unity OpenVR 虚拟现实入门六:通过摇杆控制玩家移动
在 Unity 的帮助下,虚拟现实应用的开发非常容易。不过国内竟然还是没有什么教程,所以这里就来一点入门的,适合新手。
walterlv
2023/10/22
6280
Unity OpenVR 虚拟现实入门六:通过摇杆控制玩家移动
Super于的虚拟摇杆组件,拿来就用,让你一劳永逸!
最近在研究虚拟摇杆实现方式的时候,发现网上的教程的实现方式可移植性并不是特别好,于是我决定自己实现一个虚拟摇杆组件,保存到自己的组件库,方便以后用到的时候直接使用(关注公众号后台回复「虚拟摇杆组件」可获取该组件),下面正文开始。
张晓衡
2019/09/17
8460
Super于的虚拟摇杆组件,拿来就用,让你一劳永逸!
小鱼易连:开放SDK,打造视频行业的“特斯拉”
小鱼易连在北京成功举办了“AI小鱼,赢视界——2018全球合作伙伴大会”,全球范围内超过500家核心伙伴参与本次会议。小鱼易连董事长兼CEO袁文辉发表了以“AI小鱼,赢视界,大视频,云融合”为核心策略
BestSDK
2018/03/27
2K0
小鱼易连:开放SDK,打造视频行业的“特斯拉”
Arduino驱动双轴XY按键摇杆模块
摇杆电位器 安装了两个10K高精度电位器和一个按键开关,功率0.015W,最高使用电压100V A.C,能垂直位置自动复位,用于控制键盘等, 可自由地控制方向,直观地监控机器的运转状况。
云深无际
2020/11/19
2.1K0
Arduino驱动双轴XY按键摇杆模块
Unity3D中使用Joystick Pack实现摇杆控制
花了几个小时重新根据Unity3D的初学者教程做了一个简单的Demo,做完后确实对新人来说是个比较不错的学习项目,项目中控制人物移动是用的键盘的方向键,就想如果在手机平台的话,实现摇杆控制方向,类似于王者荣耀那样的效果,所以就顺便学习了Joystick Pack组件。今天这篇就是介绍Joystick Pack的简单使用。
Vaccae
2020/10/27
5.8K0
Unity3D中使用Joystick Pack实现摇杆控制
UE4 隐藏虚拟摇杆
最近发现没有中文资料提到怎么隐藏和显示指定的虚拟摇杆,即Touch Interface,所以这里记录一下。
太阳影的社区
2021/10/15
1.9K0
【第3版emWin教程】第39章 emWin6.x指针输入设备(摇杆)
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第39章 emWin6.x指针输入设备(摇杆) 本章节为大家
Simon223
2021/09/29
7030
android游戏引擎andengine学习系列三:绘制游戏虚拟摇杆
andengine中绘制虚拟游戏摇杆非常简单,只需要实现AnalogOnScreenControl模拟摇杆类,在设置一些属性即可。先看效果图:
全栈程序员站长
2022/09/30
9480
android游戏引擎andengine学习系列三:绘制游戏虚拟摇杆
洛谷 || 小鱼比可爱(C语言)
人比人,气死人;鱼比鱼,难死鱼。小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度可能一样。由于所有的鱼头都朝向左边,所以每只鱼只能看见在它左边的鱼的可爱程度,它们心里都在计算,在自己的眼力范围内有多少只鱼不如自己可爱呢。请你帮这些可爱但是鱼脑不够用的小鱼们计算一下。
小Bob来啦
2020/12/15
9860
洛谷 || 小鱼比可爱(C语言)
C语言解题之小鱼的数字游戏
‍‍小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字a以i为底(长度不一定,以 00 结束),记住了然后反着念出来(表示结束的数字 00 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
小Bob来啦
2020/12/16
2.2K0
C语言解题之小鱼的数字游戏
rosdep update 使用小鱼fishros解决ros1/ros2问题 2022
reading in sources list data from /etc/ros/rosdep/sources.list.d Hit file:///usr/share/python3-rosdep2/debian.yaml Hit https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/osx-homebrew.yaml Hit https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/base.yaml Hit https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/python.yaml Hit https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/ruby.yaml Query rosdistro index https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml Skip end-of-life distro "ardent" Skip end-of-life distro "bouncy" Skip end-of-life distro "crystal" Skip end-of-life distro "dashing" Skip end-of-life distro "eloquent" Add distro "foxy" Add distro "galactic" Skip end-of-life distro "groovy" Add distro "humble" Skip end-of-life distro "hydro" Skip end-of-life distro "indigo" Skip end-of-life distro "jade" Skip end-of-life distro "kinetic" Skip end-of-life distro "lunar" Add distro "melodic" Add distro "noetic" Add distro "rolling" updated cache in /home/zhangrelay/.ros/rosdep/sources.cache
zhangrelay
2022/06/30
2.4K0
rosdep update 使用小鱼fishros解决ros1/ros2问题 2022
鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署)
第一篇相对简单,只是简单的布局摆放,用的知识点是Stack布局,State状态管理,Entry入口,Component注解等
cMusketeer
2024/02/02
3540
鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署)
Android-Kotlin VS Flutter-Dart - 自定义控制摇杆
前言 比较Kotlin OR Flutter 谁好, 就像在比较[程序员]和[画家]谁[唱歌]比较好听 Kotlin是语言,完美平复了我对Java的恨铁不成钢的心情。 Flutter是框架,完美
张风捷特烈
2020/04/30
1.5K0
Android-Kotlin VS Flutter-Dart - 自定义控制摇杆
推荐阅读
相关推荐
鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验