2

我想要变量

first_playthrough

false场景重新加载时,它将不再显示文本“来自 Number Guesser 的你好”。但它仍然显示它。

因此,它要么是:它从未变成false,要么它变成了false,但后来又回到了true

代码的缩短版本:

extends Node

var first_playthrough = true

func _ready():
  # this is here so it will show the message
  first_playthrough_checker()

func first_playthrough_checker():
  # problem here is that, the message below still shows even though i thought i set it to 'false' already.
  if first_playthrough == true:
    text_printer("Hello from Number Guesser!\n\n")

func _restart_game():
  #I've tried everywhere else. Thought it would work here. i was wrong.
  get_tree().reload_current_scene()
  first_playthrough = false

一种解决方案是持久数据存储。但也许对于像这样一个简单的游戏,它不再需要了?我在这里做错了什么?

如果需要,我会发布整个脚本。

4

1 回答 1

2

基于来自我发布问题的其他网站的答案。

在创建声明的单例全局变量first_playthrough后,我将脚本上变量的所有实例替换为globals.first_playthrough.

所以在代码的缩短版本中,这看起来像:

    扩展节点

    # 已经删除了这里的声明,因为它已经在 globals.gd 中声明了

    函数 _ready():
      # 这是这里,所以它会显示消息
      first_playthrough_checker()

    函数 first_playthrough_checker():
      # 下面的消息在 globals.first_playthrough 变为 false 后不再显示。
      如果 globals.first_playthrough:
        text_printer("来自号码猜测者的你好!\n\n")

    函数 _restart_game():
      #我没有测试过,但我怀疑重新加载场景后的线路会造成内存泄漏?
      #所以我在重新加载场景之前更改了 globals.first_playthrough 的值。
      globals.first_playthrough = false
      get_tree().reload_current_scene()

该脚本现在按预期工作。

通过学习使用单例,我了解到:

  • 即使在单个脚本项目中为类声明一个全局变量也不会使其成为真正的全局变量。
  • 一个对象只有在项目中这样声明时才是全局的。
  • 我应该记住,我仍在使用框架。
  • 使用 gdscript,我有 3 个选项来存储持久信息。其中2个是最推荐的。

单例文档链接: https ://docs.godotengine.org/en/3.1/getting_started/step_by_step/singletons_autoload.html?highlight=autoload

于 2019-05-14T20:59:49.310 回答