我在学习游戏编程时实现了一个简单的场景切换器。我按照这个 YouTube 教程并希望自己实现它。
首先是创建全局场景切换器,这是我的:
extends Node
var current_scene = null
func _ready() -> void:
var root = get_tree().root
current_scene = root.get_child(root.get_child_count() - 1)
func switch_scene(res_path):
call_deferred("_deferred_switch_scene", res_path)
func _deferred_switch_scene(res_path):
current_scene.free()
var s = load(res_path)
current_scene = s.instantiate()
get_tree().root.add_child(current_scene)
get_tree().current_scene = current_scene
然后我在这里的主要城镇实现了信号:
extends Node2D
func _on_house_one_door_body_entered(body):
SceneSwitcher.switch_scene("res://scenes/house_one.tscn")
当我按原样使用代码时,会导致灰屏。当我用“() -> void:”替换“body”时,主要城镇可以工作,但该功能不起作用。然而,当我走进门时,我确实在调试器中收到了这个错误:
emit_signalp:从信号“body_entered”调用到可调用时出错:“Node2D(pallettown.gd)::_on_house_one_door_body_entered”:方法需要 0 个参数,但使用 1 个参数调用。
所以我相信它正在识别碰撞。
玩家有一个角色body2d和一个碰撞形状2d,门有一个区域2d和一个启用了监控的碰撞形状2d。
事实上,你已经完全禁用了_on_house_one_door_body_entered信号,它有义务接收碰撞对象,但是你已经删除了它,它不再被调用。
为什么出现灰屏是没有场景的屏幕,事实上,旧场景已被删除,但新场景尚未创建,或者是在不可见的位置创建的。然后它也应该移动到 (0, 0) 或中心,具体取决于您的居中。
用于获取新场景的代码本身看起来并不可疑,我在我的项目中做了同样的事情并且它有效。