Godot技术问题:get_global_position获取位置异常致连线方向错误
解决Godot中连线方向偏差的问题
嘿,作为新手碰到这个问题太正常了,我来帮你捋清楚问题出在哪~
核心问题:point_a的位置没有实时更新
你现在的代码里,point_a是在变量定义阶段就调用了self.get_global_position(),这时候你的Area2D节点还没完全加载到场景的正确位置(甚至可能还在初始的(0,0)点),而且之后这个值再也没更新过!不管你的节点怎么移动,连线的起点一直是这个旧的初始位置,自然和预期方向偏差极大。
另外还有几个小细节也会影响效果:
point_b初始设为0,这不是Vector2类型,容易引发类型错误,应该用Vector2.ZERO初始化。_draw()里画完线就把draw_line设为false,导致如果持续和目标区域重叠,连线会闪烁甚至消失。
修正后的代码
extends Area2D var point_a: Vector2 = Vector2.ZERO var point_b: Vector2 = Vector2.ZERO var draw_line = false func _process(delta): # 关键:每一帧都更新当前节点的实时全局位置 point_a = self.get_global_position() # 先重置状态,避免离开重叠区域后还画旧连线 draw_line = false point_b = Vector2.ZERO var overlapping_areas = get_overlapping_areas() for area in overlapping_areas: if area.is_in_group("Location"): point_b = area.get_global_position() draw_line = true break # 如果只需要连接一个相邻点位,加break避免被多个覆盖 # 触发_draw函数更新绘制内容 update() func _draw(): if draw_line: # 用实时更新的point_a和point_b画线 draw_line(point_a, point_b, Color(1, 1, 1, 1), 2)
关键修改点说明
- 实时更新
point_a:把point_a的赋值移到_process里,确保每一帧都获取节点当前的全局位置,这样连线的起点才是你节点的真实位置。 - 规范变量类型:用
Vector2.ZERO初始化位置变量,避免类型不匹配的问题。 - 重置状态逻辑:在
_process开头重置draw_line和point_b,这样当节点离开重叠区域时,不会继续绘制旧的连线。 - 移除
_draw里的状态重置:把draw_line = false从_draw里删掉,让_process来控制是否需要画线,保证持续重叠时连线稳定显示。
新手额外提示
如果你的节点是静止不动的,也可以把point_a的赋值放到_ready()函数里(节点进入场景树后自动调用),但如果节点会移动,还是要在_process里实时更新哦~
内容的提问来源于stack exchange,提问作者AbsolutePickle42
相关产品推荐
相关产品推荐

