cocos拖拽物体不同实现方式研究

第一种方式:

    onElMove(event:EventTouch){
        console.info("onMove");
        this.e1.setWorldPosition(event.getUILocation().x,event.getUILocation().y,0);
    }

这种方式有缺陷,因为当手指落下时,点击的位置不是Node的中心位置时,移动前会出现一个跳跃的行为,这种使得操作不连贯,效果很不好。

第二种方式: 通过偏移量(getUIDelta)来决定Node的位置,这种才是最好的方式 。

cc.Class({
    extends: cc.Component,
 
    start() {
        // 获取DragonBones实例
        this.dragonBonesNode = this.getComponent(cc.DragonBonesComponent);
        // 获取节点的collider组件
        this.collider = this.node.getComponent(cc.Collider);
        // 如果没有collider组件,则添加一个box collider
        if (!this.collider) {
            this.collider = this.node.addComponent(cc.BoxCollider);
        }
        // 注册触摸事件
        this.node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);
        this.node.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
        this.node.on(cc.Node.EventT
### 实现 Cocos物体拖拽的方法 在 Cocos Creator 中,实现物体拖拽功能主要依赖于触摸事件和鼠标事件。通过监听 `Node.EventType.TOUCH_MOVE` 或 `Node.EventType.MOUSE_MOVE` 事件,并在回调函数中更新节点的位置,可以实现拖拽效果。以下是一些常见的实现方式。 #### 使用 `TOUCH_MOVE` 事件实现拖拽 可以通过监听 `TOUCH_MOVE` 事件,获取触摸点的坐标,并将节点的位置设置为该坐标,从而实现拖拽。例如: ```typescript onLoad() { this.node.on(Node.EventType.TOUCH_MOVE, (event: EventTouch) => { const location = event.getUILocation(); this.node.setWorldPosition(location.x, location.y, 0); }); } ``` 这种方式适用于 2D 场景中的拖拽操作,直接使用触摸点的屏幕坐标更新节点位置 [^1]。 #### 使用 `getDelta()` 方法实现拖拽 另一种实现方式是通过 `getDelta()` 方法获取触摸移动的偏移量,并根据偏移量更新节点的位置。这种方式可以更精确地控制拖拽的移动量,适用于需要平滑拖动的场景: ```typescript onLoad() { this.node.on(Node.EventType.TOUCH_MOVE, (event: EventTouch) => { this.opacity = 100; // 拖动时设置透明度 const delta = event.touch.getDelta(); this.node.setPosition(this.node.position.x + delta.x, this.node.position.y + delta.y); }); this.node.on(Node.EventType.TOUCH_END, () => { this.opacity = 255; // 拖动结束时恢复透明度 }); } ``` 这种实现方式增加了视觉反馈效果,提升了用户体验 [^2]。 #### 结合射线检测实现 3D 拖拽 在 3D 场景中,可以通过射线检测来判断触摸点是否与场景中的对象发生交互,并更新拖拽对象的位置。例如: ```typescript onTouchMove(event: EventTouch) { const touchPos = event.getLocation(); const ray = this.mainCamera.screenPointToRay(touchPos.x, touchPos.y); if (PhysicsSystem.instance.raycastClosest(ray)) { const res = PhysicsSystem.instance.raycastClosestResult; this.dragNode.setPosition(res.hitPoint.x, 1, res.hitPoint.z); } } ``` 此方法通过射线检测获取点击位置,并将拖拽对象移动到该位置,适用于 3D 场景中的拖拽交互 [^3]。 #### 直接设置世界坐标实现拖拽 还可以直接使用 `setWorldPosition` 方法,将节点的位置设置为触摸点的世界坐标: ```typescript onElMove(event: EventTouch) { this.e1.setWorldPosition(event.getUILocation().x, event.getUILocation().y, 0); } ``` 这种方式简单直接,适合快速实现拖拽功能 [^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值