Значение глобальной переменной gdscript не меняется после get_tree (). reload_current_scene () - PullRequest
2 голосов
/ 14 мая 2019

Я хотел переменную

first_playthrough

, чтобы стать false, поэтому, когда сцена перезагружается, больше не будет отображаться текст "Привет из числа гадателей" . Но это все еще показывает это.

Следовательно, это либо: оно никогда не становилось 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

Одним из решений было бы постоянное хранение данных. Но, может быть, для такой простой игры, как эта, она больше не нужна? Что я здесь не так делаю?

При необходимости я выложу весь сценарий.

1 Ответ

2 голосов
/ 14 мая 2019

Опираясь на ответ с другого сайта, где я также разместил вопрос.

После создания синглтона globals , где объявлено first_playthrough, я заменил все экземпляры переменной в скрипте на globals.first_playthrough.

Таким образом, в сокращенной версии кода это выглядит следующим образом:


    extends Node

    # removed the declaration here already, since it's already declared in globals.gd

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

    func first_playthrough_checker():
      # message below doesn't show anymore after globals.first_playthrough becomes false.
      if globals.first_playthrough:
        text_printer("Hello from Number Guesser!\n\n")

    func _restart_game():
      #I haven't tested it but i suspect the line after reloading the scene will create a memory leak?
      #So i changed globals.first_playthrough's value before reloading the scene instead.
      globals.first_playthrough = false
      get_tree().reload_current_scene()

Скрипт работает так, как задумано.

Научившись использовать синглетоны , я узнал, что:

  • Объявление переменной, глобальной для класса, даже в одном скрипте проект не делает его действительно глобальным.
  • Объект является глобальным, только если он объявлен в проекте как таковой.
  • Я должен помнить, что я все еще использую фреймворк.
  • В gdscript у меня есть 3 варианта для хранения постоянной информации. 2 из которых наиболее рекомендуются.

Ссылка на документацию Singleton: https://docs.godotengine.org/en/3.1/getting_started/step_by_step/singletons_autoload.html?highlight=autoload

...