なぜそれを避けたいのですか?再利用可能なクラスを作成する場合は、循環依存関係を避ける必要があります。ただし、Playerは再利用可能なクラスではありません。世界のないPlayerを使用したいと思いませんか?おそらくない。
クラスは機能のコレクションにすぎないことを忘れないでください。問題は、機能をどのように分割するかだけです。必要なことは何でもしてください。循環的な退廃が必要な場合は、そのようにしてください。(同じように、OOP機能についても同じことが言えます。目的にかなうようにコーディングしてください。単に盲目的にパラダイムに従うのではありません。)
編集
わかりました、質問に答えるために:コールバックを使用して、プレーヤーが衝突チェックのために世界を知る必要があることを避けることができます:
World::checkForCollisions()
{
[...]
foreach(entityA in entityList)
foreach(entityB in entityList)
if([... entityA and entityB have collided ...])
entityA.onCollision(entityB);
}
Player::onCollision(other)
{
[... react on the collision ...]
}
エンティティの速度を公開すると、質問で説明した物理の種類を世界で処理できます。
World::calculatePhysics()
{
foreach(entityA in entityList)
foreach(entityB in entityList)
{
[... move entityA according to its velocity as far as possible ...]
if([... entityA has collided with the world ...])
entityA.onWorldCollision();
[... calculate the movement of entityB in order to know if A has collided with B ...]
if([... entityA and entityB have collided ...])
entityA.onCollision(entityB);
}
}
ただし、おそらく遅かれ早かれ、世界への依存が必要になることに注意してください。それは、世界の機能が必要なときです。最も近い敵がどこにいるかを知りたいですか?次の棚がどれくらい離れているか知りたいですか?依存関係です。