创建实体时的循环依赖

我有以下问题:

我有一个名为Stage的类,它保存了一个实体列表,它遍历每个更新循环,并更新它们。 其中一个实体可能是一个武器(PEW PEW!),当更新产生新的实体时(射弹,KA-ZOOM,KER BANG!)。 如何将这些新实体添加到Stage中实体的列表中? 目前,我把Stage作为一个具有全局访问权限的单例,所以那些反过来派生实体的实体只是调用Stage的addEntity方法的实例,但是这样做感觉很愚蠢。

舞台 – >实体(武器) – >再次登台?

创建敌人时我有类似的问题:

舞台 – >实体(敌波) – >再次登台

我一直在考虑将List传递到可以创建其他实体的所有实体,但是我不得不改变基本实体类的更新方法,以便它获取这个列表,大多数实体不需要。 此外,在向舞台添加实体时,必须让舞台知道该实体的许多graphics组件,以便Stage能够告诉渲染器(具有OpenGL上下文)为这些graphics加载合适的资源组件。

任何想法我应该做什么? 我现在做错了吗?

而且,当我们在这时,为什么Singletons如此皱眉?

添加事件处理 。

有很多不同的方法可以实现事件处理,但主要思想是游戏的不同组件通过事件进行交互,消除了大多数交叉/循环依赖。 举个例子,你可能有一个eventHandler类(如果你愿意,可以是singleton),它接收和转发事件。 所有的类都可以访问eventHandler ,并通过它进行通信。

至于单例模式(或反模式), 之前已经回答了。

它看起来像你的实体应该能够触发创建任何其他types的实体。

scheme1 :(你解释的情况)

 public class WolfSpawner extends Entity { public void Update() { Wolf wolf = new Wolf(); Stage.Instance.AddEntity(wolf); } } 

选项2 :(在这种情况下,Spawner不知道舞台)

 public class Spawner extends Entity { protected Vector<ISpawnListener> spawnListeners; public void AddSpawnListener(ISpawnListener spawnListener) { if (spawnListeners == null) spawnListeners = new Vector(); spawnListeners.Add(spawnListener); } public void RemoveSpawnListener(ISpawnListener spawnListener) { // ... } public void Spawn(Entity entity) { if (spawnListeners != null && !spawnListeners.isEmpty()) { foreach(var spawnListener in spawnListeners) { spawnListener.Spawned(entity) } } } } public class WolfSpawner extends Spawner { public void Update() { Wolf wolf = new Wolf(); Spawn(wolf); } } // Listener interface public interface ISpawnListener { void Spawned(Entity entity); } public class Stage implements ISpawnListener { private Vector<Entity> entities; public void Spawned(Entity entity) { AddEntity(entity) } public void AddEntity(Entity entity) { entities.Add(entity); if(entity instanceof Spawner) { var spawner = (Spawner)entity; spawner.AddSpawnListener(this); } } public void RemoveEntity(Entity entity) { entities.Remove(entity); if(entity instanceof Spawner) { var spawner = (Spawner)entity; spawner.RemoveSpawnListener(this); } } } 

还有其他选项可以解决这个问题。

单例不是一个坏模式,它的实现或如何得到单个实例。 在应用程序中只需要一个对象的单个实例就有一些情况。