Impactjs を使用してゲームを作成しており、Box2D を物理エンジンとして使用しています (具体的には Box2DFlash)。そのため、プレイヤーが敵と衝突してはならない場所への移動があります。これを実現するには、コリジョン フィルタリングが最適な方法のようです。
だから私は敵のフィクスチャを設定しました:
var shapeDef = new b2.PolygonDef();
shapeDef.filter.categoryBits = 0x0002;
そしてプレーヤーのために:
var shapeDef = new b2.PolygonDef();
shapeDef.filter.categoryBits = 0x0004;
プレイヤーと敵の衝突のオン/オフを切り替えたいときは、次の関数を呼び出します。
ghost: function(){
this.setMaskBits( 0x0001 ); // only collide with boundary
},
deghost: function () {
this.setMaskBits( 0xFFFF ); // collide with everything
},
setMaskBits: function (bits) {
this.body.GetShapeList().m_filter.maskBits = bits;
}
そして、それは機能しています...ただし、互いに衝突していない場合のみです。壁に面していて、categoryBits を に設定すると、同じ問題が発生します0x0000
。
アップデート
わかりました、私は汚いハックでそれを修正しました: 問題は、連絡先がまだ存在していたので、どうにかしてそれらを削除しなければならないということでした. 最初は手動で削除しようとしましたが失敗しました。
Box2D のマニュアルには次のように書かれています。
AABB が重複しなくなると、連絡先が破壊されます。
そのため、プレイヤーが直面しているディレクトリ内でプレイヤーを約 6px (動作するように見える最小量) 移動する関数を作成しました (その時点で壁に衝突していない場合)。これにより、エンティティがオーバーラップし、問題が解決します。
問題の関数は次のとおりです。
changePosition: function (x,y) {
this.facingWall = false;
this.collision(); // will set facingWall to true if he's facing a wall.
if(!this.facingWall) {
this.body.m_xf.position.x = x;
this.body.m_xf.position.y = y;
}
}