使用导出变量实例化不起作用,因此无法通过将其他场景添加为 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
。但是,鉴于它是一个导出变量,我没有删除它。
我也不确定你的轮换情况。但这是一个单独的问题。
我正在用 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
。但是,鉴于它是一个导出变量,我没有删除它。
我也不确定你的轮换情况。但这是一个单独的问题。