版本:2.3.4

参考:

【持续更新】Cocos Creator源码分享——针对游戏中的各种功能

在cocos论坛找了一篇虚拟摇杆的制作文章。但是实际使用还要考虑多一些。这里在原来代码基础上做了一些改动。

1. 监听事件不使用字符串。例如"touchstart",使用cc.Node.EventType.TOUCH_START。因为使用字符串容易拼错。

2. 增加触摸响应区域。因为常规游戏中,虚拟摇杆可响应范围不仅仅是虚拟摇杆图片范围,而是一个可根据策划需求调整的范围,例如今天500x400,明天觉得600x400,只需要修改代码,不需要重新制作图片了。

3. 防止多点触摸。增加了touchID的判断,防止多个手指触摸导致的问题。例如一个手指在操作摇杆,另一个手指不小心在触摸区域点击了一下,导致触发了touch_end,使摇杆失效。

4. 增加了小圆移动范围设置。原来文章用大圆图片的高宽限制小圆的移动范围。但是大圆图片可能有透明区域,所以这里小圆的移动范围在代码里手动设置。

5.增加了摇杆是否正在移动的标志位。因为摇杆没有在使用的时候,不需要去执行角色的移动计算。所以增加了moving来表示摇杆是否在运作中,减少摇杆空闲时对角色移动的计算量。

6.增加了角度(弧度)计算。因为可能根据摇杆的角度,进行一些操作。例如人物如果是八方向或四方向,需要根据角度转向。如果不需要,可以自行屏蔽角度的代码。

7.增加了enable开关。在虚拟摇杆没有操作的时候,不需要执行update,较少计算量。

UI如下图,为了方便area用绿色显示,实际使用去掉就行了。

虚拟摇杆代码

// Learn TypeScript:
//  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.htmlconst {ccclass, property} = cc._decorator;@ccclass
export default class JoyStick extends cc.Component {@property(cc.Node)panel:cc.Node = null;   //大圆@property(cc.Node)btn:cc.Node = null;     //小圆@property(cc.Integer)private panelWidth:number = 130;    //去掉透明区域的大圆宽度private panelInitPos:cc.Vec2; //大圆初始位置private touchID:number;    //触摸IDpublic dir:cc.Vec3 = new cc.Vec3(0,0,0);  //移动方向public angle:number = 0;   //弧度(角度)public moving:boolean = false; //是否正在移动onLoad(){this.panelInitPos =  new cc.Vec2(this.panel.x, this.panel.y);}start () {this.node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);this.node.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);this.node.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);}public stop(){this.node.off(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);this.node.off(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);this.node.off(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);this.node.off(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);this.moving = false;this.enabled = false;}private onTouchStart(e:cc.Touch){console.log("start");//触摸点世界坐标转成局部坐标let pos = this.node.convertToNodeSpaceAR(e.getLocation());this.panel.setPosition(pos);this.btn.setPosition(0,0);this.touchID = e.getID();this.moving = false;this.enabled = true;}private onTouchMove(e:cc.Touch){console.log("move");if(this.touchID != e.getID()){return;}//小圆移动let posDelta = e.getDelta();this.btn.x += posDelta.x;this.btn.y += posDelta.y;//正在移动this.moving = true;}update(){console.log("update");if(this.moving){//将小圆限制大圆范围内let ratio = this.btn.position.mag() / this.panelWidth;if (ratio > 1) {this.btn.setPosition(this.btn.position.div(ratio));}//获取向量归一化this.dir = this.btn.position.normalizeSelf();//获取弧度this.angle = Math.atan2(this.btn.y, this.btn.x);}}private onTouchEnd(e:cc.Touch){console.log("end");if(this.touchID != e.getID()){return;}this.panel.setPosition(this.panelInitPos);this.btn.setPosition(0,0);this.moving = false;this.enabled = false;}private onTouchCancel(e:cc.Touch){console.log("cancel");if(this.touchID != e.getID()){return;}this.panel.setPosition(this.panelInitPos);this.btn.setPosition(0,0);this.moving = false;this.enabled = false;}onDestroy(){this.stop();}}

  

实际操作

@ccclass
export default class Helloworld extends cc.Component {//虚拟摇杆Area@property(cc.Node)joyStickArea:cc.Node = null;//虚拟摇杆代码joyStick:JoyStick;//角色@property(cc.Node)role:cc.Node = null;//速度speed:cc.Vec2 = new cc.Vec2(5,5);onLoad(){this.joyStick = this.joyStickArea.getComponent(JoyStick);}start() {}update(){if(this.joyStick.moving){//根据角度移动// this.role.x += Math.cos(this.joyStick.angle)*this.speed.x;// this.role.y += Math.sin(this.joyStick.angle)*this.speed.y;//根据向量移动this.role.x += this.joyStick.dir.x*this.speed.x;this.role.y += this.joyStick.dir.y*this.speed.y;}}
}

  

演示效果

Cocos Creator 虚拟摇杆相关推荐

  1. Cocos 2d-js 虚拟摇杆

    虚拟摇杆是在手机格斗游戏中经常看到的一个东西,用来控制人物的8个方向的行走,今天就来了解一下如何在cocos2d-js实现一个虚拟摇杆... // 虚拟摇杆类型 var ROCKER_TYPE = R ...

  2. 《Cocos Creator游戏实战》虚拟摇杆实现

    虚拟摇杆实现 摇杆布局实现 摇杆功能实现 用摇杆控制主角 该功能已收录在Many Widgets插件中,使用Cocos Creator 3.x版本的小伙伴可以用该插件快速生成摇杆. 插件地址:http ...

  3. Cocos Creator发布H5游戏,做项目构建流程定制

    游戏实现 主要介绍游戏玩法,具体实现,参考游戏源码.玩法是:游戏开始后,通过虚拟摇杆控制猴子在屏幕左右方向跳动,屏幕上随机出现香蕉,过一段时间后消失,猴子吃到香蕉得分,如果等到香蕉消失时,猴子仍旧没吃 ...

  4. 《Cocos Creator游戏实战》贪吃蛇平滑移动

    贪吃蛇平滑移动 贪吃蛇平滑移动 初始化蛇头和蛇身 调整蛇头方向 贪吃蛇移动 蛇头和蛇身的节点顺序 添加食物 添加碰撞逻辑代码 从pointsArray中剔除无用的坐标点(更新) 在本教程中我们重点来学 ...

  5. 022 - cocos creator 3D

    #cocos creator 3D warning 报错:"project:///assets/main.js,将https中的export注视掉重试一遍 知识点 scrollview组件添 ...

  6. Cocos Creator游戏开发教程 学习笔记

    学完提问几个问题吧: position的锚点位置数值原点在哪里? 因为position是相对坐标,所以原点是父节点的锚点 .所以Canvas下面的直属节点原点就是世界坐标系的原点Canvas的锚点. ...

  7. cocos creator开发微信小游戏(五)贪吃蛇大作战

    目录 小游戏介绍 小游戏cocos creator场景图 小游戏部分JS代码 开发中碰到的问题 工程及说明 小游戏介绍 贪吃蛇小游戏:贪吃蛇试玩(首次加载比较慢),类似贪吃蛇大作战的小游戏.当玩家的蛇 ...

  8. Cocos Creator 写的小游戏

    # 超能陆战队 注:美术资源来源于网络 作者: 是烧麦啊 未生畏死 游戏类型:动作类 * 所用到的 IDE : Cocos Creator v2.0.10,主要用于视觉还原.主逻辑开发.跨端调试和编译 ...

  9. Cocos Creator 一步一步实现重力球游戏

    「获取源码」 点击上方蓝字关注公众号「游戏开发小白变怪兽」,回复「重力球」获取源码及美术资源. 「游戏玩法」 通过手机陀螺仪,调整手机,让球从上一层的间隔中落到下一层,楼层会不断上涨,如果球碰到上方或 ...

  10. Cocos Creator源码和教程分享

    由于受论坛修改时间限制,后续不能修改的情况下,开新帖分享新源码和教程. https://forum.cocos.com/t/cocoscreator/80131 https://forum.cocos ...

最新文章

  1. Python学习(13)函数
  2. 这些git技能够你用一年了
  3. java json格式的转换和读取
  4. 最新完整版PHP配置文件翻译
  5. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第24篇]描述一个二进制m组的滑动窗口指数算法
  6. C 实现 删除字符串空白符的函数 strtrim
  7. java中大量匿名内部类的坏处_java中的匿名内部类总结
  8. HttpClient库设置超时
  9. 安装配置gitlab
  10. 十个问题理解Linux epoll工作原理:惊群,
  11. 今日恐慌与贪婪指数为78 贪婪程度有所上升
  12. app营销实训报告_第七届全国金融与证券投资模拟实训大赛圆满落幕!
  13. 安卓系统校园招聘平台APP答辩PPT免费下载
  14. Linux rm , cp, mv 命令
  15. Freeswitch视频会议远超Telepresence
  16. mybatis简明教程
  17. 用友T6固定资产模块处理菜单中的项目会突然消失
  18. 输出100以内奇数和、偶数和(for和while两种)
  19. NetApp存储方案及巡检命令
  20. 第七届山东理工大学ACM趣味编程循环赛 Round#2 sdut4120 城堡问题

热门文章

  1. docker修改mysql配置文件
  2. SWAT模型学习(二)
  3. Windows系统字体和系统应用字体
  4. 线性代数中(线代中)的克莱姆法则,又译克拉默法则(Cramer‘s Rule)
  5. CIM即时通讯源码初步解析(一款个人推荐的带集群的开源项目)
  6. linux安装文泉驿字体,centos 安装文泉驿字体相关教程
  7. QFIL进入900E或90DB模式,download fail
  8. 乐高机器人linux,如何搭建自己的乐高机器人编程环境
  9. 【老生谈算法】matlab实现拉普拉斯变换及其逆变换算法源码——拉普拉斯变换
  10. JAVA 疯狂讲义 学习笔记