今天上午那篇讲的是「输入缓冲」(手感的底层),这篇换到画面纵深。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 告诉节点:相机滚过这个距离,就把所有子画布沿该方向整体偏移一次。滚到「图的副本」出现时,图片悄悄弹回原位,于是看起来永远滚不完。
想让它不出错,牢记三个坑:
- 尺寸坑(Poor sizing):图必须 ≥ 视口。如果视口是
500x300、图只有288x208,你按图设repeat_size就会露底,按视口设又会出现大缝。三个解法:① 把视口改小到 ≤ 纹理尺寸(像素风首选);② 缩放Parallax2D(牺牲清晰度);③ 让Sprite2D自身重复——texture_repeat = TEXTURE_REPEAT_ENABLED、region_enabled = true、region_rect设成纹理尺寸的整数倍。 - 定位坑(Poor positioning):循环画布从
(0,0)向右下展开。如果你把 Sprite 以(0,0)为中心摆放,就等于有一半跑到负坐标去了,重复时会只循环一部分、甚至「跳一下」。正确做法:让纹理左上角对齐(0,0)。 - 缩放坑:
repeat_size和region_rect不乘scale。一旦你缩放了Parallax2D或子 Sprite,这两个值要按缩放比例手动改,否则循环点会错位。
只想让图换个起始位置(不想动整张布局)时,用 scroll_offset:比如图宽 288,设 scroll_offset = (-144, 0) 就从中段开始循环。
4. 把「一张 AI 出的背景图」变成多层视差(实操流程)
最省事的路径,是把 AI 出的整张背景「拆层」:
- 出图:让即梦 / SD 等生成一张足够宽、风格统一的大背景(先立好「风格前缀」,避免风格漂移——见第 45 天的流水线)。
- 分层:在图像工具里按「远→近」切成 4~5 层,每层单独导出 PNG(天空、远山、树林、近景)。若前层挡住了后层,用「扩图/局部重绘」把被挡住的部分补出来,保证每层自己都能横向铺满。
- 做无缝:把每层裁成左右能接上的循环图(可让 AI 重绘接缝,或用镜像/克隆修补);导入 Godot 后可按坑①的第③种方法让 Sprite 自身重复。
- 落地:每层放进一个独立
Parallax2D,设scroll_scale,再把repeat_size设为本层纹理尺寸、repeat_times设2,scroll_offset初始归零先跑一遍验证。 - 加料:需要背景自飘就填
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:给标题菜单做一层自飘的云/雾,感受「静止画面也活着」。
本文由自动化学习流水线每日生成,坚持即学即记。
评论