Phaser P2 body.collideWorldBounds可以阻止身体碰撞

时间:2015-08-03 12:45:30

标签: phaser-framework

我正在使用Phaser 2.4.2和P2物理。我有一种罐形的身体,里面有一些圆形的身体(球)。我想把瓶子移到屏幕外但是球与世界的界限相撞。 我尝试在球上设置collideWorldBounds,如下:

ball.body.setCircle(64);
ball.body.collideWorldBounds = false;

但是这会阻止它们与我想要的罐子碰撞 - 结果是重力会使它们掉到屏幕外。

您可以在此处看到演示:https://output.jsbin.com/vuyexo
单击红色按钮使罐子移动 取消注释“球”部分中的collideWorldBounds=false

为什么会发生这种情况?当罐子移到屏幕外时,如何让球体与罐体碰撞而不是与世界界限相撞?

2 个答案:

答案 0 :(得分:3)

您可以使用//.. game.physics.p2.gravity.y = 300; game.physics.p2.setBoundsToWorld(false, false, true, true); // left=false, right=false, top=true, bottom=true 设置P2世界范围,就像这样

game.world.setBounds(0, 0, 2000, 1024);

或者你可以让P2世界更大,所以例如使宽度为2000而不是768。

#container-biz-header {
   margin: auto;
   height:200px;
 }

答案 1 :(得分:0)

默认情况下,p2会将所有内容与其他所有内容发生冲突,但如果您希望它执行不同的操作,则必须通过将每个主体添加到冲突组,然后像这样调用body.collides来明确列出哪些对象相互冲突:

        var jarCG = this.physics.p2.createCollisionGroup();
        var ballsCG = this.physics.p2.createCollisionGroup();
        jar.body.setCollisionGroup(jarCG);
        jar.body.collides(ballsCG);
        for (var i = 0; i < 9; i++)
        {
            var ball = balls.create(250+(i%3)*128,300+Math.floor(i/3)*128);
            ball.body.setCircle(64);
            ball.body.debug = true;
            ball.body.collideWorldBounds = false;
            ball.body.setCollisionGroup(ballsCG);
            ball.body.collides([jarCG, ballsCG]);
        }

这对我有用,但使用补间移动jar仍然会使物理行为变得怪异。您可以通过使用jar.body.velocity.x而不是补间或者补间所有球来修复它。你也可以尝试补间stack.x,如果你只想移动精灵,但由于某种原因,这不会移动他们的身体。