0

我试图通过更改调度程序中的坐标来移动物理体,我使用了这段代码。如果我在浏览器中运行此代码,它将工作,但在 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;
}
4

2 回答 2

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);
}

或者,如果您想对对象施加恒定的力,请更改applyImpulseapplyForce最后一个示例。

注意:cp.v(0,0)参数告诉引擎将力施加到物体的中心,所以它不应该旋转。

PS:如果(且仅当)您碰巧在物理模拟中看到一些奇怪的行为,请查看此答案

于 2014-09-22T13:49:06.537 回答
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;
}

但我没有这个代码的解释

于 2014-09-25T05:14:49.630 回答