Godot开发糖果消除游戏报Invalid get index 'x'错误求解
问题根因
你遇到的Invalid get index 'x'报错是代码里的变量引用错误导致的,和教程版本新旧关系不大,报错里的x是某次循环时随机数rand的具体取值,不是你代码里写了名为x的属性。
核心错误点:
- 你在
spawn_pieces()的while循环判断中,错误地对单个节点实例使用了数组下标访问:写了piece[rand].color。这里的piece是通过.instance()实例化出来的单个糖果节点,不是数组,不支持用[数字]的形式访问内部属性,Godot找不到对应数字命名的属性就会抛出无效索引的错误。正确写法应该直接访问实例的颜色属性piece.color。 - 逻辑隐患:
match_at()函数末尾只有pass,没有匹配时不会显式返回false,虽然靠null的隐式转换能跑,但容易埋下逻辑bug。 - 额外注意:如果你后续升级到Godot 4,旧教程里的
.instance()方法需要改名为.instantiate(),导出变量语法也要从export (int) var 变量名改成@export var 变量名: int,你当前没报编译错误说明用的是Godot 3版本,暂时不用调整。
修正后代码
修正后的spawn_pieces函数
func spawn_pieces(): for i in width: for j in height: #choose a random number and store it var rand = floor(rand_range(0, possible_pieces.size())) var piece = possible_pieces[rand].instance() var loops = 0 # 修正索引错误,同时把循环次数判断放前面避免无效计算 while loops < 100 && match_at(i, j, piece.color): rand = floor(rand_range(0, possible_pieces.size())) loops += 1 # 释放不符合要求的废弃实例,避免内存泄漏 piece.queue_free() piece = possible_pieces[rand].instance() #instance that piece from the array add_child(piece) piece.position = grid_to_pixel(i, j) all_pieces[i][j] = piece
修正后的match_at函数
func match_at(i, j, color): if i > 1: if all_pieces[i - 1][j] != null && all_pieces[i - 2][j] != null: if all_pieces[i - 1][j].color == color && all_pieces[i - 2][j].color == color: return true if j > 1: if all_pieces[i][j - 1] != null && all_pieces[i][j - 2] != null: if all_pieces[i][j - 1].color == color && all_pieces[i][j - 2].color == color: return true # 无匹配时显式返回false return false
其余代码不用改动,替换后即可正常运行,初始生成糖果时不会出现连续3个同色的情况,也不会再抛索引错误。
内容的提问来源于stack exchange,提问作者RodLod
相关产品推荐
相关产品推荐

