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++;
        }
    }
    

  • 相关阅读:
    使用selenium操作ant design前端的页面,感觉页面没加载完
    centos7上PhantomJS 过期之后改用Chrome时填的坑
    《追风行动》有点儿意思
    《听读书怪才解读24部名人传记》笔记
    mysql 8.0 密码加密方式的坑
    huginn website agent对提取结果排序
    Server酱微信推送中的问题
    Huginn定时时间不准确或延后问题
    一本通1219 马走日
    矩阵快速幂
  • 原文地址:https://www.cnblogs.com/rustfisher/p/14233318.html
Copyright © 2011-2022 走看看