为何我的Line2D线段无法终止于鼠标光标位置?
Line2D线段终点无法对齐鼠标光标
问题现象
窗口模式效果:
全屏模式效果:
蓝色线段始终无法终止于鼠标光标处,尽管_process中打印的deltaPos与points[1]数值完全一致。Line2D节点是Area2D的子节点(下含Sprite2D对应方形建筑),最初已尝试修正鼠标(左上角原点)与线段点的坐标偏差,但问题仍存在。
错误原因
Line2D的add_point方法默认使用局部坐标(相对于父节点Area2D的位置),但原代码将鼠标全局坐标转换为了以屏幕中心为原点的坐标,该坐标与Line2D的局部坐标系统完全无关。渲染时线段点会叠加父节点的全局位置,导致视觉上出现偏移。
修复方案
直接使用Godot提供的坐标转换方法,将鼠标全局坐标转为Line2D的局部坐标,或者直接设置线段点的全局位置。
方案1:局部坐标转换
extends Line2D func _ready() -> void: var parent := get_parent() # 初始化线段起点为父节点的局部位置(Line2D原点对应父节点位置) add_point(Vector2.ZERO) add_point(Vector2.ZERO) func _process(delta: float) -> void: remove_point(1) # 将鼠标全局坐标转换为当前Line2D节点的局部坐标 var mouse_local_pos = to_local(get_global_mouse_position()) add_point(mouse_local_pos)
方案2:直接设置全局位置
无需手动处理坐标转换,直接用set_point_global_position设置线段点的全局位置:
extends Line2D func _ready() -> void: var parent := get_parent() # 初始化两个点的全局位置 set_point_global_position(0, parent.global_position) set_point_global_position(1, parent.global_position) func _process(delta: float) -> void: # 直接更新第二个点的全局位置为鼠标位置 set_point_global_position(1, get_global_mouse_position())
补充说明
to_local(global_pos):自动将全局坐标转换为当前节点的局部坐标,处理父节点的位置偏移set_point_global_position(index, global_pos):直接设置线段点的全局位置,无需关心局部坐标系统
内容的提问来源于stack exchange,提问作者Moustic_Bonjour
相关产品推荐
相关产品推荐

