如何解决实例化导出变量不起作用,因此无法通过将其他场景添加为 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
时,它会被挂起,直到指定的信号发生,然后继续。在这种情况下,"physics_frame"
的 SceneTree
信号。 鉴于这是一个 "physics_frame"
,我使用的是 "idle_frame"
而不是 Area2D
。
当然,更惯用的写法是:
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
。但是,鉴于它是一个导出变量,我没有将其删除。
我也不确定你的轮换。但这是一个单独的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。