0

我正在制作一个显示对话、选择、精灵、音频等的 API,在youtube上查找此视频后,我能够做到这一点,但我不断收到此错误invalid get '-1' (on base 'array'),这是我的代码,所以你可以看到

    extends Control 

onready var bg_rect = get_node("Media_Sys/BG_Rect")
onready var char_sprite = get_node("Media_Sys/Sprite")
onready var text_box = get_node("Dialog_Sys/Dialog_Text")
onready var text_nam = get_node("Dialog_Sys/Label/Name")
onready var click = get_node("ClickManager")

var player = []

var lu = "Lu"
var ciel = "Ciel"

func _ready():
    click.request_ready()


func write(char_name_str, text_str=null):

    if text_str == null:

        text_str = char_name_str
        char_name_str = ""

    player.push_front({"type": "dialogue","name": char_name_str, "text": text_str})

func write_component():

    text_nam.clear()
    text_box.clear()
    text_nam.add_text(player[player.size() - 1]["name"])#the debugger says the problem is here
    text_box.add_text(player[player.size() - 1]["text"])#as well as here if you remove the first line.
    player.pop_back()

func _input(event):

    if event is InputEventMouseButton:

        write_component()

有人说这是因为我没有定义数组的大小,有人说我的代码以某种方式将播放器设置为整数真的很奇怪。我已经检查了数组文档页面,但什么也没想到,我已经更改了代码中的一些小东西,但它仍然会产生同样的无效错误。

extends Node

onready var g = get_parent()

var lu = "Lu"
var ciel = "Ciel"


func _ready():
    g.write(lu, "hello")

需要注意的一件事是它确实显示了对话和名称,我只是在之后立即收到错误。

4

1 回答 1

1

您将player变量初始化为一个空列表。然后,在write_component中,您尝试使用计算出的索引[player.size() - 1]访问此列表。问题是如果 player 是空的,它会以 [0-1] 或 [-1] 作为索引,这在 GDScript 中是无效的。您的代码假定Write将首先被调用(有时可能),以便在调用write_component时播放器不为空。

最直接的解决方案是在尝试访问最后一个元素之前检查player.size() == 0是否。

func write_component():
    text_nam.clear()
    text_box.clear()
    if player.size() > 0:
        text_nam.add_text(player[player.size() - 1]["name"])
        text_box.add_text(player[player.size() - 1]["text"])        
        player.pop_back()
于 2018-12-07T01:37:13.623 回答