为什么要避免这种情况?如果要创建可重用的类,应避免循环依赖。但是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);
}
}
但是请注意,您迟早可能需要对世界的依赖,也就是您需要世界功能时:您想知道最近的敌人在哪里?您想知道下一个壁架有多远吗?是依赖。