我想爲我正在開發的遊戲實現一個檢查點系統,爲此我需要複製一個關卡中的所有可變對象以創建關卡的獨立副本。在一個簡單的例子我的課是這個樣子:如何在保持一致的引用的同時複製對象?
public class GameObject
{
...
private Level level;
...
}
public class Level
{
...
private List<GameObject> gameObjects;
...
}
但有一個問題:當我要複製一個水平,它的對象的引用變得不一致。例如,我可以深度複製我的Level-instance並深度複製所有的gameObjects。但是當我這樣做時,GameObject中的關卡參考不再指向「正確的」(新的)關卡。在這種情況下,我可以爲每個對象調用一個方法並重置其級別。但隨着越來越多類型的對象被捲入,這會變得越來越複雜,因爲對象可能有也可能沒有自己創建的對象集,然後這些對象也必須更新,等等。
有沒有像這種情況下的設計模式,或任何特定於Java的問題,使這個問題更容易?
編輯
我只是有一個想法:如何建立某種包裝類的,看起來像這樣每一個遊戲對象:
public class GameObjectWrapper
{
...
private long gameObjectID;
private Level level;
...
}
這將顯示爲所有對象的引用這需要參考。 並且每個GameObject都會得到一個唯一的id,並且level會有一個將每個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
),但仍指向原始的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,但我發現這是一個編程和設計特定問題比遊戲開發的具體問題更多。
你能解釋更多嗎?爲什麼複製後對象指向錯誤的級別?這個「新」水平是什麼?代碼可能比純文本更容易理解。 – Bubletan
@Bubletan謝謝,我添加了更多的澄清信息。 – 1337