Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >遥控杆实现

遥控杆实现

作者头像
异名
发布于 2020-06-09 07:29:54
发布于 2020-06-09 07:29:54
47900
代码可运行
举报
文章被收录于专栏:异名异名
运行总次数:0
代码可运行

这是游戏里面很常用的一个功能模块,通过操控遥控杆控制物体的移动

Joystick

实现思路

遥控杆的构造分为中间的控制点和外层的圆形,首先给遥控杆绑定个触控事件,然后在touch_move的时候让触控杆保持在圆形中,同时把鼠标的位置偏移信息传给需要移动的物体。

控制杆逻辑

用户点击的时候分两种情况,一种是用户的点击位置能够让控制点完全落在圆形内,这个时候让控制点直接移动到用户点击的位置即可;另外一种是用户的点击位置会让控制点会落在圆形外,那就要做一个计算,让控制点的位置维持在圆形内。

handle_point

这个计算也是很简单,因为我们知道外面圆形的半径,触控点的半径,那它们只要相减就能得出触控点距离圆心最远的距离R。当超过这个距离的时候我们已知斜边是R,同时可以得出用户点击时的向量夹角,那就可以通过三角函数轻易算出控制点的位置。

calc_point_pos

这个逻辑在TOUCH_STARTTOUCH_MOVE中都需要,以下代码是实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
touchStartEvent(event) {
  let touchPos = this.node.convertToNodeSpaceAR(event.getLocation());
  const distance = touchPos.len();
  const radius = this.node.width / 2 - this.controlDot.width / 2;

  // 以x轴正方向为基准,计算偏移量
  this.radian = cc.v2(1, 0).signAngle(touchPos);
  const offsetX = Math.cos(this.radian) * radius;
  const offsetY = Math.sin(this.radian) * radius;
  this.controlDot.setPosition(radius > distance ? touchPos : cc.v2(offsetX, offsetY));

  this.movableFlag = true;
}

物体移动

在用户点击的时候我们已经拿到了用户拖动的方向radian,有了方向再加上物体移动的步长,这个其实也就是物体移动的速度,那就可以算出物体在x方向和y方向的移动增量,直接相加即可。我们可以加一个标志位movableFlag,当用户操控控制杆的时候就把这个标志位置为true,然后在update中根据这个标志位使物体进行位置偏移。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
speed: number = 150;
update(dt) {
  if (!this.movableFlag) return;
  this.movableStar.x += Math.cos(this.radian) * dt * this.speed;
  this.movableStar.y += Math.sin(this.radian) * dt * this.speed;
}

大多数情况下还需要添加限制条件,让物体的移动不能超出画布,那这就可以通过获取当前屏幕的宽高,然后在计算位置偏移的时候多加一个判断,超出画布就不增加偏移,不超出画布就正常偏移就可以了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 异名 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端如何呼风唤雨
IMWeb前端团队
2017/12/29
8880
前端如何呼风唤雨
面向对象+模块化设计绘制canvas星空动画
require.js的相关内容已在我的博文 《requireJs的使用,以canvas绘制星空为例》中描述, 可查看:https://cloud.tencent.com/developer/article/1040858 下面说一下面向对象设计canvas绘制星空的各种对象。 1、静态元素 如背景(Backgound)、土地(Land)、房屋(House)、大树(Tree),这些元素的属性如坐标(x,y)、长度(width)、高度(height)等信息是固定不变,因此我们只用向其绘制函数内传入常量参数就可以
lonelydawn
2018/02/09
2.1K0
绚丽烟花:HTML5 Canvas 烟花效果实现(文末附完整代码)
在节日或特殊场合,绚丽的烟花总能带来无尽的欢乐和惊喜。今天,我们将通过 HTML5 Canvas 实现一个绚丽的烟花效果,让你的网页也能绽放出美丽的烟花。
码事漫谈
2025/01/27
7020
绚丽烟花:HTML5 Canvas 烟花效果实现(文末附完整代码)
图形编辑器基于Paper.js教程14:使用 Paper.js 绘制数学图形与交互的实现,画布缩放保持大小的圆,正弦,余弦,螺旋线
在现代Web开发中,动态图形和交互式视觉表现已成为提升用户体验的重要手段。通过一个详细的示例,我们将探索如何使用 Paper.js 进行数学图形(正弦曲线、余弦曲线和螺旋线)的绘制,并实现固定尺寸的圆形及其随视图缩放的调整。此外,本文将深入分析鼠标滚轮和拖动事件处理的缩放与视图移动实现。
拿我格子衫来
2024/08/15
2100
图形编辑器基于Paper.js教程14:使用 Paper.js 绘制数学图形与交互的实现,画布缩放保持大小的圆,正弦,余弦,螺旋线
❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)
首先,我们来看一下HTML结构。代码中只有一个<canvas>元素,这是我们用来绘制粒子特效的画布。我们也可以通过给<canvas>元素设置背景图片来增加更多的效果。
命运之光
2024/03/20
2.3K0
❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)
CreatorPrimer|飞机大战(二)
之前的飞机大战(一)我们实现了地图场景的滚动和简单的直上直下的子弹的发射,在之前的基础上,对线性发射器做了简单的修改,实现了如下效果:
张晓衡
2019/09/11
7360
CreatorPrimer|飞机大战(二)
❤️创意网页:炫酷的网页 - 创造华丽粒子动画
欢迎来到本篇技术博客!今天,我们将一起学习如何使用HTML5 Canvas和JavaScript创造一个炫酷的网页效果。我们将绘制彩色粒子并让它们在画布上随机运动,形成华丽的粒子动画。让我们开始吧!
命运之光
2024/03/20
3350
❤️创意网页:炫酷的网页 - 创造华丽粒子动画
鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制)
上面需要注意的是x: this.centerX - this.radiusMax,我们知道屏幕的起始点是从左上角开始延伸的,组件的起始位置也是从左上角开始的,我们定义的是中心点,所以要减去圆半径,不然的话就偏移了
cMusketeer
2024/02/11
2050
鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制)
看得见的数据结构Android版之二分搜索树篇
零、前言 1.个人感觉这个二叉搜索树实现的还是很不错的,基本操作都涵盖了 2.在Activity中对view设置监听函数,可以动态传入数据,只要可比较,都可以生成二分搜索树 3.二分搜索树的价值
张风捷特烈
2018/12/18
6830
【Golang语言社区】H5游戏开发从零开始开发一款H5小游戏(三) 攻守阵营,赋予粒子新的生命
每个游戏都会包含场景和角色。要实现一个游戏角色,就要清楚角色在场景中的位置,以及它的运动规律,并能通过数学表达式表现出来。 场景坐标 canvas 2d的场景坐标系采用平面笛卡尔坐标系统,左上角为原点(0,0),向右为x轴正方向,向下为y轴正方向,坐标系统的1个单位相当于屏幕的1个像素。这对我们进行角色定位至关重要。 Enemy粒子 游戏中的敌人为无数的红色粒子,往同一个方向做匀速运动,每个粒子具有不同的大小。 入口处通过一个循环来创建Enemy粒子,随机生成粒子的位置x, y。并保证每个粒子都位于上图坐标
李海彬
2018/03/27
8880
3. 创建游戏界面
进入 /game/templates/multiends 打开 web.html:
浪漫主义狗
2022/11/18
1.4K0
3D 饼环图初步完成
我顺着自己 3D 饼图(ECharts 3D 饼图近似实现)的思路想了想,发现这条路不好走……
ZXand618
2022/04/10
1.4K0
3D 饼环图初步完成
解锁前端难题:亲手实现一个图片标注工具
业务中涉及图片的制作和审核功能,审核人员需要在图片中进行标注,并说明存在的问题,标注过程中需要支持放大缩小,移动等交互,将业务剥离,这个需求,可以定义为实现一个图片标注功能。
winty
2024/04/15
1K0
解锁前端难题:亲手实现一个图片标注工具
【Golang语言社区】H5游戏开发-从零开始开发一款H5小游戏(四) 撞击吧粒子,炫酷技能的实现
本游戏有五种技能粒子,分别是 "护盾","重力场","时间变慢","使敌人变小","增加生命"。Player粒子吃了技能粒子后就能表现各种特殊效果。 碰撞检测 游戏中Player粒子可能会撞击到Enemy粒子,也可能吃到Skill粒子。我们怎么来判断呢?画布中两个粒子的碰撞检测其实很简单,如果是圆形粒子,只需要判断两个粒子圆心的距离是否小于两个圆半径之和就行了。 //index.js function collision(enemy, player) { const disX = player.x
李海彬
2018/03/27
1.1K0
在 Cocos Creator 里画个炫酷的雷达图
是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多元数据的图形方法。
陈皮皮
2020/08/25
1.9K0
在 Cocos Creator 里画个炫酷的雷达图
h5小游戏——HitRocket
一.游戏介绍 游戏介绍: 不断有携带字母炸弹的火箭撞向地面,请根据火箭身上的字母敲击键盘,每一次对应的敲击会击落携带该字母的火箭并使得分加一,每一架火箭撞到地面会使生命值减一,每击落十架火箭,火箭数会加一,并奖励一点额外生命值,生命值上限为八。 二.HTML内容 index.html里包含canvas画布和一个 介绍游戏规则的div, 当鼠标点击页面任何一个地方的时候,进入游戏界面: index 浏览器不支持canvas 1.Click space to pause or begin game. 2.
lonelydawn
2018/02/09
1.2K0
PhiloGL学习(6)——深情奉献:快乐的一家
 前言 话说上一篇文章结尾讲到这一篇要做一个地球自转以及月球公转的三维动画,提笔,不对,是提键盘开始写的时候脑海中突然出现了几年前春晚风靡的那首歌:蒙古族小丫头唱的快乐的一家。闲言莫提,进入正题。  一、 原理分析 场景涉及两个对象,一个是地球、一个是月球,当然这基本是废话,不过还可以再添加一个对象,月球的公转轨迹。地球和月球都可以用一个球来模拟(Sphere),稍微困难的是公转轨迹,公转轨迹是一个圆,PhiloGL貌似没有直接提供圆的封装,但是有画线段的API,细细想来,什么是圆?祖冲之早就告诉我们了,所
魏守峰
2018/04/28
8400
PhiloGL学习(6)——深情奉献:快乐的一家
ECharts 3D 饼图近似实现
忘了从哪里看到的了,有人问如何做一个 3D 饼图?当时翻了半天 ECharts-GL 配置项,但始终没有找到思路。
ZXand618
2022/04/10
2.5K0
ECharts 3D 饼图近似实现
可视化导学-相关数学知识
HTML 采用的是窗口坐标系,以参考对象(参考对象通常是最接近图形元素的 position 非 static 的元素)的元素盒子左上角为坐标原点,x 轴向右,y 轴向下,坐标值对应像素值。
Cellinlab
2023/05/17
6200
可视化导学-相关数学知识
HTML5 Canvas开发详解(实战一)
针对 HTML5 Canvas开发详解(基础一)的基础知识,写了一些实战案例,本节的案例代码是写在vue搭建的项目中的,引用了element-ui的按钮组件,如果大家要运行本节代码,以组件的形式引到自有vue项目的某个父组件即可。
爱学习的程序媛
2022/04/07
8680
推荐阅读
相关推荐
前端如何呼风唤雨
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验