首页 > 解决方案 > 错误:“无效的获取索引'点'(在基础'空实例'上)”(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("../../../.. ...")但没有运气。

要获取的变量 (pointspointsAdder)

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

有人可以澄清为什么我会收到这个错误吗?它到底是什么意思?谢谢你的时间,我非常感谢任何帮助。

标签: godotgdscript

解决方案


好的,另一个编辑。我将保留我之前所做的编辑中的代码,以防您需要它以供参考。我称它为 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

推荐阅读