scene_tree.rst 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. SceneTree
  2. =========
  3. Introduction
  4. ------------
  5. | This is where things start getting abstract, but don't panic, as
  6. there's not really more depth than this.
  7. | In previous tutorials, everything revolves around the concept of
  8. Nodes, scenes are made of them, and they become active once they enter
  9. the *Scene Tree*.
  10. This deserves going a little more into depth. In fact, the scene system
  11. is not even a core component of Godot, as it is possible to skip it and
  12. make a script (or C++ code) that talks directly to the [[Servers]]. But
  13. making a game that way would be a lot of work and is reserved for other
  14. uses.
  15. MainLoop
  16. --------
  17. | The way Godot works internally is as follows. There is the the
  18. `OS <https://github.com/okamstudio/godot/wiki/class_os>`__ class,
  19. which is the only instance that runs at the beginning. Afterwards, all
  20. drivers, servers, scripting languages, scene system, etc are loaded.
  21. | When initialization is complete,
  22. `OS <https://github.com/okamstudio/godot/wiki/class_os>`__ needs to be
  23. supplied a
  24. `MainLoop <https://github.com/okamstudio/godot/wiki/class_mainloop>`__
  25. to run. Up to this point, all this is internals working (you can check
  26. main/main.cpp file in the source code if you are ever interested to
  27. see how this works internally).
  28. The user program, or game, starts in the MainLoop. This class has a few
  29. methods, for initialization, idle (frame-syncronized callback), fixed
  30. (physics-synchronized callback), and input. Again, this is really low
  31. level and when making games in Godot, writing your own MainLoop does not
  32. even make sense.
  33. SceneTree
  34. ---------
  35. | One of the ways to explain how Godot works, is that it's a high level
  36. game engine over a low level middleware.
  37. | The scene system is the game engine, while the
  38. `OS <https://github.com/okamstudio/godot/wiki/class_os>`__ and servers
  39. are the low level API.
  40. | In any case, the scene system provides it's own main loop to OS,
  41. `SceneTree <https://github.com/okamstudio/godot/wiki/class_scenetree>`__.
  42. | This is automatically instanced and set when running a scene, no need
  43. to do any extra work.
  44. It's important to know that this class exists because it has a few
  45. important uses:
  46. - It contains the root
  47. `Viewport <https://github.com/okamstudio/godot/wiki/class_viewport>`__,
  48. when a scene is first opened, it's added as a child of it to become
  49. part of the *Scene Tree* (more on that next)
  50. - It contains information about the groups, and has means to call all
  51. nodes in a group, or get a list of them.
  52. - It contains some global state functionality, such as setting pause
  53. mode, or quitting the process.
  54. When a node is part of the Scene Tree, the
  55. `SceneTree <https://github.com/okamstudio/godot/wiki/class_scenemainloop>`__
  56. singleton can be obtained by simply calling
  57. `Node.get\_tree() <https://github.com/okamstudio/godot/wiki/class_node#get_tree>`__.
  58. Root Viewport
  59. -------------
  60. The root
  61. `Viewport <https://github.com/okamstudio/godot/wiki/class_viewport>`__
  62. is always a top of the scene. From a node, it can be obtained in two
  63. different ways:
  64. ::
  65. get_tree().get_root() # access via scenemainloop
  66. get_node("/root") # access via absolute path
  67. This node contains the main viewport, anything that is a child of a
  68. `Viewport <https://github.com/okamstudio/godot/wiki/class_viewport>`__
  69. is drawn inside of it by default, so it makes sense that the top of all
  70. nodes is always a node of this type, otherwise nothing would be seen!
  71. While other viewports can be created in the scene (for split-screen
  72. effects and such), this one is the only one that is never created by the
  73. user. It's created automatically inside SceneTree.
  74. Scene Tree
  75. ----------
  76. | When a node is connected, directly or indirectly, to the root
  77. viewport, it becomes part of the *Scene Tree*.
  78. | This means that, as explained in previous tutorials, will get the
  79. \_enter\_tree() and \_ready() callbacks (as well as \_exit\_tree()).
  80. .. image:: /img/activescene.png
  81. When nodes enter the *Scene Tree*, they become active. They get access
  82. to everything they need to process, get input, display 2D and 3D,
  83. notifications, play sound, groups, etc. When they are removed from the
  84. *Scene Tree*, they lose it.
  85. Tree Order
  86. ----------
  87. Most node operations in Godot, such as drawing 2D, processing or getting
  88. notifications are done in tree order. This means that parents and
  89. siblings with less order will get notified before the current node.
  90. .. image:: /img/toptobottom.png
  91. "Becoming Active" by entering the *Scene Tree* In Detail
  92. --------------------------------------------------------
  93. #. A scene is loaded from disk or created by scripting.
  94. #. The root node of that scene (only one root, remember?) is added as
  95. either a child of the "root" Viewport (from SceneTree), or to any
  96. child or grand-child of it.
  97. #. Every node of the newly added scene, will receive the "enter\_tree"
  98. notification ( \_enter\_tree() callback in GDScript) in top-to-bottom
  99. order.
  100. #. An extra notification, "ready" ( \_ready() callback in GDScript) is
  101. provided for convenience, when a node and all it"™s children are
  102. inside the active scene.
  103. #. When a scene (or part of it) is removed, they receive the "exit
  104. scene" notification ( \_exit\_tree() callback in GDScript) in
  105. bottom-to-top order
  106. Changing Current Scene
  107. ----------------------
  108. After a scene is loaded, it is often desired to change this scene for
  109. another one. The simple way to do this to use the
  110. `SceneTree.change\_scene <https://github.com/okamstudio/godot/wiki/class_scenetree#change_scene>`__
  111. function:
  112. ::
  113. func _my_level_was_completed():
  114. get_tree().change_scene("res://levels/level2.scn")
  115. This is a quick and useful way to switch scenes, but has the drawback
  116. that the game will stall until the new scene is loaded and running. At
  117. some point in your game, it may be desired to create proper loading
  118. screens with progress bar, animated indicators or thread (background)
  119. loading. This must be done manually using autoloads (see next chapter!)
  120. and [[Background Loading]].
  121. *Juan Linietsky, Ariel Manzur, Distributed under the terms of the `CC
  122. By <https://creativecommons.org/licenses/by/3.0/legalcode>`__ license.*