public class GameObject { ... private Level level; ... } public class Level { ... private List<GameObject> gameObjects; ... }
但是有一个问题:当我想要复制一个级别及其对象时,引用变得不一致.例如,我可以深入复制我的Level-instance并深入复制所有的gameObjects.但是当我这样做时,GameObject中的Level-reference不再指向“right”(新)级别.在这种情况下,我可以调用每个对象的方法并重置其级别.但是,越来越多的类型的对象会被启动,这将越来越复杂,因为对象可能有也可能没有自己创建的对象集合,因此这些引用也必须被更新.
有没有什么像这样的情况的设计模式,或任何Java特定的,使这个问题更容易?
编辑
我只是一个想法:如何为每个GameObject创建一些类似的包装类,如下所示:
public class GameObjectWrapper { ... private long gameObjectID; private Level level; ... }
这将作为对所有需要引用的对象的引用.
并且每个GameObject将获得唯一的ID,级别将具有将每个id链接到实际的GameObject(类似于GameObject Level.getObject(long id))的映射.虽然这可能会起作用,但我仍然觉得必须有更好的解决方案.
编辑:进一步澄清
看来我没有把我的问题清楚得足够清楚,所以我会简化和概括一下:
我有两个示例对象(objectA和objectB):objectA包含对objectB的引用,objectB包含对objectA的引用.
这样的事情
public class MyObject { private MyObject partner; ... public MyObject shallowCopy() { return new MyObject(partner); } }
我想复制两个.使用浅拷贝,我得到两个新对象:newObjectA和newObjectB. newObjectA的存储引用(应该指向newObjectB),但是仍然指向原始对象B,反之亦然.
MyObject objectA = new MyObject(),objectB = new MyObject(); objectA.setPartner(objectB); objectB.setPartner(objectA); MyObject newObjectA = objectA.copy(); //newObjectA's partner now is objectB (instead of newObjectB) MyObject newObjectB = objectB.copy(); //newObjectB's partner now is objectA (instead of newObjectA)
现在,我可以“只是”运行我的所有对象,并将他们的旧对象映射到新的对象,但这似乎是缓慢而且太复杂的解决方案.最简单和最有效的解决方法是什么?
注意:我认为这是发布到gamedev.stackexchange.com,但我发现这更像是一个编程和设计的具体问题,而不是游戏开发的具体问题.
解决方法
这样的东西
class Level { List<GameObject> gameObjects; Level copy() { Level level = new Level(); level.gameObjects = new ArrayList<>(gameObjects.size()); for (GameObject gameObject : gameObjects) { level.gameObjects.add(gameObject.copyWithReference(level)); } return level; } } class GameObject { Level level; GameObject copyWithReference(Level level) { GameObject gameObject = new GameObject(); gameObject.level = level; return gameObject; } }
编辑:
你可以有一个容器的gameObjects:
class GameObjectSet { Level level; List<GameObject> gameObjects; GameObjectSet copy(Level newLevel) { GameObjectSet gameObjectSet = new GameObjectSet(); gameObjectSet.level = newLevel; // copy all gameObjects and make them point to new gameObjectSet return gameObjectSet; } }
现在您将在Level类和GameObject类中引用GameObjectSet.