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

为何我的Line2D线段无法终止于鼠标光标位置?

Line2D线段终点无法对齐鼠标光标

问题现象

窗口模式效果:
Windowed
全屏模式效果:
Full screened

蓝色线段始终无法终止于鼠标光标处,尽管_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:12:14