HOME / 第 3 部分 · 2D 游戏开发实战 / 第 16 课
MODULE 3 · 2D 游戏开发实战

第 16 课 · 2D 坐标系与变换

⏱ 预计时长 25 分钟📊 难度 入门📚 模块 第 3 部分 · 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 移动保证速度稳定。