使用导出变量实例化不起作用,因此无法通过将其他场景添加为 Main 的子场景来克隆场景

Instancing with export variables not working, so, not able to clone scenes by adding other scenes as a child of the Main

我正在用 Godot 编写一个星星收集游戏,但在尝试添加一个场景作为主场景的子场景(首先开始的场景,以及我正在执行实例化的场景)时,它不起作用,相反,调试屏幕滞后太多,以至于显示“无响应”。我正在用 GDScript 编码。这是我在主场景中编写的用于实例化的代码:

extends Node2D

export (PackedScene) var Star

func _ready():
    pass

func _on_Timer_timeout():
    var star = Star.instance()
    add_child(star)

我还在脚本变量部分插入了我想要实例化的所需场景(抱歉,因为我是 Godot 的新手,我无法很好地解释这些术语): Script Variables section

这是我正在实例化的场景的代码:

extends Area2D

export var done = 0
export var speed = 43
export var spinVal = 0
export var dir = 0

func _ready():
    done=0
    dir=5-(randf()*10)
    spinVal = 5-(randf()*10)
    position.x=randf()*10
    position.y=-20
    while done==0:
        position.y+=speed
        rotation_degrees=0+dir
        rotate(spinVal)
    print(position)


func _on_VisibilityNotifier2D_screen_exited():
    if (position.y<720):
            done=1
            queue_free()

之前,我在使用PackedScene方法之前尝试过简单的实例化方法,但我遇到了同样的问题。现在我正在尝试这种方式,但没有任何改进...

你的实例化没问题。你的场景错了

一旦您使用 add_child 添加实例化场景,它 _ready 就会 运行。还有这个:

func _ready():
    done=0
    dir=5-(randf()*10)
    spinVal = 5-(randf()*10)
    position.x=randf()*10
    position.y=-20
    while done==0:
        position.y+=speed
        rotation_degrees=0+dir
        rotate(spinVal)

嗯,那是一个无限循环。第一行确保 done 为 0。并且其中的任何内容都不会将 done 设置为其他内容。游戏卡在那里。


我看到你在其他地方设置了 done:

func _on_VisibilityNotifier2D_screen_exited():
    if (position.y<720):
            done=1
            queue_free()

然而,该代码从未有机会 运行。


如果您真的非常想在 _ready 中写下您的动议。你可以这样做:

func _ready():
    done=0
    dir=5-(randf()*10)
    spinVal = 5-(randf()*10)
    position.x=randf()*10
    position.y=-20
    while done==0:
        yield(get_tree(), "physics_frame") # <--
        position.y+=speed
        rotation_degrees=0+dir
        rotate(spinVal)

当代码到达yield时,它会被挂起,直到指定的信号发生,然后继续。在这种情况下,SceneTree"physics_frame" 信号。 鉴于这是 Area2D.

,我使用 "physics_frame" 而不是 "idle_frame"

更惯用的写法当然是:

extends Area2D

export var done = 0
export var speed = 43
export var spinVal = 0
export var dir = 0

func _ready():
    done=0
    dir=5-(randf()*10)
    spinVal = 5-(randf()*10)
    position.x=randf()*10
    position.y=-20

func _physics_process(_delta):
    if done != 0:
        return

    position.y+=speed
    rotation_degrees=0+dir
    rotate(spinVal)

func _on_VisibilityNotifier2D_screen_exited():
    if (position.y<720):
            done=1
            queue_free()

老实说,我认为您根本不需要 done。但是,鉴于它是一个导出变量,我没有删除它。

我也不确定你的轮换情况。但这是一个单独的问题。