CocosEditor-java onContactBegin无反应

来源:互联网 发布:ssr软件 编辑:程序博客网 时间:2024/06/02 09:01
 打印了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);      //010body.setContactTestBitmask(0x8);   //100body.setCollisionBitmask(0x2);     //100PhysicsBody body2 = groundSprite.getPhysicsBody();body2.setCategoryBitmask(0x8);     //100body2.setContactTestBitmask(0x2);//010body.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>




0 0
原创粉丝点击