ERROR: "Invalid get index 'points' (on base 'null instance')" (Godot)
ERROR: "Invalid get index 'points' (on base 'null instance')" (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。
编辑#2 - 测试程序
好的,所以我制作了一个简单的 2D 场景,其中仅包含一个根节点和 2 个我命名为 "Test1" 和 "Test2" 的精灵。我将脚本附加到两个精灵节点,每个节点都包含一个名为 "points" 的变量。在第一个脚本中,我制作了 points = 60,000,000
,在第二个中,我制作了 points = 16
。在第一个脚本 (Test1) 中,我使用 onready var testNode
加载 Test2
节点并将其存储为变量 testNode
。然后我创建了一个简单的输入事件,当我按下分配给 "move forward" 的键时打印 testNode
变量的 points
值。预期的结果是将值 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
希望这个精简的示例可以帮助您深入了解正在发生的事情。希望对你有帮助。
编辑#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
我正致力于为我的游戏添加类似升级的系统,但在 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。
编辑#2 - 测试程序
好的,所以我制作了一个简单的 2D 场景,其中仅包含一个根节点和 2 个我命名为 "Test1" 和 "Test2" 的精灵。我将脚本附加到两个精灵节点,每个节点都包含一个名为 "points" 的变量。在第一个脚本中,我制作了 points = 60,000,000
,在第二个中,我制作了 points = 16
。在第一个脚本 (Test1) 中,我使用 onready var testNode
加载 Test2
节点并将其存储为变量 testNode
。然后我创建了一个简单的输入事件,当我按下分配给 "move forward" 的键时打印 testNode
变量的 points
值。预期的结果是将值 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
希望这个精简的示例可以帮助您深入了解正在发生的事情。希望对你有帮助。
编辑#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