GDScript同一函数内作用域错误:象棋游戏开发疑问
象棋游戏GDScript变量未定义问题分析
原代码及错误
你编写的象棋棋盘生成代码如下:
func _ready() -> void: var x = Vector2(10,0) var y = Vector2(0,10) var white_sqaure = ImageTexture.create_from_image(Image.load_from_file("res://w_square.png")) var black_sqaure = ImageTexture.create_from_image(Image.load_from_file("res://b_sqaure.png")) for i in range(1,9): for j in range(1,9): print(i,j) var square = Node2D.new() square.set_position(i*x + j*y) self.add_child(square) var sprite = Sprite2D.new() if (i+j)%2 == 0: sprite.texture = black_square pass else: sprite.texture = white_square pass square.add_child(sprite) pass # Replace with function body.
运行时触发错误:
第18行:Identifier "black_square" not declared in the current scope.
第21行:Identifier "white_square" not declared in the current scope.
问题根源
这是变量名拼写不一致导致的低级错误:
- 定义变量时写的是
white_sqaure和black_sqaure(注意单词是sqaure,少了字母u) - 但在if/else分支里使用的是
white_square和black_square(正确拼写square)
GDScript对变量名的拼写、大小写严格匹配,编译器找不到拼写错误的变量,所以抛出未声明的错误。这和你用Image.load_from_file还是load函数无关——你后来用load能解决,只是因为新代码里变量名(ws/bs)和后续使用的名称一致了,本质是间接修正了拼写问题。
修正方案(无需更换load函数)
只要把定义变量时的拼写改对,原方法完全可以正常运行:
func _ready() -> void: var x = Vector2(10,0) var y = Vector2(0,10) # 修正拼写:sqaure → square var white_square = ImageTexture.create_from_image(Image.load_from_file("res://w_square.png")) var black_square = ImageTexture.create_from_image(Image.load_from_file("res://b_square.png")) for i in range(1,9): for j in range(1,9): print(i,j) var square = Node2D.new() square.set_position(i*x + j*y) self.add_child(square) var sprite = Sprite2D.new() if (i+j)%2 == 0: sprite.texture = black_square else: sprite.texture = white_square square.add_child(sprite)
另外,GDScript里pass是逻辑占位符,实际有执行逻辑的分支里不需要额外添加,可直接删除。
内容的提问来源于stack exchange,提问作者ananta
相关产品推荐
相关产品推荐

