cocosCreator中的碰撞检测和触摸事件

Posted chzh999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocosCreator中的碰撞检测和触摸事件相关的知识,希望对你有一定的参考价值。

const { ccclass, property } = cc._decorator;
@ccclass
export default class BallClass extends cc.Component {
    @property
    text: string = ‘Ball‘;

    @property(cc.Node)
    Ball: cc.Node = null;

    @property
    weight: number = null;

    /** 物体的默认排序 */
    @property
    partIndex: number = null;

    /** 目标节点 */
    // @property(cc.Node)
    // aimParentNode: cc.Node = null;

    @property(cc.Component)
    game: any = null;

    onLoad() {

    }

    start() {

    }

    init(game: cc.Component) {
        this.game = game;
        this.registerEvent(this.node);
    }

    registerEvent(ballNode: cc.Node) {
        ballNode.on(cc.Node.EventType.TOUCH_START, this.touchStart, this);
        ballNode.on(cc.Node.EventType.TOUCH_MOVE, this.touchMove, this);
        ballNode.on(cc.Node.EventType.TOUCH_END, this.touchEnd, this);
    }

    unRegisterEvent(ballNode: cc.Node) {
        ballNode.off(cc.Node.EventType.TOUCH_START, this.touchStart, this);
        ballNode.off(cc.Node.EventType.TOUCH_MOVE, this.touchMove, this);
        ballNode.off(cc.Node.EventType.TOUCH_END, this.touchEnd, this);
    }

    touchStart(event) {
        console.log(‘--触摸--start‘);
        if (!this.game.cheakRunning()) {
            return;
        }
        // let sp = this.getComponent(cc.Sprite);
        // console.log(‘sp.node:‘, sp.node)

        let Part = this.node.parent.getChildByName(‘Part‘);
        Part.opacity = 255;
        let target = event.target;
        target.scale = 1.5;
        target.zIndex = 1;
    }

    touchMove(event: cc.Event.EventTouch) {
        console.log(‘--触摸--move‘);
        if (!this.game.cheakRunning()) {
            return;
        }
        var posX = event.touch.getLocationX() - 640;
        var posY = event.touch.getLocationY() - 360;
        let target = event.target;
        let delta = event.touch.getDelta();
        target.x += delta.x;
        target.y += delta.y;
        target.rotation = 0;
        target.zIndex = 1;
    }

    touchEnd(event) {
        console.log(‘--触摸--end‘, this);
        if (false && !this.game.cheakRunning()) {
            // 回归原位
            console.log(‘---没时间了--‘);

            this.backToOriginal(event.target);
            return;
        }
        console.log(‘end-pos‘, event);
        this.checkCollection(event.target);
    }

    checkCollection(ballNode: cc.Node) {
        console.log(‘--检测碰撞--‘, ballNode);
        console.log(‘--世界坐标系--‘, ballNode.convertToWorldSpace(ballNode.getPosition()))
        let target: cc.Node = ballNode;
        let targetParent = target.parent;
        let x = target.x + targetParent.x + targetParent.parent.x;
        let y = target.y + targetParent.y + targetParent.parent.y;

        let ball = target.getComponent(‘Ball‘);
        console.log(ball);
        let aimNode = this.game.coacheList[ball.weight];

        let aimX = aimNode.x + aimNode.parent.x + aimNode.parent.parent.x;
        let aimY = aimNode.y + aimNode.parent.y + aimNode.parent.parent.y;
        let distance = Math.sqrt((x - aimX) * (x - aimX) + (y - aimY) * (y - aimY))

        console.log({ aimX, aimY, targetX: target.x, targetY: target.y, distance, x, y })

        if (distance < (target.height + ballNode.height) / 2) {
            if (!target.isChildOf(aimNode)) {
                target.parent = aimNode;
                target.position = cc.v2(0, -10);
                target.scale = 1;
                target.zIndex = 1;
                this.unRegisterEvent(target);
                this.game.addScore();
            }
        } else {
            this.backToOriginal(ballNode);
        }

    }

    /**
     * 回到原来的位置
     * @param ballNode 
     */
    backToOriginal(ballNode: cc.Node) {
        let ball: BallClass = ballNode.getComponent(‘Ball‘);
        let moveTo = cc.moveTo(0.3, cc.v2(0, 0));    // 此处默认0点位置
        let callFunc = cc.callFunc(() => {
            let Part = ballNode.parent.getChildByName(‘Part‘);
            Part.opacity = 0;
        });
        let sequence = cc.sequence(moveTo, callFunc);
        ballNode.runAction(sequence);
        ballNode.scale = 1;
        ballNode.zIndex = 1;


    }

    // update (dt) {}
}

 

以上是关于cocosCreator中的碰撞检测和触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d-x ios游戏开发初认识 触摸事件与碰撞检測

是否在所有设备中都通过点击事件检测到触摸设备中的触摸?

动力学js中的碰撞检测+鼠标事件

UE4 C++:事件绑定(输入碰撞检测定时器)

在带有触摸屏的 Windows 8 上检测 Chrome 中的触摸事件

检查一个触摸点是不是在 Unity 中的盒子碰撞器内