YaoGan.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import EventName from "../EventName/EventName";
  2. const { ccclass, property } = cc._decorator;
  3. @ccclass
  4. export default class YaoGan extends cc.Component {
  5. @property(cc.Node)
  6. bg: cc.Node = null;//摇杆背景
  7. @property(cc.Node)
  8. joystick: cc.Node = null;//摇杆 也就是中心点
  9. @property(cc.Node)
  10. parent: cc.Node = null;//摇杆和背景的父节点
  11. max_R: number = 92//25;//摇杆移动的最大半径
  12. @property
  13. is_rotation: boolean = true;//角色是否根据摇杆的方向旋转
  14. @property
  15. is_forbidden: boolean = false;//是否禁用摇杆
  16. CurrentDir: cc.Vec2 = null
  17. CurrentPower: number = null
  18. onLoad() {
  19. //绑定事件
  20. //因为摇杆很小,如果给摇杆绑定事件玩家将很难控制,摇杆的背景比较大,所以把事件都绑定在背景上是不错的选择
  21. this.node.on(cc.Node.EventType.TOUCH_MOVE, this.move, this);//当手指在背景上移动时触发move事件
  22. this.node.on(cc.Node.EventType.TOUCH_END, this.finish, this);//当手指在目标节点区域内离开屏幕时触发finish事件
  23. this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.finish, this);//当手指在目标节点区域外离开屏幕时触发finish事件
  24. // this.scheduleOnce(() => {
  25. // cc.Camera.main.node.on(cc.Node.EventType.TOUCH_START, this.CameraMove, this);//当手指在背景上移动时触发move事件
  26. // cc.Camera.main.node.on(cc.Node.EventType.TOUCH_MOVE, this.CameraMove, this);//当手指在背景上移动时触发move事件
  27. // cc.Camera.main.node.on(cc.Node.EventType.TOUCH_END, this.CameraEnd, this);//当手指在背景上移动时触发move事件
  28. // cc.Camera.main.node.on(cc.Node.EventType.TOUCH_CANCEL, this.CameraEnd, this);//当手指在背景上移动时触发move事件
  29. // }, 0.2)
  30. setTimeout(() => {
  31. cc.Camera.main.node.on(cc.Node.EventType.TOUCH_START, this.CameraMove, this);//当手指在背景上移动时触发move事件
  32. }, 200);
  33. }
  34. update(dt: number): void {
  35. // let pp = cc.Camera.main.getScreenToWorldPoint(this.posss)
  36. // let pp1 = this.node.parent.convertToNodeSpaceAR(pp)
  37. // this.node.setPosition(pp1)
  38. }
  39. CameraEnd(event: cc.Event.EventTouch) {
  40. // this.node.active = false
  41. }
  42. posss: cc.Vec2
  43. CameraMove(event: cc.Event.EventTouch) {
  44. const pos = event.getLocation()
  45. let pp = cc.Camera.main.getScreenToWorldPoint(pos)
  46. let pp1 = this.node.parent.convertToNodeSpaceAR(pp)
  47. this.node.setPosition(pp1)
  48. this.node.opacity = 255
  49. }
  50. move(event: cc.Event.EventTouch) {//负责移动摇杆 手指移动时调用
  51. console.log('2');
  52. if (this.is_forbidden == false) {//如果没有禁用摇杆
  53. // event.stopPropagation()
  54. let Camera = cc.Camera.main.node.position
  55. let pos = cc.v2(event.getLocationX() + Camera.x, event.getLocationY() + Camera.y);//获取触点的坐标
  56. let pos_0 = this.parent.convertToNodeSpaceAR(pos);//将一个点转换到节点 (局部) 空间坐标系,这个坐标系以锚点为原点。
  57. if (pos_0.mag() < this.max_R) {//如果触点长度小于我们规定好的最大半径
  58. this.joystick.x = pos_0.x;//摇杆的坐标为触点坐标
  59. this.joystick.y = pos_0.y;
  60. } else {//如果不
  61. let pos = pos_0.normalizeSelf();//将触点归一化
  62. // console.log('pos', pos.x, pos.y)
  63. let x = pos.x * this.max_R;//归一化的触点坐标 × 最大半径
  64. let y = pos.y * this.max_R;
  65. this.joystick.x = x;//给摇杆坐标赋值
  66. this.joystick.y = y;
  67. }
  68. this.CurrentDir = pos_0.normalizeSelf()
  69. this.CurrentPower = (cc.v2(this.joystick.x, this.joystick.y).mag() / this.max_R)
  70. cc.systemEvent.emit(EventName.YaoGanMove, this.CurrentDir, this.CurrentPower);
  71. }
  72. }
  73. finish() {//摇杆弹回原位置
  74. cc.systemEvent.emit(EventName.YaoGanEnd, this.CurrentDir, this.CurrentPower);
  75. //摇杆坐标和移动向量都为(0,0)
  76. this.joystick.position = cc.v3(0, 0);
  77. this.node.opacity = 0
  78. // this.node.setPosition(999, 0)
  79. }
  80. }
  81. //////////////////////////////