CocosEditor-java onContactBegin无反应

 打印了CategoryBitMask和ContactTestBitMask。应该是没错的。
参照http://www.tuicool.com/articles/nAZbuy(我还没看)

调试了一天,发现怎么都没法触发onContactBegin,于是仔细看看有什么可以调试的tool。发现了下面这个配置,把Debug打开为shape,就可以看见了

打开后,发现小鸟没有Shape。
原因是我Shape参数设置错了。如下,大小是1*1

貌似Contact和物理碰撞模拟不能同时显现,只取其一。下面的例子设置Contact时,就不会碰撞了。
另外一个实例中发现,当给physicsBody设置偏移时,编辑窗口没显示位移,而实际上是有位移的,当我打开Debug选项,才发现这致命Bug!

如下图,无怪乎不会碰撞!娘的,搞了一整天,幸亏还有调试选项可以打开,不然怎么都想不到。


实践例子:
1.优先Contact,当Contact条件不满足,才会Collision,如下面例子,因为满足Contact条件,会产生onContactBegin()事件,就不会碰撞了。
<span style="font-size:18px;">PhysicsBody body = birdSprite.getPhysicsBody();
body.setCategoryBitmask(0x2);      //010
body.setContactTestBitmask(0x8);   //100
body.setCollisionBitmask(0x2);     //100

PhysicsBody body2 = groundSprite.getPhysicsBody();
body2.setCategoryBitmask(0x8);     //100
body2.setContactTestBitmask(0x2);//010
body.setCollisionBitmask(0x8);     //100</span>

2.两个物体碰撞——
移动柱子撞向小鸟:
 
这时,只要让Contact条件不满足,即不设置setContactTestBitmask
就会碰撞——默认Collision是0xFFFF FFFF(不记得多少位)
如果要设置CollisionBitMast,而不用默认值0xFFFFFFFF,那就要遵循规则,下面的例子,
groundSprite取CollisionBitMask为0x8——和自己Category一样时,可以和birdSprite碰撞,而取其它值就无效。
CollisionBitMask是被撞Mask,从这个实验看来,这个mask要和自己的category一致(相与不为0),与被撞的birdSprite的Mask无关
<span style="font-size:18px;"> PhysicsBody body = birdSprite.getPhysicsBody();
 body.setCategoryBitmask(0x2);      //010
 
 PhysicsBody body2 = groundSprite.getPhysicsBody();
 body2.setCategoryBitmask(0x8);     //100
// body2.setContactTestBitmask(0x2);//010
 body.setCollisionBitmask(0x8);     //100</span>

下面是调试代码:
<span style="font-size:18px;">package org.cce.game.hello;

import org.ccj.Director;
import org.ccj.Scene;
import org.ccj.base.Ref;
import org.ccj.d2.Sprite;
import org.ccj.d2.action.CallFunc;
import org.ccj.d2.action.MoveTo;
import org.ccj.d2.action.ScaleTo;
import org.ccj.d2.action.Sequence;
import org.ccj.editor.cce.Action;
import org.ccj.editor.cce.Bind;
import org.ccj.editor.cce.NodeController;
import org.ccj.editor.cce.NodeReader;
import org.ccj.math.Vec2;
import org.ccj.physics.PhysicsBody;
import org.ccj.physics.PhysicsContact;
import org.ccj.physics.PhysicsContactListener;
import org.ccj.physics.PhysicsWorld;

/**
 */
public class SceneController
        extends NodeController {

    @Bind()
    public Sprite bgSprite;

    @Bind()
    public Sprite birdSprite;


    @Bind()
    public Scene playScene;
    @Override
    public void onEnter() {
        super.onEnter();


        PhysicsWorld wolrd = playScene.getPhysicsWorld();
        wolrd.setGravity(new Vec2(0,-100));
        initContactTest();


        createPipeBarrier();
       // groundSprite.runAction(MoveTo.create(3,new Vec2(0,groundSprite.getPositionY())))
;    }

    private void initContactTest() {
        setContact();
    }

    private void setContact() {

        PhysicsBody body = birdSprite.getPhysicsBody();
        body.setCategoryBitmask(0x2);      //010
        body.setContactTestBitmask(0x8);   //100



        System.out.println("setContact");
        birdSprite.addPhysicsContactListener(new BirdAndPipeContact());
    }
    public class BirdAndPipeContact extends PhysicsContactListener {

        {
            regContactBegin();
        }

        @Override
        public boolean onContactBegin(PhysicsContact contact) {

            System.out.println("onContactBegin");
            //Node birdNode = contact.getNode(1111);
            //birdNode.stopAllActions();
            birdSprite.stopAllActions();
            System.out.println("contact");

            return false;
        }
    }

    public void createPipeBarrier() {

        final Sprite pipeBar = NodeReader.create().readSprite("layouts/pipeBarrierPhysics.cce");

        PhysicsBody bodyUpPipe = pipeBar.getChildByName("upPipe").getPhysicsBody();
        bodyUpPipe.setCategoryBitmask(0x8);
        bodyUpPipe.setContactTestBitmask(0x2);
        //bodyUpPipe.setCollisionBitmask(0x0);

        PhysicsBody bodyDownPipe = pipeBar.getChildByName("downPipe").getPhysicsBody();
        bodyDownPipe.setCategoryBitmask(0x8);
        bodyDownPipe.setContactTestBitmask(0x2);
        // bodyDownPipe.setCollisionBitmask(0x0);

        pipeBar.setPositionX(720);

        //pipeBar长1800原因:屏幕长度设计为1280,整体pipeBar还要下沉450,所以至少大于1280+450
        //down_pipe和up_pipe位置不便
        pipeBar.setPositionY(-450f);

        pipeBar.runAction(Sequence.create(
                MoveTo.create(3, new Vec2(-140, pipeBar.getPositionY()))

        ));

        owner.addChild(pipeBar);
    }

    @Override
    public void onExit() {
        super.onExit();
    }

    @Override
    public void onUpdate(float delta) {
        super.onUpdate(delta);
    }

    
}
</span>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值