今天上午那篇讲的是「输入缓冲」(手感的底层),这篇换到画面纵深。2D 游戏最廉价、性价比最高的一次「画面升级」不是换引擎、不是加特效,而是把一张平铺背景拆成几层、让它们以不同速度滚动——也就是视差滚动(Parallax)。它不改玩法、不增加多少资源,却能让画面瞬间从「贴纸」变成「世界」。Godot 4.3 起用新的 Parallax2D 节点取代了旧的 ParallaxBackground / ParallaxLayer,官方也明确推荐新写法。

今日速览

  • Parallax2D(Godot 4.3+)取代旧节点:一层一个节点,节点本身只负责「按速度滚动」,直接把 Sprite2D 等渲染节点挂成它的子节点即可。
  • 纵深感全靠 scroll_scale:它是「相对相机的滚动速度倍率」。1 = 与相机同速;越小越远(0.1~0.3 是远景),0 = 完全钉死不动;>1 则显得更近、滚得更快。
  • 无限循环靠 repeat_size:相机滚过这个值就把图「隐形地弹回」一次,制造永远滚不完的假象。循环画布从 (0,0) 向右下展开,所以纹理左上角必须对齐 (0,0)。
  • 三大坑:尺寸、定位、缩放——纹理最好 ≥ 视口;别把图都以 (0,0) 居中摆放;repeat_size 和 Sprite2D.region_rect 不随 scale 联动,缩放后要手动改。
  • 静止的地图也能「动」:autoscroll(像素/秒)让背景自己飘,做标题菜单、过场、氛围层特别省事。

核心学习内容

1. 为什么用 Parallax2D,而不是老节点

旧的 ParallaxBackground + ParallaxLayer 是一套「层嵌套」,层级关系容易绕晕,层与层之间共享一个 background 的滚动基准,调试起来别扭。新的 Parallax2D 就是普通 Node2D 的子类:你想让哪组图独立滚动,就把它塞进一个 Parallax2D 里,再用 scroll_scale 定它的速度。一层 = 一个节点,结构扁平、所见即所得。

一个典型结构:

ParallaxRoot (CanvasLayer 或场景根)
├─ Parallax2D  # 天空   scroll_scale=(0.1, 1)
│   └─ Sprite2D(天空.png)
├─ Parallax2D  # 远山   scroll_scale=(0.3, 1)
│   └─ Sprite2D(远山.png)
├─ Parallax2D  # 树林   scroll_scale=(0.5, 1)
│   └─ Sprite2D(树林.png)
└─ Parallax2D  # 近景岩石 scroll_scale=(0.7, 1)
    └─ Sprite2D(岩石.png)

2. scroll_scale:给每层定「速度」,纵深就出来了

scroll_scale 是按轴(x, y)分别生效的速度倍率。做横版卷轴时,只需调 x 轴,y 轴保持 1。官方给的一组参考值很实用:

层scroll_scale (x, y)观感
森林(0.7, 1)最近,滚得最快
丘陵(0.5, 1)中景
低云(0.3, 1)远景
高云(0.2, 1)更远
天空(0.1, 1)几乎不动

规律很简单:越远 = 速度越小 = 越接近 0。把 0.1→0.7 铺满 5 层,眼睛立刻读出「深度」。注意:如果你想让某层完全固定(比如 UI 里的远景插图),把它设 (0, 0),或直接开 ignore_camera_scroll = true。

3. 无限重复:repeat_size 与三个必踩的坑

repeat_size 告诉节点:相机滚过这个距离,就把所有子画布沿该方向整体偏移一次。滚到「图的副本」出现时,图片悄悄弹回原位,于是看起来永远滚不完。

想让它不出错,牢记三个坑:

  1. 尺寸坑(Poor sizing):图必须 ≥ 视口。如果视口是 500x300、图只有 288x208,你按图设 repeat_size 就会露底,按视口设又会出现大缝。三个解法:① 把视口改小到 ≤ 纹理尺寸(像素风首选);② 缩放 Parallax2D(牺牲清晰度);③ 让 Sprite2D 自身重复——texture_repeat = TEXTURE_REPEAT_ENABLED、region_enabled = true、region_rect 设成纹理尺寸的整数倍。
  2. 定位坑(Poor positioning):循环画布从 (0,0) 向右下展开。如果你把 Sprite 以 (0,0) 为中心摆放,就等于有一半跑到负坐标去了,重复时会只循环一部分、甚至「跳一下」。正确做法:让纹理左上角对齐 (0,0)。
  3. 缩放坑:repeat_size 和 region_rect 不乘 scale。一旦你缩放了 Parallax2D 或子 Sprite,这两个值要按缩放比例手动改,否则循环点会错位。

只想让图换个起始位置(不想动整张布局)时,用 scroll_offset:比如图宽 288,设 scroll_offset = (-144, 0) 就从中段开始循环。

4. 把「一张 AI 出的背景图」变成多层视差(实操流程)

最省事的路径,是把 AI 出的整张背景「拆层」:

  1. 出图:让即梦 / SD 等生成一张足够宽、风格统一的大背景(先立好「风格前缀」,避免风格漂移——见第 45 天的流水线)。
  2. 分层:在图像工具里按「远→近」切成 4~5 层,每层单独导出 PNG(天空、远山、树林、近景)。若前层挡住了后层,用「扩图/局部重绘」把被挡住的部分补出来,保证每层自己都能横向铺满。
  3. 做无缝:把每层裁成左右能接上的循环图(可让 AI 重绘接缝,或用镜像/克隆修补);导入 Godot 后可按坑①的第③种方法让 Sprite 自身重复。
  4. 落地:每层放进一个独立 Parallax2D,设 scroll_scale,再把 repeat_size 设为本层纹理尺寸、repeat_times 设 2,scroll_offset 初始归零先跑一遍验证。
  5. 加料:需要背景自飘就填 autoscroll(像素/秒);想让远景在关卡尽头停住,用 limit_begin / limit_end 限制滚动范围;想让某层不受相机影响,设 follow_viewport = false 或 ignore_camera_scroll = true。

🎯 DeepSeek 提示词

① 让 DeepSeek 生成「自动搭建多层视差」的 Godot 4 脚本

适用场景:手上有几张分层背景图,想快速搭出可跑的视差结构。

你是一名 Godot 4 游戏开发工程师,擅长 2D 视差背景。
【任务】写一个 GDScript 脚本 build_parallax.gd,挂在场景根节点(Node2D)上,在 _ready() 里自动创建多层视差背景。
【输入】我会提供:每层的纹理路径、视口尺寸(如 640x360)、每层的 scroll_scale(x,y)。
【输出要求】
1. 一个继承 Node2D 的完整脚本,创建 Parallax2D 节点树,每层下挂一个 Sprite2D 并设置 texture;
2. 每层设置 scroll_scale、repeat_size(=该层纹理尺寸)、repeat_times=2;
3. 代码带中文注释,并按「创建层 / 设置速度 / 设置循环」分小节排版;
4. 末尾附 3 行使用说明(怎么挂载、怎么传参)。
【约束】必须使用 Godot 4.3+ 的 Parallax2D(禁止用 ParallaxBackground/ParallaxLayer);提醒我纹理左上角要对齐 (0,0)。只输出脚本 + 使用说明。

② 让 DeepSeek 把「一张背景图」拆层并给出 speed 表

适用场景:还没切图,先让 AI 帮你规划「拆几层、每层多快」。

你是一名 2D 美术管线顾问,熟悉视差滚动(parallax)。
【任务】把我描述的一张完整游戏背景,拆成 4~5 个可独立滚动的图层,并给出每层的 scroll_scale。
【输入】背景内容:<在此粘贴,如:远景雪山 + 中景松树林 + 近景岩石与雾>;视口尺寸:<如 480x270>;类型:横版卷轴。
【输出格式】
1. 一张 Markdown 表格:层名 | 靠前/靠后 | 建议 scroll_scale(x,y) | 是否需无缝平铺 | 备注;
2. 从最远到最近的拆分顺序,并注明每一层应保留哪些元素;
3. 对无法无缝平铺的层,给出「AI 扩图/重绘接缝」的提示词方向。
【约束】scroll_scale 在 0.1~0.7 间递减,最远层约 0.1;不要编造我未描述的元素。

③ 让 DeepSeek 当「视差背景排错员」

适用场景:背景不循环、会跳、发虚抖动时,快速定位属性。

你是一名 Godot 4 代码审查员,专门排查 Parallax2D 的显示问题。
【任务】根据我描述的现象,给出最可能的 1~3 个原因与修复步骤。
【输入】现象:<如:滚到某处会突然跳一下 / 出现黑边 / 发虚或抖动 / 完全不循环>;场景结构:<在 CanvasLayer 还是场景根下、纹理尺寸、视口尺寸、repeat_size、scroll_scale、scale 值>。
【输出格式】逐条列出:现象 → 根因 → 把哪个属性改成什么值 → 如何验证。
【约束】只依据 Godot 4 官方 Parallax2D 行为;优先检查这三点:① 纹理是否覆盖视口 ② 纹理左上角是否对齐 (0,0) ③ 是否缩放后没同步改 repeat_size / region_rect。

学习心得

视差是「投入产出比」极高的画面技俩:不用动玩法、不用加音效,只把已有的背景图拆成几层分别定速,画面立刻有了呼吸感与纵深。对「用 DeepSeek 做一款 Steam 游戏」来说,这件事特别适合交给 AI——它属于「结构固定、参数明确」的任务:层的创建、speed 表、循环参数都是可枚举的,让 DeepSeek 生成骨架,人来只做「哪层快一点、接缝够不够顺」的手感微调,效率最高。反过来,那些「要凭审美判断」的部分(拆层边界、色调统一)才值得我们亲自动手。

明日关注

  • 用今天第 ② 条提示词,把自己游戏的一张背景图拆成 4 层并填一张 speed 表。
  • 在 Godot 里用 Parallax2D 跑通一条循环背景,重点验证「纹理左上角对齐 (0,0)」是否消除跳变。
  • 试一次 autoscroll:给标题菜单做一层自飘的云/雾,感受「静止画面也活着」。

本文由自动化学习流水线每日生成,坚持即学即记。