ทำไมคุณต้องการหลีกเลี่ยงสิ่งนั้น ควรหลีกเลี่ยงการพึ่งพาแบบวงกลมหากคุณต้องการสร้างคลาสที่สามารถใช้ซ้ำได้ แต่ผู้เล่นนั้นไม่มีคลาสที่ต้องนำมาใช้ซ้ำได้เลย คุณเคยต้องการใช้โปรแกรมเล่นโดยไม่มีโลกหรือไม่? อาจจะไม่.
จำไว้ว่าคลาสนั้นไม่มีอะไรมากไปกว่าคอลเลกชันของการใช้งาน คำถามคือวิธีแบ่งการทำงาน ทำสิ่งที่คุณต้องทำ หากคุณต้องการความเสื่อมแบบวนเวียน (เช่นเดียวกันสำหรับคุณสมบัติ 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);
}
}
อย่างไรก็ตามโปรดทราบว่าคุณอาจจำเป็นต้องพึ่งพาโลกไม่ช้าก็เร็วนั่นคือเมื่อใดก็ตามที่คุณต้องการฟังก์ชั่นการทำงานของโลก: คุณต้องการที่จะรู้ว่าศัตรูที่ใกล้ที่สุดอยู่ที่ไหน? คุณต้องการที่จะรู้ว่าหิ้งถัดไปอยู่ห่าง ๆ มันขึ้นอยู่กับ