2013-02-24 145 views
1

假設我有一個使用HTML5畫布的Javascript遊戲,它通過更新並繪製一堆對象來循環。什麼是拯救當前遊戲狀態的最佳方式?我想我可以循環遍歷所有的對象,並以一種可以被加載函數讀取的格式寫入文本形式的所有值,但對於我和遊戲來說,這似乎有相當多的工作,以及大量的保存文件大小。有一個更好的方法嗎?我從來沒有做過這樣的事情,我真的不知道從哪裏開始。用Javascript保存遊戲

謝謝。

+1

jquery [serialize](http://api.jquery.com/serialize/)?另一方面,這將節省一切。你最好寫一個只提取相關數據的函數。例如精靈的x/y座標很重要。它的位圖表示不是,因爲你可以很容易地重建它。 – 2013-02-24 03:59:59

回答

2

一個像這樣的標準做法是維護一個代表你的系統的數據模型和一個代表你的模型的視圖。該模型應該主要是數據,這可能相對複雜,但它具有視圖渲染所需的所有信息。

假設這個模型是一個對象樹,您可以調用var serialized = JSON.stringify(model)將您的數據模型序列化爲一個字符串,然後var model = JSON.parse(serialized)將其恢復。這是一個非常簡單但不靈活的方法,但它是一個開始。

一個快速的方式來存儲這些信息將與localStorage,但你可能會想要移動到後端存儲,你將價值達到一個REST服務(或類似的東西),這樣的數據可以從任何地方檢索。

我建議尋找像Backbone.js(例如)這樣的類似MVC的框架,它可以幫助您將模型從視圖中分離出來,並且還可以很好地保持/保存數據存儲中的數據。

+0

太好了,非常感謝。我不知道你能做到這一點,我只做了一個小測試,看起來非常實用。 – Suffick 2013-02-24 04:17:33

1

你會想對'serialize'和'unserialize'的關鍵詞進行一些研究。

而不是在每個對象上做一個遞歸循環,我建議你讓所有的遊戲對象都實現一個序列化函數。您可以使用JSON構建整個對象樹,每個對象都決定需要保留哪些屬性,以及哪些屬性可以從其他屬性派生。雖然這似乎與某些層次上的遞歸循環做同樣的事情,但巨大的區別是,每個對象可以自行定義如何序列化/反序列化其本身和它的內容..

根據不確定你想保存你的遊戲狀態,你可以減少很多數據。例如,也許您可​​以簡單地將它們重置爲當前級別的開始,或者您可以轉儲其他地方可用的某些數據(例如,級別數據可能不應該存儲在保存文件中,只有關於遊戲狀態的信息可以讓你使用現有的關卡數據存儲重現關卡)。