初识Godot(2)--编写脚本(续)

目录

一、处理

二、编组

三、一些重要方法

四、节点相关操作(通过代码)

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

四、节点相关操作(通过代码)

1.通过代码创建节点

请像其他任何基于类的数据类型一样,调用 .new() 方法。 例如:

var s
func _ready():
    s = Sprite.new() # Create a new sprite!
    add_child(s) # Add it as a child of this node.

2.删除节点

无论是在场景内还是场景外,都必须使用 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)

此两步过程的优点在于,打包的场景可以保持加载状态并可以随时使用,以便您可以根据需要创建尽可能多的实例。这对于在活动场景中快速实例化多个敌人、子弹、和其他实体特别有用。

除此以外还可以把脚本注册为类,有一点明白是什么意思,但又不确定,等哪一天用到了之后才能深刻理解。

你可能感兴趣的:(Godot学习,Godot,游戏引擎,学习日记)