我试图通过在调度程序中更改其坐标来移动物理主体,并且我使用了此代码。如果我在浏览器中运行此代码它将工作但在js绑定后它不能在mac或ios上工作。物理体在这些设备上根本不移动
init: function{
var mass = 1;
var width = 1, height = 1;
this.playerBody = new cp.Body(mass , cp.momentForBox(mass, width, height));
this.space.addBody(this.playerBody);
this.schedule(this.move);
},
move: function(dt){
this.space.step(dt);
this.playerBody.getPos().x += 2 * dt;
this.playerBody.getPos().y += 2 * dt;
}
答案 0 :(得分:1)
尝试从这些行中删除getPos()
,将其保留在:this.playerBody.p.x += 2 * dt;
。我认为这很可能是导致问题的原因。
此外,避免自己操纵坐标并让物理引擎处理所有事情。
例如,您可以手动指定速度:
init: function{
var mass = 1;
var width = 1, height = 1;
var vx = 1, vy = 1;
this.playerBody = new cp.Body(mass , cp.momentForBox(mass, width, height));
this.space.addBody(this.playerBody);
this.playerBody.vx = vx;
this.playerBody.vy = vy;
this.schedule(this.move);
},
move: function(dt){
this.space.step(dt);
}
或者,如果你想在某个方向给对象“碰撞”,可以像这样使用applyImpulse
:
init: function{
var mass = 1;
var width = 1, height = 1;
var fx = 1, fy = 1;
this.playerBody = new cp.Body(mass , cp.momentForBox(mass, width, height));
this.space.addBody(this.playerBody);
this.playerBody.applyImpuse(cp.v(fx, fy), cp.v(0,0));
this.schedule(this.move);
},
move: function(dt){
this.space.step(dt);
}
或者,如果您想对对象应用恒定力,请在最后一个示例中将applyImpulse
更改为applyForce
。
注意:cp.v(0,0)
参数告诉引擎将力施加到对象的中心,因此它不应该旋转。
PS:如果(并且仅当)您在物理模拟中看到一些奇怪的行为,请查看this answer。
答案 1 :(得分:0)
添加几行后,我的播放器开始在mac中移动
init: function{
var mass = 1;
var width = 1, height = 1;
this.playerBody = new cp.Body(mass , cp.momentForBox(mass, width, height));
this.space.addBody(this.playerBody);
this.schedule(this.move);
},
move: function(dt){
this.space.step(dt);
var a = this.playerBody.local2World(this.playerBody.p);
a.y += 2 * dt;
a.x += 2 * dt ;
a = this.playerBody.world2Local(a);
this.playerBody.p = a;
}
但我没有对此代码的解释