gpt4 book ai didi

java - 如何在保持引用一致的情况下复制对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:55 24 4
gpt4 key购买 nike

我想为我正在开发的游戏实现一个检查点系统,为此我需要复制关卡中的所有可变对象,以便创建关卡的独立副本。在一个简化的示例中,我的类看起来像这样:

public class GameObject
{
...
private Level level;
...
}

public class Level
{
...
private List<GameObject> gameObjects;
...
}

但有一个问题:当我想复制关卡及其对象时,引用变得不一致。例如,我可以深度复制关卡实例并深度复制所有游戏对象。但是当我这样做时,GameObject 中的 Level-reference 不再指向“正确”(新)级别。在这种情况下,我可以为每个对象调用一个方法并重置其级别。但是随着涉及的对象类型越来越多,这会变得越来越复杂,因为对象可能有也可能没有自己创建的对象集,然后这些引用也必须更新等等。

是否有针对这种情况的设计模式或任何特定于 Java 的东西可以使这个问题变得更容易?

编辑

我有一个想法:如何为每个游戏对象创建某种包装类,如下所示:

public class GameObjectWrapper
{
...
private long gameObjectID;
private Level level;
...
}

这将作为对所有需要引用的对象的引用。每个 GameObject 都会获得一个唯一的 ID,关卡将有一张 map 将每个 ID 链接到一个实际的 GameObject(类似于 GameObject Level.getObject(long id))。虽然这可能会奏效,但我仍然觉得必须有更好的解决方案。

编辑:进一步说明

看来我的问题说得不够清楚,所以我将其简化和概括一下:

我有两个示例对象(objectAobjectB):objectA 包含对 objectBobjectB 包含对 objectA 的引用。

像这样:

public class MyObject
{
private MyObject partner;

...

public MyObject shallowCopy()
{
return new MyObject(partner);
}
}

我想复制两者。通过浅拷贝,我得到了两个新对象:newObjectAnewObjectBnewObjectA 的存储引用(应该指向 newObjectB),但是,仍然指向原始的 objectB,反之亦然。

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,但我发现这更像是一个特定于编程和设计的问题,而不是特定于游戏开发的问题。

最佳答案

如果您只复制 Level 对象并希望它的列表中的引用指向新副本,您不能在复制方法中循环遍历它们吗。

像这样:

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

关于java - 如何在保持引用一致的情况下复制对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com