cocos creator3.x 触控方向键实现

import { CCFloat, Component, Enum, error, EventTouch, macro, Node, UIOpacity, UITransform, Vec2, Vec3, _decorator } from "cc";

const { ccclass, property } = _decorator;
//全局触摸控制
export let GameEvent=0;
//滑动方向
export let Dir=new Vec2(0,0);
//滑动角度
export let Angle=270;
//角度方向
export let RoleDirection=4;
//触控检测
export let CheckTouch=false;
/** 摇杆 */
@ccclass("Joystick")
export class Joystick extends Component {

    //外图节点
    @property(Node)              
    RockerOut:Node
     //内图节点
    @property(Node)              
    RockerIn:Node
    //最大滑动半径
    Max_r= 50;
    //角色方向
    RoleAngle = Enum({
        Up : 0,
        LeftUp : 1,
        Left : 2,
        LeftDown : 3,
        Down : 4,
        RightDown : 5,
        Right : 6,
        RightUp : 7
    });
    onLoad() {
        let RockerInSize=this.Max_r;
        let RockerOutSize=this.Max_r*2;
        console.log(RockerInSize);
        this.RockerIn.getComponent(UITransform).setContentSize(RockerInSize,RockerInSize);
        this.RockerOut.getComponent(UITransform).setContentSize(RockerOutSize,RockerOutSize);
    
        //开始触摸
        this.RockerOut.on(Node.EventType.TOUCH_START,function(e){
            if(GameEvent == 0){
            var w_pos = e.getUILocation();
            var pos = this.node.getComponent(UITransform).convertToNodeSpaceAR(new Vec3(w_pos.x, w_pos.y, 0))
            var len = pos.length();
            if(len>0){
                CheckTouch=true;
            }
            Dir.x = pos.x / len;
            Dir.y = pos.y / len;
            this.checkAngle();
            if(len > this.Max_r){
                    pos.x = this.Max_r * pos.x / len;
                    pos.y = this.Max_r * pos.y / len;
            }
            this.RockerIn.setPosition(pos);
        }},this);
         //触摸中
        this.RockerOut.on(Node.EventType.TOUCH_MOVE,function(e){
            if(GameEvent == 0){
           var w_pos = e.getUILocation();
           var pos = this.RockerOut.getComponent(UITransform).convertToNodeSpaceAR(new Vec3(w_pos.x, w_pos.y, 0))
           var len = pos.length();
           if(len>0){
            CheckTouch=true;
           }
           Dir.x = pos.x / len;
           Dir.y = pos.y / len;
           this.checkAngle();
           if(len > this.Max_r){
                pos.x = this.Max_r * pos.x / len;
                pos.y = this.Max_r * pos.y / len;
           }
           this.RockerIn.setPosition(pos);
        }},this);
        //触摸结束
        this.RockerOut.on(Node.EventType.TOUCH_END,function(e){
           CheckTouch=false;
           this.RockerIn.setPosition(0,0);
 		   Dir = new Vec2(0,0);
           this.checkAngle();
        },this);
        //触摸取消
        this.RockerOut.on(Node.EventType.TOUCH_CANCEL,function(e){
            CheckTouch=false;
            this.RockerIn.setPosition(0,0);
 			Dir = new Vec2(0,0);
            this.checkAngle();
        },this);
    }
    checkAngle(){
        //根据朝向计算出夹角弧度
        var angle = Dir.signAngle(new Vec2(1,0));
        //将弧度转换为欧拉角
        var degree = angle / Math.PI * 180;
        //获取角度
        Angle = -degree
        //右侧
        if(0<=Angle&&Angle<=22.5||Angle<=0&&Angle>=-22.5){
            RoleDirection=this.RoleAngle.Right
        }
        //右上
        if(22.5<Angle&&Angle<=67.5){
            RoleDirection=this.RoleAngle.RightUp
        }
        //上
        if(67.5<Angle&&Angle<=112.5){
            RoleDirection=this.RoleAngle.Up
        }
        //左上
        if(112.5<Angle&&Angle<=167.5){
            RoleDirection=this.RoleAngle.LeftUp
        }
        //左
        if(167.5<Angle&&Angle<=180||-180<Angle&&Angle<=-167.5){
            RoleDirection=this.RoleAngle.Left
        }
        //左下
        if(-167.5<Angle&&Angle<=-112.5){
            RoleDirection=this.RoleAngle.LeftDown
        }
        //下
        if(-112.5<Angle&&Angle<=-90){
            RoleDirection=this.RoleAngle.Down
        }
        //右下
        if(-90<Angle&&Angle<=-22.5){
            RoleDirection=this.RoleAngle.RightDown
        }
        console.log(RoleDirection);
    }

}

 RockerOut 背景的精灵节点

RockerInt 内控制精灵节点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值