godot - 错误:“无效的获取索引'点'(在基础'空实例'上)”(Godot)
问题描述
我正在努力为我的游戏添加一个类似升级的系统,但遇到了一些问题get_tree().get_root().get_node()
。
在尝试检索多层不同的节点时,我会出错
ERROR: Attempt to call function 'get_root' in base 'null instance'\ on a null instance.
如果我是正确的,这意味着它无法在树中找到节点。
我也尝试过使用get_parent().get_parent()...
,get_node("../../../.. ...")
但没有运气。
要获取的变量 (points
和pointsAdder
)
extends Area2D
var points = 0.000000000001
var pointAdder = 1
var pointMultiplier = 1
var mouseover = false
var unit
var defaultArrow = load("defaultCursor_16x16.png")
var clickableCursor = load("clickableCursor.png")
func _ready():
get_parent().get_node("scoreLabel").text = "Logs: 0"
func _input(event):
if mouseover and event is InputEventMouseButton and event.pressed and event.button_index == BUTTON_LEFT:
points = (pointAdder* pointMultiplier) +points
if points < 1000:
set_label_text(points)
elif points >= 1000 and points < 1000000:
set_label_text(str(points / 1000) + " K")
unit = "thousand"
set_unit_text()
elif points >= 1000000 and points < 1000000000:
set_label_text(str(points / 1000000) + " M")
unit = "million"
set_unit_text()
elif points >= 1000000000 and points < 1000000000000:
set_label_text(str(points / 1000000000) + " B")
unit = "billion"
set_unit_text()
elif points >= 1000000000000:
set_label_text(str(points / 1000000000000) + " T")
unit = "trillion"
set_unit_text()
elif Input.is_key_pressed(KEY_SPACE) and not event.is_echo():
points = (pointAdder* pointMultiplier) +points
if points < 1000:
set_label_text(points)
elif points >= 1000 and points < 1000000:
set_label_text(str(points / 1000) + " K")
unit = "thousand"
set_unit_text()
elif points >= 1000000 and points < 1000000000:
set_label_text(str(points / 1000000) + " M")
unit = "million"
set_unit_text()
elif points >= 1000000000 and points < 1000000000000:
set_label_text(str(points / 1000000000) + " B")
unit = "billion"
set_unit_text()
elif points >= 1000000000000:
set_label_text(str(points / 1000000000000) + " T")
unit = "trillion"
set_unit_text()
func _on_Area2D_mouse_entered():
Input.set_custom_mouse_cursor(clickableCursor)
mouseover = true
func _on_Area2D_mouse_exited():
Input.set_custom_mouse_cursor(defaultArrow)
mouseover = false
func set_label_text(text_to_send):
get_parent().get_node("scoreLabel").text = ("Logs: "+str(text_to_send))
func set_unit_text():
get_parent().get_node("scoreUnitLabel").text = unit
我试图在其中检索它们的代码:
Extends Button
var points_cost = 10
func _on_Button_down():
if get_tree().get_root().get_node("treeClickableArea").points >= points_cost:
points_cost = (points_cost/2) + points_cost
get_tree().get_root().get_node("treeClickableArea").pointAdder = get_tree().get_root().get_node("").pointAdder + 1
get_tree().get_root().get_node("treeClickableArea").points = get_tree().get_root().get_node("treeClickableArea").points - points_cost
\节点树:
┖╴Spatial
┠╴○ backgroundMap2
┠╴▦ backgroundMap
┠╴☺ scoreBackground
┠╴Tᵀ scoreLabel
┠╴Tᵀ scoreUnitLabel
┠╴☺ logSymbol
┠╴▭ treeClickableArea
┃ ┠╴☺ treeSprite
┃ ┖╴treeCollider
┠╴☺ upgradeBackground
┖╴▣ tabContainer
┠╴▯ perClick
┃ ┠╴perUpgradeScroll
┃ ┃ ┖╴▬ Button [scriptHavingIssuesHere]
┃ ┖╴Tᵀ Label
┖╴▯ perClickMultiplier
有人可以澄清为什么我会收到这个错误吗?它到底是什么意思?谢谢你的时间,我非常感谢任何帮助。
解决方案
好的,另一个编辑。我将保留我之前所做的编辑中的代码,以防您需要它以供参考。我称它为 EDIT#1。
我发布的新示例来自我制作的一个非常简单的测试程序。我将其称为 EDIT#2。
EDIT#2 - 测试程序
好的,所以我制作了一个简单的 2D 场景,其中仅包含一个根节点和两个我命名为“Test1”和“Test2”的精灵。我在两个精灵节点上附加了一个脚本,每个节点都包含一个名为“points”的变量。在我制作的第一个脚本points = 60,000,000
中,在第二个脚本中,我制作了points = 16
. 在第一个脚本(Test1)中,我曾经onready var testNode
加载Test2
节点并将其存储为变量testNode
。然后我做了一个简单的输入事件,当我按下分配给“向前移动”的键时打印变量的points
值。testNode
预期的结果是将值 16 打印到控制台,尽管两个脚本都包含一个名为points
每个都有不同的值(以证明我从第二个脚本中获取了数字)。对我来说,它工作得很好。这是我用于脚本的代码:
节点设置
-Node2d
--Test1(sprite) - script 1
--Test2(sprite) - script 2
脚本 1 -
extends Sprite
var points = 60000000
onready var testNode = get_parent().get_node("Test2")
func _input(event):
if Input.is_action_just_pressed("move_forward"):
print(testNode.points)
脚本 2 -
extends Sprite
var points = 16
希望这个精简的示例可以帮助您深入了解正在发生的事情。希望能帮助到你。
EDIT#1 - (以前的)新代码示例 - 供参考
我更改了代码以更能反映我们的讨论。这就是它的最终形式。treePoints
请注意,为了清楚起见,我将变量的名称更改treeClickNode
为 。
extends Button
var points_cost = 10
onready var treeClickNode = get_tree().get_root().get_node("treeClickableArea")
func _on_Button_down():
if treeClickNode.points >= points_cost:
points_cost = (points_cost/2) + points_cost
treeClickNode.pointAdder += 1
treeClickNode.points = treeClickNode.points - points_cost
推荐阅读
- csv - 使用 Google Apps 脚本将新的 csv 文件更新到 G 驱动器后,如何用新数据覆盖同一张工作表
- python - 当我打开 csv,处理文件并删除列时,文件大小变大
- sql - WITH READ UNCOMMITED 和 Setting Transaction iso level 之间的区别
- python - 解释 GPFlow 中约束参数的先验
- python - 如何使用 PVLIB 构建通用 pvsystem
- mysql - 在 MySql 表中加载具有唯一 ID 的 mysql 中的每个文件
- javascript - 如何从 json 文件中读取对象 URI(JSON 文件)
- android - 如何使数据绑定与 xml 属性一起工作?
- javascript - D3 无法导入数据中指定的自定义 id 的 json 数据
- matlab - 两个代码有什么区别?