You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:22:20