打印了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>
CocosEditor-java onContactBegin无反应
最新推荐文章于 2024-02-15 22:54:36 发布