HOME / 第 3 部分 · 2D 游戏开发实战 / 第 16 课
MODULE 3 · 2D 游戏开发实战
第 16 课 · 2D 坐标系与变换
🎯 本课学习目标
- 理解 Godot 的 2D 坐标轴方向
- 掌握位置、旋转、缩放的属性与代码控制
- 学会节点的全局与局部变换
2D 游戏的一切都在坐标系统里发生。本课彻底搞懂 Godot 的坐标系与变换。
📖 详细教学步骤
Godot 的 2D 坐标系概念
- 原点 (0,0) 在左上角
- X 轴向右增大,Y 轴向下增大
- 屏幕右下角是 (宽, 高),例如 1280×720 的窗口右下是 (1280,720)
- 角度单位是弧度(不是角度),顺时针为正
💡 注意:很多传统数学坐标 Y 向上,Godot 的 2D 是 Y 向下,别搞反。
在检查器与代码里改位置实操
每个 Node2D 都有 position(位置)、rotation(旋转弧度)、scale(缩放):
GDSCRIPTextends Node2D
@onready var player = $Player # 获取名为 Player 的子节点
func _ready():
player.position = Vector2(100, 200) # 设置位置
player.rotation = 0.5 # 旋转 0.5 弧度 ≈ 28.6°
player.scale = Vector2(2, 2) # 放大 2 倍
全局位置 vs 局部位置概念
position:相对父节点的位置(局部)global_position:在整个世界中的位置(全局)- 父节点移动,子节点的 position 不变,但 global_position 会变
GDSCRIPTfunc _ready():
print("局部位置:", player.position)
print("全局位置:", player.global_position)
让物体动起来(移动)实操
在 _process 里每帧改变 position 就能移动:
GDSCRIPTvar speed = 200 # 每秒移动 200 像素
func _process(delta):
# 每帧向右移动,delta 保证速度与帧率无关
position.x += speed * delta
常用方向向量重点
记住这几个方向(Vector2):
GDSCRIPTvar UP = Vector2(0, -1) # 上(注意 Y 向下,所以上是 -1)
var DOWN = Vector2(0, 1) # 下
var LEFT = Vector2(-1, 0) # 左
var RIGHT = Vector2(1, 0) # 右
# 把某个方向归一化(长度=1)后乘以速度
var dir = Vector2(1, 1).normalized() # (0.707, 0.707)
position += dir * speed * delta
⚠️
物体往「上」跑结果往下了?
因为 Y 轴向下,想上移动要减 Y:position.y -= speed*delta 或用 Vector2(0,-1)。
⚠️
rotation 填 90 结果转得不对?
rotation 单位是弧度:90° = 1.5708 弧度。想用角度可以用 deg_to_rad(90),或直接写 rotation = PI/2。
🧪 动手试一试
🏋️ 课后练习
让一个 Sprite2D 以每秒 150 像素的速度向右移动,并在移动到 x>500 时让 print 输出'到达终点'。
position.x += 150*delta; if position.x > 500: print(...)
💡
调试坐标时,在检查器直接改 x/y 看主视图物体移动,最直观。
💡
弧度转角度:rad_to_deg(x);角度转弧度:deg_to_rad(x)。
🎓 本课小结
Godot 2D 坐标系原点在左上角,X 右 Y 下;position 相对父节点、global_position 相对世界;每帧乘 delta 移动保证速度稳定。