五 CocosEditor基础教程第二季 之矩形碰撞检测

本文是CocosEditor基础教程的第二部分,主要介绍如何进行矩形碰撞检测。通过实例演示了四种不同精度的碰撞检测方法:1)使用getBoundingBox的基础碰撞;2)通过rectCreate实现更精确的碰撞;3)扩大碰撞区域的应用;4)基于两点距离的中心点碰撞检测。提供了一个雪球射击小怪物的游戏示例,代码可在GitHub下载。
摘要由CSDN通过智能技术生成

前言:

这一节主要讲解矩形碰撞,在碰撞要求不是很严格的时候,简单的矩形碰撞可以帮助我们;

游戏规则很简单,雪球一直射击中,小怪物躲避就行;



效果图


代码下载

https://github.com/makeapp/cocoseditor-samples (snow-collision



代码分析

1 更新函数里面,隔二秒产生一个新的雪球以及雪球函数newSnowBall();

MainLayer.prototype.onUpdate = function (dt) {
    this.currentTime += dt;
   

    if (this.currentTime - this.lastSnowBall > 2) {
        this.newSnowBall();
        this.lastSnowBall = this.currentTime;
    }


根据怪物的位置设置雪球射击速度方向speedX和speedY,射击时间newTime;
MainLayer.prototype.newSnowBall = function () {
    var snowBall = cc.Sprite.createWithSpriteFrameName("m_snowball_roll_2.png");
    snowBall.setPosition(cc.p(360, 200));
    snowBall.setZOrder(100);
    snowBall.setAnchorPoint(cc.p(0.5, 0.5));
    snowBall.setTag(-100);
    snowBall.newTime = this.currentTime;
    snowBall.speedX = (this.monster.getPosition().x - snowBall.getPosition().x) / 8;
    snowBall.speedY = (this.monster.getPosition().y - snowBall.getPosition().y) / 8;
    this.rootNode.addChild(snowBall);
}

2 从根节点找到雪球children,然后检测碰撞

下面有四种:可以把代码注释,分别查看四种不同的效果

1 碰撞一 普通,直接通过getBoundingBox函数获取精灵矩形,这种不是很精准

2  //碰撞二 通过rectCreate函数缩小矩形范围  达到更精准;

3  //碰撞三 扩大碰撞区域  200dp就发生了碰撞,这个在一些游戏需要把某个区域的怪物都杀死的时候可以应用,比如发射了炸弹,方圆500px都要消除

4 //碰撞四 两个精灵中心距离小于40时 这个是高中数学知识,两点距离

  for (var i = 0; i < this.rootNode.getChildrenCount(); i++) {
        var child = this.rootNode.getChildren()[i];
        if (child.getTag() == -100) {
            //  cc.log("ball");
            var monsterX = this.monster.getPosition().x;
            var monsterY = this.monster.getPosition().y;
            var childX = child.getPositionX();
            var childY = child.getPositionY();

            /*var followX = childX + (this.currentTime - child.newTime) * (monsterX - childX) / 5;
             var followY = childY + (this.currentTime - child.newTime) * (monsterY - childY) / 5;*/

            var followX = childX + (this.currentTime - child.newTime) * child.speedX;
            var followY = childY + (this.currentTime - child.newTime) * child.speedY;

            child.setPosition(cc.p(followX, followY));
            if (child && child.getPositionY() > 1500) {
                child.removeFromParent(true);
                continue;
            }

            //碰撞一 普通
            /*if (cc.rectIntersectsRect(child.getBoundingBox(), this.monster.getBoundingBox())) {
             this.createParticle("around", monsterX, monsterY);
             cc.AudioEngine.getInstance().playEffect("res/sounds/bomb.mp3", false);
             child.removeFromParent(true);
             }*/

            //碰撞二 缩小矩形范围  更精准;
            /*if (cc.rectIntersectsRect(cc.rectCreate(child.getPosition(), [10, 10]), cc.rectCreate(this.monster.getPosition(), [20, 20]))) {
             this.createParticle("around", monsterX, monsterY);
             cc.AudioEngine.getInstance().playEffect("res/sounds/bomb.mp3", false);
             child.removeFromParent(true);
             }*/

            //碰撞三 扩大碰撞区域 200dp就发生了碰撞
            /*if (cc.rectIntersectsRect(cc.rectCreate(child.getPosition(), [10, 10]), cc.rectCreate(this.monster.getPosition(), [200, 200]))) {
                this.createParticle("around", monsterX, monsterY);
                cc.AudioEngine.getInstance().playEffect("res/sounds/bomb.mp3", false);
                child.removeFromParent(true);
            }*/

            //碰撞四 两个精灵中心距离小于40时
            var distance = cc.pDistance(child.getPosition(), this.monster.getPosition());
            if (distance < 40) {
                this.createParticle("around", monsterX, monsterY);
                cc.AudioEngine.getInstance().playEffect("res/sounds/bomb.mp3", false);
                child.removeFromParent(true);
            }

        }
    }

over




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值