【问题标题】:(Godot) Saving multiple keys and reloading them(Godot) 保存多个密钥并重新加载它们
【发布时间】:2020-08-21 11:36:49
【问题描述】:

我有点难过。我已经按照this修改了保存系统。

为了解决这个问题,我不确定如何将字典加载回原始变量。 很可能更容易解释您所看到的问题。

# This would be "GlobalData"
onready var KEY = name

# Stats dictionary
var stats:= {
    "health" : 75,
    "stamina": 25
}

# Meta Dictionary
var meta:= {
    "testing": "I'm a totally random thing",
    "testing2": 2002,
    "date": "Thursday, 2020-08-20, 20:12"
}

# Load both into array to iterate through upon saving
var list = [stats, meta]

func save(save_game:Resource):
    var i = 0
    for element in list:
        
        # Make a unique key based on iteration
        var temp:String = KEY + String(i)
        
        # Store data to key
        save_game.data[temp] = element
        i = i+1
        

func load(save_game:Resource):
    var i = 0
    
    # === Where the error lies === #
    # While saving works fine, I cannot use the list array to push content back into the original dictionaries
    # If I targeted the dictionary by it's variable, then it got applied.

    for element in list:
        var temp:String = KEY + String(i)
        element = save_game.data[temp]
        i = i+1


所以,我的问题在于“如何重新应用加载的数据?”。 我是否必须将列表写入某种方式,它也会存储字典名称?或者是否有可能以某种方式调用元素的名称以使其定位到原始变量/字典?

PS。不要问我为什么不使用 i++ 或 i+=1。出错了。

【问题讨论】:

  • 我越是尝试推动这个问题,它就越糟糕。也许不值得过度设计它,应该坚持一个字典,把所有的东西都扔进去。或者至少,只要能以某种方式给出指点,因为我想不出任何好的方法来解决这个问题。
  • 嗯,youtube 教程并不是参考您正在使用的某种库的好方法——实际存储数据的部分在您的问题中不可见,您能否提供指向源的链接或更有用的东西?尽管如此,仅存储您的字典并将它们作为单个条目重新加载似乎是合理的,而不是逐个键。另外,您为什么要随意更改键名?在您的示例中,名称没有重叠,只需按原样使用名称即可。如果您有重叠,则需要一个双向的独特映射。

标签: save load godot gdscript


【解决方案1】:

GDQuest 在该视频中使用的 KEY 值标识了调用save/load 方法的节点,而不是您单独保存的每条数据。 p>

你有很多选择来实现你想要的。这是两个简单的:

1 - 更符合视频的内容:创建一个字典以包含所有单独的信息,并将其存储在节点唯一键下。

...
func save(save_game:Resource):
    var node_data = {
        stats = stats,
        meta = meta,
    }
    
    save_game.data[KEY] = node_data
  
func load(save_game:Resource):
    stats = save_game.data[KEY].stats


    meta = save_game.data[KEY].meta

2 - 更符合您的尝试:为您存储的 每个 字典/元素创建唯一的 fixed 键,并使用它来保存/加载他们。

onready var KEY_STATS = name + "_stats" 
onready var KEY_META = name  + "_meta"
...

func save(save_game:Resource):
    save_game.data[KEY_STATS] = stats
    save_game.data[KEY_META] = meta
  
func load(save_game:Resource):
    meta = save_game.data[KEY_STATS]
    stats = save_game.data[KEY_META]

没有尝试过任何这些,但它至少应该是您的问题所在的参考。

对于以后的问题,请提供所有相关代码,或者如果源代码太大而无法包含在问题中,请至少提供指向源代码的链接。 https://stackoverflow.com/help/how-to-ask

【讨论】:

  • 不知何故我没有遇到这种解决方案,并决定暴力破解它。我将在 GDQuest 的视频上留下一个链接,以供将来尝试实现相同目标的任何人参考。谢谢你,祝你有美好的一天。 :)
猜你喜欢
  • 2017-11-29
  • 2011-06-22
  • 2019-11-14
  • 2011-09-16
  • 1970-01-01
  • 2012-04-27
  • 2021-11-30
  • 1970-01-01
  • 2013-12-12
相关资源
最近更新 更多