0

みんな!私の物理エンジンは非常に順調に進んでおり (お問い合わせありがとうございます!)、さらに高度ながらくたの作業を開始する準備ができています。適切な例として、衝突が発生したときに任意のデリゲートに通知できるように、衝突エンジンをセットアップしようとしています。シナリオを設定しましょう。

物理シミュレーションにオブジェクト A、オブジェクト B、オブジェクト C があるとします。A と B の間の衝突についてデリゲートに通知し、A と C の間の衝突について潜在的に別のデリゲートに通知できるようにしたいと考えています。

少し背景情報: デリゲートの既知のインターフェイスがあり、衝突検出器の状態を保存する可能性があり (ただし、atm はしません)、オブジェクト自体に状態を保存する機能があります。同様に、このデリゲート モデルを使用して衝突解決を処理します。物理エンジンをデフォルトですべてのオブジェクトのデリゲートとして設定するだけで、ユーザーは必要に応じてデリゲートを変更できます。

ここで、各オブジェクトに、衝突が発生したときに通知される独自の衝突デリゲートを格納しようとしました。オブジェクトが同じコリジョン デリゲートを持つ場合、同じコリジョンが 2 回処理されるため、これは機能しませんでした。最初のオブジェクトのデリゲートのみを使用するように切り替えたとき (ただし、それは決定されました)、シミュレーションの順序が問題になりました。ディクショナリを使用したいのですが、かなりのオーバーヘッドが発生します。しかし、それは私が向かう必要がある方向のようです。

ここに問題があります。適切な解決策をめぐって死ぬまで戦います。この問題をどのように解決しますか?

4

1 に答える 1

1

2 つのオブジェクトが (衝突時に) 異なる代理オブジェクトを持つことができるのは少し奇妙ですが、それでも衝突時に 2 つの同一の代理オブジェクトが発火した場合は良くありません。両方とも常に発砲するか、どちらか一方だけを発砲する必要があるようです。ここで私を悩ませているのは一貫性です。それを説明すると、さらに役立ちます。

第 2 に、各オブジェクトのデリゲートを保持し、その機能をアクティブ化する条件付けの単純なバージョンを使用する場合 ("if (!some boolean that示す this delegate has already ried) {do something}")、これは非常に小さな値で解決できます。オーバーヘッド。動作しますが、この種のコードは好きではありません。

私の提案 (少し複雑なので、作業する前に考えてください) は、すべてのデリゲートを調べて衝突に関連する 2 つのオブジェクトを呼び出すマネージャー オブジェクトに注目することです。 たとえば、A と B が衝突し、それらをパラメーターとしてマネージャーが呼び出されます。これで、システムに認識されているすべてのデリゲートを循環して (少数であると仮定して)、「デリゲート == a.del またはデリゲート == b.del」に一致するデリゲートを起動できます。これはオーバーヘッドが大きくなりますが、少数のデリゲートについて話している場合、ほとんど違いはありません。反対に、これにより、衝突検出エンジンをこの領域で将来さらに拡張することができます (オブジェクトごとに複数のデリゲートが存在するなど)。

于 2010-10-30T05:58:19.537 に答える