Godot 4基于网格物品放置报错:Invalid get index '2' (on base: 'Array')
Godot 4中解决"Invalid get index '2' (on base: 'Array')"错误的方案
你遇到的数组索引错误,核心原因是访问了超出数组范围的索引,结合代码来看,主要有以下问题及修复方法:
1. 代码缩进错误导致逻辑异常
在_input函数里,var numY = multiY*tile_size一行有多余缩进,会导致变量作用域混乱,先修正缩进格式。
2. 鼠标坐标转换可能超出网格边界
你的网格大小是160x160,所以x、y的有效索引范围是0到159。但通过鼠标坐标计算出的multiX或multiY可能超出这个范围(比如点击画面边缘外区域),直接访问grid[multiX][multiY]就会触发索引错误。
用clamp函数限制坐标范围,确保索引始终在有效区间内:
var multiX = clamp(int(round(mouse_pos.x)/tile_size), 0, grid_size.x - 1) var multiY = clamp(int(round(mouse_pos.y)/tile_size), 0, grid_size.y - 1)
3. 网格尺寸类型优化
把grid_size从Vector2改为Vector2i,避免后续整数转换的潜在问题:
var grid_size = Vector2i(160,160)
修正后的完整代码
extends Node2D @onready var camp_fire = preload("res://src/Scenes/camp_fire.tscn") var tile_size = 16 enum {OBSTACTLE, COLLECTABLE, RESOURCE} var grid_size = Vector2i(160,160) var grid = [] func _ready(): for x in range(grid_size.x): grid.append([]) for y in range(grid_size.y): grid[x].append(null) var positions = [] for i in range(50): var xcoor = randi() % grid_size.x var ycoor = randi() % grid_size.y var grid_pos = Vector2i(xcoor, ycoor) if grid_pos not in positions: positions.append(grid_pos) func _input(event): if event.is_action_pressed("LeftClick"): var mouse_pos = get_global_mouse_position() var multiX = clamp(int(round(mouse_pos.x)/tile_size), 0, grid_size.x - 1) var numX = multiX * tile_size var multiY = clamp(int(round(mouse_pos.y)/tile_size), 0, grid_size.y - 1) var numY = multiY * tile_size var new_pos = Vector2(multiX, multiY) var new_camp_fire = camp_fire.instantiate() new_camp_fire.set_position(tile_size * new_pos) grid[multiX][multiY] = OBSTACTLE get_tree().root.get_node("World").get_node("PlayerBuildings").add_child(new_camp_fire)
内容的提问来源于stack exchange,提问作者nicktehboy meny
相关产品推荐
相关产品推荐

