2

Flashゲームを作成していますが、Box2Dで多角形を描画しようとしたときに、非常に奇妙な問題が発生しました。

私が使用するコードは次のとおりです。

var fixtureDefs:Array = new Array();

...

var fDef:b2FixtureDef = new b2FixtureDef();
fDef.density = 0;
fDef.shape = new b2PolygonShape();
b2PolygonShape(fDef.shape).SetAsArray(vertexArray);
fixtureDefs.push(fDef);

//This gets repeated several times, so that at the end you get a body consisting of several convex shapes.

...

var bD:b2BodyDef = new b2BodyDef();
bD.type = b2Body.b2_staticBody;
bD.position.Set(300/Constants.RATIO,200/Constants.RATIO);

var body:b2Body = Constants.world.CreateBody(bD);

...

for each(var fD:b2FixtureDef in fixtureDefs) {
body.CreateFixture(fD);
}

ここで、vertexArrayは、4つのb2Vec2頂点を含む有効な配列であり、凸形状を構成します。

問題は、私がテストしたときに、衝突がそのボディに対して正しく機能しないことです。他のほとんどのオブジェクト(敵、ユーザー制御のキャラクター)は、体がまったくないかのようにまっすぐ通過します。一部のレイキャストも通過します。

腹立たしいことに、私が持っているある種の体(カスタムの敵)は、どういうわけか体を検出して衝突します。特定の種類の敵が試みるレイキャストは機能ます-キャラクターがポリゴンの後ろに隠れているとき、彼らは彼を見ることができないようです。

もう1つの奇妙なことは、同じコードを試してみると、SetAsArrayではなくSetAsBoxのみを使用すると、正常に機能することです。

カスタムのContactListenerクラスを使用していますが、連絡先のフィルタリングを行っていません(気付かないうちに行うことができない場合)。

Box2D2.1aのFlash9バージョンを使用しています。

助言がありますか?私は明らかな何かを見逃していますか、それとも私(神は禁じられています!)がバグを発見しましたか?ご協力いただきありがとうございます!

アンドレイ

4

2 に答える 2

4

やあアンドレイ、

2.1a はより厳密な側にあるため、適切に動作させるためにはほとんどすべてを宣言する必要があります。

AS3 OOP-

private var body:b2Body;
private var bodyDef:b2BodyDef = new b2BodyDef();
private var bodyPoly:b2PolygonShape = new b2PolygonShape();
private var bodyFix:b2FixtureDef = new b2FixtureDef();

private var vertexArray:Array = new Array();

public function Example() 
{

//Setting up Vertices in an Array   
var ver1:b2Vec2 = new b2Vec2( -1, -1);
var ver2:b2Vec2 = new b2Vec2( 1, -1);
var ver3:b2Vec2 = new b2Vec2( 1, 1);
var ver4:b2Vec2 = new b2Vec2( -1, 1);

//Push in order
vertexArray.push(ver1, ver2, ver3, ver4);

bodyDef.type = b2Body.b2_dynamicBody;
//b2Vec2 Array then Vertex Count
bodyPoly.SetAsArray(vertexArray, vertexArray.length);
bodyFix.shape = bodyPoly;
bodyFix.density = 0.5;
bodyFix.friction = 0.5;
bodyFix.restitution = 0.5;
bodyDef.position.Set(0, 0);
body = m_world.CreateBody(bodyDef);
body.CreateFixture(bodyFix);

}

各ポイントは前のポイントの右側になければならないことに注意してください。

var ver1:b2Vec2 = new b2Vec2( -1, -1);//Top Left
var ver2:b2Vec2 = new b2Vec2( 1, -1);//Top Right
var ver3:b2Vec2 = new b2Vec2( 1, 1);//Bottom Right
var ver4:b2Vec2 = new b2Vec2( -1, 1);//Bottom Left

配置は左から右へ

vertexArray.push(ver1, ver2, ver3, ver4);

説明が下手ですが、参考になれば幸いです!-ゼロ

于 2011-04-15T11:47:38.663 に答える
0

繰り返しになりますが、Box2D のほとんどのバージョンはさまざまな人によって書かれているため、それに伴いソースが変更され、プログラミング言語により適したものになるように、あなたが見ているドキュメントはおそらく AS3 ではなく C++ という別の言語を参照していました。

ソースには、そのバージョンのドキュメントを含むフォルダーが付属している必要があり、「Docs」という名前のフォルダーである必要があります。

于 2011-04-15T15:54:51.417 に答える