Godot 4 场景切换导致使用参数时无场景,使用 void 时显示场景

问题描述 投票:0回答:1

我在学习游戏编程时实现了一个简单的场景切换器。我按照这个 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。

signals godot scene
1个回答
0
投票

事实上,你已经完全禁用了_on_house_one_door_body_entered信号,它有义务接收碰撞对象,但是你已经删除了它,它不再被调用。

为什么出现灰屏是没有场景的屏幕,事实上,旧场景已被删除,但新场景尚未创建,或者是在不可见的位置创建的。然后它也应该移动到 (0, 0) 或中心,具体取决于您的居中。

用于获取新场景的代码本身看起来并不可疑,我在我的项目中做了同样的事情并且它有效。

© www.soinside.com 2019 - 2024. All rights reserved.