目录
一、处理
二、编组
三、一些重要方法
四、节点相关操作(通过代码)
1.通过代码创建节点
2.删除节点
五、实例化场景
Godot中的多个动作是由回调或虚函数触发的,因此无需编写始终运行的代码。
但是,在每一帧上都需要处理脚本仍然很常见。有两种处理类型:空闲处理和物理处理。
当在脚本中找到 Node._process() 方法时,将激活空闲处理。可以通过 Node.set_process() 函数来打开或关闭。
这个方法将在每次绘制帧时被调用:
func _process(delta):
# Do something...
pass
调用 _process()
的频率 取决于应用程序运行的每秒帧数(FPS)。该速率会随着时间和设备的不同而变化。
delta
参数包含自上次调用 _process()
以来经过的以秒为单位的时间,以浮点数表示。此参数可用于确保事物始终花费相同的时间,从而与游戏的FPS无关。例如,运动经常与时间增量相乘,以使运动速度既恒定又独立于帧速率。
通过例子来体会 _process()的用法:
创建具有单个Label节点的且带有以下脚本的场景(显示一个每帧增加的计数器):
extends Label
var accum = 0
func _process(delta):
accum += delta
text = str(accum) # 'text' is a built-in label property.
Godot还提供编组的功能,将一些节点放入group中,对它们一起进行操作,有两种方法进行编组:
第一个是从UI,使用 节点
面板下的 Groups
按钮
第二种方法是从代码。
func _ready():
add_to_group("enemies")
介绍如下
func _enter_tree():
# When the node enters the Scene Tree, it becomes active
# and this function is called. Children nodes have not entered
# the active scene yet. In general, it's better to use _ready()
# for most cases.
#当一个节点进入场景树中,它会被激活,并且这个方法会被调用。
#它的孩子结点不会进入这个激活的场景,在多数情况下最好使用_ready()方法。
pass
func _ready():
# This function is called after _enter_tree, but it ensures
# that all children nodes have also entered the Scene Tree,
# and became active.
#这个方法会在_enter_tree()方法之后调用,
#但是它能确保该节点以及它的孩子节点全部进入场景树并被激活。
pass
func _exit_tree():
# When the node exits the Scene Tree, this function is called.
# Children nodes have all exited the Scene Tree at this point
# and all became inactive.
#和进入场景树对应的功能:退出
pass
func _process(delta):
# This function is called every frame.
pass
func _physics_process(delta):
# This is called every physics frame.
pass
请像其他任何基于类的数据类型一样,调用 .new()
方法。 例如:
var s
func _ready():
s = Sprite.new() # Create a new sprite!
add_child(s) # Add it as a child of this node.
无论是在场景内还是场景外,都必须使用 free()
:
func _someaction():
s.free() # Immediately removes the node from the scene and frees it.
当一个节点被释放时, 它也会释放其所有子节点。因此, 手动删除节点比看起来简单得多。释放基节点, 那么子树中的其他所有东西都会随之消失。
当我们要删除当前“阻塞”的节点时,可能会发生这种情况,因为该节点正在发出信号或正在调用函数。这会导致游戏崩溃。使用调试器运行Godot通常能捕获这种情况并向您发出警告。
删除节点的最安全方法是使用 Node.queue_free()。 这将在空闲期间安全地删除节点。
func _someaction():
s.queue_free() # Removes the node from the scene and frees it when it becomes safe
从代码实例化场景分两个步骤完成。第一步是从硬盘驱动器加载场景:
var scene = load("res://myscene.tscn") # Will load when the script is instanced.
预加载可以更方便,因为它是在解析时发生的(仅适用于GDScript):
var scene = preload("res://myscene.tscn") # Will load when parsing the script.
但是 scene
还不是一个节点。它被打包在一个称为 PackedScene 的特殊资源中。要想创建实际的节点,就必须调用函数 PackedScene.instance()。这将返回可以添加到活动场景的节点树:
var node = scene.instance()
add_child(node)
此两步过程的优点在于,打包的场景可以保持加载状态并可以随时使用,以便您可以根据需要创建尽可能多的实例。这对于在活动场景中快速实例化多个敌人、子弹、和其他实体特别有用。
除此以外还可以把脚本注册为类,有一点明白是什么意思,但又不确定,等哪一天用到了之后才能深刻理解。