更短、更简单、更有效的数据保存方式?

Shorter, easier and more effective way of saving data?

感谢这个伟大的社区,我成功地为我的游戏制作了一个保存系统!但是,写起来有点漫长和痛苦。我需要有关如何(如果可能)使它更短和更容易的帮助。

所以,这就是我得到的(这个例子只使用 1 个变量来理解这个想法):

GameState = loadsave.loadTable("GameState.json")

if GameState == nil then
    GameState = {
        TotalPixoosGS = 0,
    }

    loadsave.saveTable(GameState, "GameState.json")
end

TotalPixoos = GameState.TotalPixoosGS

让我快速解释一下我在这里得到了什么:GameState = loadsave.loadTable("GameState.json") 是来自 .json 文件的 table 的声明。我使用了从这里获得的 .loadTable 函数:

https://code.coronalabs.com/code/easy-saveload-table-data-corona-sdk

if GameState == nil then
        GameState = {
            TotalPixoosGS = 0,
        }

如果文件不存在,它只是创建默认游戏设置,在本例中将 TotalPixoosGS 变量设置为 0 的值。

loadsave.saveTable(GameState, "GameState.json")

再次使用上面 link 中的函数,它只是从 GameState table 创建 .json 文件,并将其称为 GameState.json.

TotalPixoos = GameState.TotalPixoosGS

最后,将GameState.TotalPixoosGS的值赋值给我们的变量TotalPixoos(如果GameState.json不存在,就会赋值0)。到目前为止,非常简单,对吧?

现在,打开应用程序时调用了这段代码。

以下代码是我在退出应用程序时使用的代码:

if ( event.type == "applicationExit" ) then
      GameState = {
            TotalPixoosGS = TotalPixoos,
      }

      loadsave.saveTable(GameState, "GameState.json")
end

基本上,它所做的是:当应用程序即将退出时,您只需将 TotalPixoosGS 的值更改为我们当前的 TotalPixoos 值(即随时间变化的变量).最后,我们将 GameState table 保存为新的、更改后的 TotalPixoosGS.

一旦应用程序再次启动,该过程将重复。

现在,问题是什么?好吧,当你有 1 个变量时,就像在本例中一样,它看起来很简单。但是,当您必须管理超过 50 个变量时,编写起来会很痛苦。有什么办法可以缩短它吗?

无论如何,这只是一小段代码,要理解这个想法:

GameState = loadsave.loadTable("GameState.json")


if GameState == nil then
    GameState = {
        TotalPixoosGS = 0,
        PixoosQuantityGS = 0,
        PixoosPerSecondGS = 0,

        BottlesQuantityGS = 0,
        MaxBottlesFoundGS = 0,
        BottlesPriceGS = 0.005,
        WillFindBottlesChanceGS = 10,
        CanFindBottlesGS = 0,

        MaxClickableGS = 5,
        MaxTrashCanValueGS = 5,
    }

    loadsave.saveTable(GameState, "GameState.json")
end

TotalPixoos = GameState.TotalPixoosGS
PixoosQuantity = GameState.PixoosQuantityGS
PixoosPerSecond = GameState.PixoosPerSecondGS

BottlesQuantity = GameState.BottlesQuantityGS
MaxBottlesFound = GameState.MaxBottlesFoundGS
BottlesPrice = GameState.BottlesPriceGS
WillFindBottlesChance = GameState.WillFindBottlesChanceGS
CanFindBottles = GameState.CanFindBottlesGS

MaxClickable = GameState.MaxClickableGS
MaxTrashCanValue = GameState.MaxTrashCanValueGS

看看有多少难看的代码?这是在退出时:

if ( event.type == "applicationExit" ) then
      GameState = {
            TotalPixoosGS = TotalPixoos,
            PixoosQuantityGS = PixoosQuantity,
            PixoosPerSecondGS = PixoosPerSecond,

            BottlesQuantityGS = BottlesQuantity,
            MaxBottlesFoundGS = MaxBottlesFound,
            BottlesPriceGS = BottlesPrice,
            WillFindBottlesChanceGS = WillFindBottlesChance,
            CanFindBottlesGS = CanFindBottles,

            MaxClickableGS = MaxClickable,
            MaxTrashCanValueGS = MaxTrashCanValue,

       }

       loadsave.saveTable(GameState, "GameState.json")
end

有没有人有更好的方法或想法来处理这个问题?

这里的问题是您将数据存储在独立的全局变量中,您需要将这些数据存储在 table 中以保存,然后从 table 中获取以进行加载。

如果您只是在通用代码中使用 table 本身作为全局变量,则可以避免所有这些操作。

因此,在检查 values/etc 时,不要编写使用 TotalPixoosGSPixoosQuantityGS 的代码。您编写的代码使用 GameState.TotalPixoosGSGameState.PixoosQuantityGS,然后直接保存并加载 from/to 全局 GameState table.