zoukankan      html  css  js  c++  java
  • 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++;
        }
    }
    

  • 相关阅读:
    linux_ext4恢复超级块.txt
    bayaim_Centos7.6_mysql源码5.7-多my.cnf_20190424.txt
    bayaim_Centos7.6_mysql源码5.7-multi_20190424.txt
    zhy2_rehat6_mysql04
    zhy2_rehat6_mysql03
    Neo4j安装,入门到深入了解完整教程
    程序员千万不要裸辞,对你没有任何好处
    减薪是变相的裁员所以我还是走吧
    python正则表达式匹配中文日期时间
    python用正则表达式匹配字符串里的日期
  • 原文地址:https://www.cnblogs.com/rustfisher/p/14233318.html
Copyright © 2011-2022 走看看