DampedSpringJoint2D
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — DampedSpringJoint2D
DampedSpringJoint2D
节点继承关系
继承链:Node → CanvasItem → Node2D → Joint2D → DampedSpringJoint2D
继承自 Joint2D
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | NodeA | 连接的第一个物体 |
| 属性 | NodeB | 连接的第二个物体 |
继承自 Node2D
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Position | 本地位置(相对于父节点) |
| 属性 | GlobalPosition | 全局位置 |
| 属性 | Rotation | 旋转角度(弧度) |
| 属性 | Scale | 缩放比例 |
| 属性 | Skew | 倾斜角度(弧度) |
| 方法 | Rotate() | 旋转指定弧度 |
| 方法 | ToGlobal() | 本地坐标转全局坐标 |
| 方法 | ToLocal() | 全局坐标转本地坐标 |
继承自 CanvasItem
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Visible | 是否可见 |
| 属性 | Modulate | 整体颜色叠加(乘法) |
| 属性 | SelfModulate | 自身颜色叠加(不影响子节点) |
| 属性 | ZIndex | 绘制层级(Z 轴排序) |
| 信号 | visibility_changed | 可见性变化时触发 |
| 方法 | GetGlobalMousePosition() | 获取鼠标全局坐标 |
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
像一根弹簧——两个物体之间有弹性连接,拉开后会被拉回来,同时有阻尼防止无限振荡。
想象你拉一根弹簧——拉得越长,回弹的力越大。但如果没有阻尼(摩擦),弹簧会永远来回振动。DampedSpringJoint2D 既有弹性又有阻尼,所以拉开后会振荡几下然后停下来。
使用频率:★ 基本用不到——用于弹簧效果。
节点用途
- 悬挂物体(弹簧悬挂)
- 弹跳平台
- 弹簧床
- 弹弓
使用场景
典型场景
- 弹跳平台:玩家站在平台上,平台像弹簧一样把玩家弹起来
- 弹簧绳:两个物体之间用弹簧连接
- 弹弓:拉开后弹射出去
不适用场景
- 不需要弹性的刚性连接 → 使用 PinJoint2D
- 需要沿轨道滑动 → 使用 GrooveJoint2D
常用节点搭配
| 搭配节点 | 用途 | 必需? |
|---|---|---|
| RigidBody2D(NodeA) | 第一个物体 | 必需 |
| RigidBody2D(NodeB) | 第二个物体 | 必需 |
典型节点树:
SpringSystem (Node2D)
├── Anchor (StaticBody2D)
├── DampedSpringJoint2D(连接 Anchor 和 Bob)
└── Bob (RigidBody2D)
├── CollisionShape2D
└── Sprite2D生效必备素材/资源
| 资源 | 类型 | 说明 |
|---|---|---|
| 碰撞形状 | Shape2D 资源 | 两个连接物体都需要 |
节点属性与信号
核心属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
NodeA | NodePath | "" | Joint2D | 第一个物体 |
NodeB | NodePath | "" | Joint2D | 第二个物体 |
Stiffness | float | 20.0 | — | 弹簧刚度(越大越硬,弹力越大) |
Damping | float | 1.0 | — | 阻尼系数(越大弹跳衰减越快,0 = 永远弹跳) |
RestLength | float | 0.0 | — | 弹簧自然长度(不拉伸也不压缩时的长度) |
Bias | float | 0.3 | — | 约束求解偏差 |
DisableCollision | bool | true | Joint2D | 是否禁用连接物体之间的碰撞 |
信号
| 信号 | 触发时机 | 继承自 | 说明 |
|---|---|---|---|
| 无自有信号 | — | — | — |
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
GetNodeA() | NodePath | 获取第一个物体路径 |
GetNodeB() | NodePath | 获取第二个物体路径 |
代码示例
C
using Godot;
/// <summary>
/// 弹跳平台:玩家踩上去会被弹飞
/// 节点结构:
/// BouncyPlatform (StaticBody2D)
/// ├── CollisionShape2D
/// ├── DampedSpringJoint2D(连接自身和弹簧板)
/// └── SpringBoard (RigidBody2D)
/// ├── CollisionShape2D
/// └── Sprite2D
/// </summary>
public partial class BouncyPlatform : Node2D
{
public override void _Ready()
{
var joint = GetNode<DampedSpringJoint2D>("DampedSpringJoint2D");
joint.NodeA = GetNode<StaticBody2D>("Base").GetPath();
joint.NodeB = GetNode<RigidBody2D>("SpringBoard").GetPath();
// 弹簧参数
joint.Stiffness = 80.0f; // 弹簧很硬
joint.Damping = 3.0f; // 适度阻尼
joint.RestLength = 20.0f; // 自然长度
}
}GDScript
# 弹跳平台:玩家踩上去会被弹飞
# 节点结构:
# BouncyPlatform (StaticBody2D)
# ├── CollisionShape2D
# ├── DampedSpringJoint2D(连接自身和弹簧板)
# └── SpringBoard (RigidBody2D)
# ├── CollisionShape2D
# └── Sprite2D
extends Node2D
func _ready() -> void:
var joint := $DampedSpringJoint2D
joint.node_a = $Base.get_path()
joint.node_b = $SpringBoard.get_path()
# 弹簧参数
joint.stiffness = 80.0 # 弹簧很硬
joint.damping = 3.0 # 适度阻尼
joint.rest_length = 20.0 # 自然长度调节弹簧参数的经验
- Stiffness(刚度):值越大,弹簧越硬,弹力越大。太大会导致不稳定
- Damping(阻尼):0 = 永远弹跳(不衰减),值越大停得越快。一般 1~5 之间
- RestLength(自然长度):弹簧不施加力的长度。拉开超过这个长度会产生拉力,压缩小于这个长度会产生推力
