我正在使用Phaser 2.4.2和P2物理。我有一种罐形的身体,里面有一些圆形的身体(球)。我想把瓶子移到屏幕外但是球与世界的界限相撞。
我尝试在球上设置collideWorldBounds
,如下:
ball.body.setCircle(64);
ball.body.collideWorldBounds = false;
但是这会阻止它们与我想要的罐子碰撞 - 结果是重力会使它们掉到屏幕外。
您可以在此处看到演示:https://output.jsbin.com/vuyexo
单击红色按钮使罐子移动
取消注释“球”部分中的collideWorldBounds=false
。
为什么会发生这种情况?当罐子移到屏幕外时,如何让球体与罐体碰撞而不是与世界界限相撞?
答案 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,如果你只想移动精灵,但由于某种原因,这不会移动他们的身体。