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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!