2

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

2 に答える 2

2

衝突設定が変更されたフィクスチャで Refilter() を呼び出すことができます。

于 2015-02-09T11:22:07.867 に答える
1

わかりました、私は汚いハックでそれを修正しました: 問題は、連絡先がまだ存在していたので、どうにかしてそれらを削除しなければならないということでした. 最初は手動で削除しようとしましたが失敗しました。

Box2D のマニュアルには次のように書かれています。

AABB が重複しなくなると、連絡先が破壊されます。

そこで、プレーヤーが直面しているディレクトリ内でプレーヤーを約 6 ピクセル (動作するように見える最小量) 移動する関数を作成しました (その時点で壁に衝突していない場合)。これにより、エンティティがオーバーラップし、問題が解決します。

問題の関数は次のとおりです。

  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;
    }
  } 
于 2013-03-20T13:56:10.223 に答える