• Cocos Creator 拖动去指定区域


    我们要实现的效果是,按住并拖动一个小物体,物体跟随手指(鼠标)移动。
    拖到指定位置放下。如果没有到指定位置,则回到上一个位置。

    新建脚本DragToTarget.ts,挂到预制体上。

    const { ccclass, property } = cc._decorator;
    @ccclass
    export default class DragToTarget extends cc.Component {
    
        @property(cc.Label)
        nameLabel: cc.Label = null;
    
        @property(cc.Node)
        targetOfDragList: cc.Node[] = [];
    
        _oldPos = null; // 上一个位置
    
        start() {
            this._oldPos = this.node.position;
        }
    
        onEnable() {
            this.node.on(cc.Node.EventType.TOUCH_MOVE, this._onTouchMove, this);
            this.node.on(cc.Node.EventType.TOUCH_END, this._onTouchEnd, this);
        }
    
        onDisable() {
            this.node.off(cc.Node.EventType.TOUCH_MOVE, this._onTouchMove, this);
            this.node.off(cc.Node.EventType.TOUCH_END, this._onTouchEnd, this);
        }
    
        // update (dt) {}
    
        _onTouchMove(touchEvent) {
            let location = touchEvent.getLocation();
            this.node.position = this.node.parent.convertToNodeSpaceAR(location); // 确定位置
        }
    
        _onTouchEnd(touchEvent) {
            if (this.targetOfDragList.length === 0) {
                return; // 没有目标位置
            }
            let inTarget = false;
            for (const targetNode of this.targetOfDragList) {
                if (this._withinTarget(targetNode, touchEvent)) {
                    inTarget = true;
                    break;
                }
            }
            if (!inTarget) {
                this.node.position = this._oldPos; // 回去
            }
        }
    
        // 判断触摸事件是否在槽位里
        _withinTarget(targetNode: cc.Node, touchEvent) {
            let rect = targetNode.getBoundingBox();
            let location = touchEvent.getLocation();
            let point = targetNode.parent.convertToNodeSpaceAR(location);
            return rect.contains(point);
        }
    }
    

    思路与之前的拖动类似。
    在最后TOUCH_END的时候,判断自己是否在目标区域内。
    如果不在则返回上一个坐标。

    在场景中使用

    import DragToTarget from "./DragToTarget";
    
    const { ccclass, property } = cc._decorator;
    
    @ccclass
    export default class DragToControl extends cc.Component {
    
        @property(cc.Prefab)
        drag_to_item: cc.Prefab = null;
    
        @property(cc.Node)
        dragTargets: cc.Node[] = [];
    
        itemNum = 1;
    
        start() {
            this.createItem();
        }
    
        // update (dt) {}
    
        createItem() {
            let d = cc.instantiate(this.drag_to_item);
            this.node.addChild(d);
            let dragTo = d.getComponent(DragToTarget);
            dragTo.targetOfDragList = this.dragTargets; // 设置目的地
            dragTo.nameLabel.string = '' + this.itemNum++;
        }
    }
    

  • 相关阅读:
    1.NopCommerce下载与安装
    DLT(Direct Linear Transform)算法
    向量叉乘与叉乘矩阵
    最小二乘与最大似然估计之间的关系
    最小二乘法
    Levenberg-Marquardt迭代(LM算法)-改进Guass-Newton法
    Newton法(牛顿法 Newton Method)
    自己所有博客汇总
    Unity 预制体烘焙光影丢失,Unity2018 预制嵌套
    XmlException: Text node canot appear in this state
  • 原文地址:https://www.cnblogs.com/rustfisher/p/14233318.html
Copyright © 2020-2023  润新知