Jonas Wagner のJS Box2D ポートを使用しており、形状のユーザーデータに関する奇妙な問題に遭遇しています。オブジェクトがいつ固い地面にあるかを判断するために、衝突形状とセカンダリの「足」センサー形状を持つようにエンティティをセットアップしました。定義は次のようになります。
var bodyDef = new b2.BodyDef();
bodyDef.position.Set(
(this.pos.x + this.size.x / 2) * b2.SCALE,
(this.pos.y + this.size.y / 2) * b2.SCALE
);
this.body = ig.world.CreateBody(bodyDef);
var shapeDef = new b2.PolygonDef();
shapeDef.SetAsBox(
this.size.x / 2 * b2.SCALE,
this.size.y / 2 * b2.SCALE
);
shapeDef.density = 0.85;
shapeDef.filter.groupIndex = -1;
this.body.CreateShape(shapeDef);
var footShapeDef = new b2.PolygonDef();
footShapeDef.SetAsOrientedBox(
3 * b2.SCALE,
3 * b2.SCALE,
new b2.Vec2(0,7*b2.SCALE),
0
);
footShapeDef.isSensor = true;
footShapeDef.density = 0.85;
footShapeDef.filter.groupIndex = -1;
var footShape = this.body.CreateShape(footShapeDef);
footShape.SetUserData("feet");
this.body.SetMassFromShapes();
ここでのアイデアは、フット センサーがエンティティとの衝突を停止したことを検出できるということです。すべてが期待どおりに機能しており、オブジェクトがフット センサーと衝突しなくなったときに、b2.ContactListener が正しく報告しています。問題は、足の形状に割り当てている userData が正しく報告されていないことです。
以下に示すように、b2.ContactListener の Remove コールバックで返されたポイント オブジェクトには、m_userData 属性が「feet」に設定された形状 (shape2) が含まれていることが明らかです。ただし、shape2 オブジェクトをクエリすると、m_userData が null として直接報告されます。
以下に示す console.log を実行する Safari のデバッグ コンソールのスクリーンショットを含めました。何が起きてる?!
var listener = new b2.ContactListener();
listener.Remove = function(point)
{
var p = point;
var s1 = p.shape1;
var s2 = p.shape2;
console.log(p, s1, s2);
}