1

ファクトリを使用Shapeして物理エンジンのインスタンスを作成しています。各シェイプのサイズは構築時までわからないため、スタック メモリ + クローンの代わりにファクトリが使用されます。AShapeは物理演算に供給され、次のSceneように作成されBodyます。

// Sphere derives from Shape
Sphere *s = Scene.CreateSphere( radius );

// Construct a rigid body with a certain shape
Body *b = Scene.CreateBody( s );

問題Shape: それぞれが常に 1 つだけに関連付けられることを望みBodyます。ユーザーがこれを行うことを禁止する必要があります。

Body *b1 = scene.CreateBody( );
Body *b2 = scene.CreateBody( );
Shape *s = scene.CreateBox( 1.0f, 1.0f, 1.0f );
b1->AddShape( s );
b2->AddShape( s ); // bad

追加情報: ここではパフォーマンスが重要であるため、ポインタの一意性に関するコストのかかるパフォーマンス チェックは避けるのが最善です。ただし、デバッグ モードでは、エラー チェックのパフォーマンス ヒットは許容されます。

複数の形状が集約された剛体から離れている可能性があるため、ボディの作成とは別に形状を構築できることが重要です。

Body *b = Scene.CreateBody( );
b->AddShape( shapePtr1 );
b->AddShape( shapePtr2 );

ShapeBodyまた、実行時にインスタンスを別のインスタンスに転送できる必要があります。

Body *b1, b2; // initialized elsewhere
Shape *s;     // initialized elsewhere, is attached to b1
b1->RemoveShape( s );
b2->AddShape( s );

おそらく、別の API 設計に取り組む必要がありますか? おそらく、クローンは何らかの方法で使用できますか?

4

2 に答える 2

1

非公開にし、引数を取るctorBody::AddShape(...)を削除します。Shape*

void Body::AddSphere(float radius)
{
  AddShape(Scene.CreateSphere(radius));
}

void Body::transferShape(Shape *s, Body &B2)
{
  RemoveShape( s );
  B2.AddShape( s );
}

// Construct a rigid body with no Shapes (yet)
Body *b = Scene.CreateBody();

// Give it a Sphere
b->AddSphere(radius);

// Transfer it to another body:
Body *b2 = Scene.CreateBody();
Shape *s = b->GetShapePointerSomehow();
b->transferShape(s, *b2);

Shape既存の をBody別の から削除せずに に追加する方法はないことに注意してくださいBody。外部コードは、2 つのボディに同じ を含めることはできませんShape

于 2013-07-20T01:38:49.817 に答える
1

まず、すべてのCreate*()関数がBodyパラメーターを受け取るようにします。これは、依存関係の反転の形式として行われます。

Shape次に、単一の に対してのみ作成できますBody。既にシェイプを持っているShapeにを作成しようとすると、アサートまたはエラーになることもあります。Body

オブジェクトの移動は、移動先に がアタッチされていないShapeという単純な要件でサポートできます。「ダングリング」シェイプを許可する は使用せず、単純にと を使用します。または、さまざまなスマート ポインターを使用して、「ぶら下がっている」形状が適切にクリーンアップされるようにします。BodyShapeDetachShapeMoveShapeToReleaseShape

于 2013-07-20T01:34:05.190 に答える