Godot学习笔记(4)—— GDScript(3)

0. 信号

  信号是 Godot 中对象间传递的参数。使用信号有助于降低代码的耦合性,降低维护成本。

  但是如果使用不当,信号本身也会产生强耦合性。

  使用单例模式构建信号,优点是耦合性低,缺点是维护困难,尤其是当项目规模扩大的时候。而且单例都是全局模式,容易造成混淆。

1. 添加按钮

  新建一个Node2D场景,并将之前做好的Sprite.tscn拖放到Node2D上,成为Node2D的字场景并实例化。

  点选Node2D,添加一个类型为Button的新节点。

  选中并对Button进行拖放,选择屏幕右方的“节点”标签页,双击“pressed()”,就能打开信号连接的窗口。

  当前选中的节点为信号发出方,窗口中选择的节点为信号接收方。

  信号接收的通常方法命名为“_on_节点名_信号名”。

2. 修改脚本,用按钮控制图标的运动与停止。

  2.1 在on_button_pressed下加入控制进程的语句

func _on_Button_pressed():
    set_process(not is_processing())

  set_process方法可以用于控制进程的活动。

  is_processing方法用于返回进程的状态。

  使用not运算符,用来切换进程的状态。

  2.2 去除按键控制,改为自动运行。

  代码回退至之前,图标的运动和转动由程序计算得出。

复制代码
extends Sprite

var speed = 400
var angular_speed = PI

func _process(delta: float) -> void:
    rotation += angular_speed * delta
    var velocity = Vector2.UP.rotated(rotation) * speed
    position += velocity * delta

func _on_Button_pressed():
    set_process(not is_processing())
复制代码

  2.3 加入计时器

  点击Sprite节点,并添加新节点,这将为Sprite增加一个子节点。

  节点类型选择Timer。

  选择Timer节点,在右侧“检查器”中选择“Autostart”

  2.4 构造函数,初始化变量,并将计时器连接至精灵

func _ready():
    var timer = get_node("Timer")
    timer.connect("timeout", self, "_on_Timer_timeout")

  这里get_node的作用和new是一样的。

  connect()方法用于接收信号。

  2.5 接收信号

func _on_Timer_timeout():
    visible = not visible

  当收到自身的“timeout”信号后,调用函数,切换可见性。

3. 自定义信号

  定义信号:signal

signal health_depleted

  发出信号:emit_signal

func take_damage(amount):
    health -= amount
    if health <= 0:
        emit_signal("health_depleted")

  带参数的信号

signal health_changed(old_value, new_value)

  发出带参数的信号

func take_damage(amount):
    var old_health = health
    health -= amount
    emit_signal("health_changed", old_health, health)

 

posted @   羅生門  阅读(1089)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示