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

または、オブジェクトに一定の力を加えたい場合は、最後の例のに変更applyImpulseします。applyForce

注: このcp.v(0,0)パラメータは、オブジェクトの中心に力を適用するようにエンジンに指示しているため、オブジェクトは回転しないはずです。

PS: 物理シミュレーションで奇妙な動作が見られた場合 (その場合にのみ)、この回答を見てください。

于 2014-09-22T13:49:06.537 に答える