Godot引擎中调用节点后岩石图片无法随鼠标移动的问题
问题解决:Godot中TextureRect无法访问position属性的错误
错误原因分析
你遇到的Invalid get Index 'position' (on base: 'TextureRect')错误,核心原因是TextureRect属于Control类节点,它的位置属性不是position(那是Node2D类节点的专属属性),而是rect_position。你把TextureRect当成Node2D来操作,自然会触发属性不存在的报错。
另外代码里还有个逻辑错误:Vector2(int(_target)+40, int(_target)+20)的写法不对,_target是Vector2类型,直接用int(_target)会把整个向量转成整数(结果完全不符合预期),应该分别取x、y分量来转换。
修复后的代码
方案1:保留TextureRect节点
把设置位置的代码改成用rect_position,同时修正向量分量的写法:
extends Camera2D const zone = 10 onready var rock = get_node("rocks_png_1") func _input(event: InputEvent) -> void: if event is InputEventMouseMotion: var _target = event.position if _target.length() < zone: self.position = Vector2(640,350) else: self.position = _target.normalized() * (_target.length() - zone) * 0.5 # 修正:用rect_position替代position,同时正确取向量的x、y分量 rock.rect_position = Vector2(int(_target.x) + 40, int(_target.y) + 20)
方案2:换成Sprite2D节点(更适合跟随相机的2D元素)
如果岩石不需要Control节点的布局功能,建议把rocks_png_1换成Sprite2D节点,这样就能正常使用position属性,只需修正向量分量的写法:
extends Camera2D const zone = 10 onready var rock = get_node("rocks_png_1") func _input(event: InputEvent) -> void: if event is InputEventMouseMotion: var _target = event.position if _target.length() < zone: self.position = Vector2(640,350) else: self.position = _target.normalized() * (_target.length() - zone) * 0.5 # 修正:正确取向量的x、y分量 rock.position = Vector2(int(_target.x) + 40, int(_target.y) + 20)
额外优化(实现沿+x轴移动的需求)
你提到想让岩石沿+x轴方向移动,那可以固定y轴位置,只让x跟随_target的x变化,比如:
# 以Sprite2D为例,TextureRect同理替换为rect_position rock.position = Vector2(int(_target.x) + 40, rock.position.y) # 或者直接固定一个y值,比如350 rock.position = Vector2(int(_target.x) + 40, 350)
内容的提问来源于stack exchange,提问作者Temmy
相关产品推荐
相关产品推荐

