多层背景可以按不同于镜头的速度移动,营造层次感。重复纹理还需要处理循环边界,否则镜头走过一个纹理宽度时可能出现跳变或空白。
下面把一个游戏界面或模拟规则拆成可复查的记录。每组输入独立给出,先确认单位、先后次序和边界,再核对结果。它不依赖具体游戏的隐藏参数,读者可以直接挑选几步手工复算。
一维镜头位置按给定记录变化,四层背景各有初始偏移和滚动比例。未折回位置为初始偏移减镜头位置乘比例;按纹理宽度取零到宽度之间的余数。视口宽度不超过一块纹理,报告紧邻的两块起点。
纹理宽80,四层[初始偏移,滚动比例][[73, '0'], [27, '1/4'], [23, '1/2'], [13, '5/4']] 十个镜头位置[-57, 90, -120, 137, 31, 3, -147, -63, 73, -40]
镜头位置-57,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['165/4', '165/4', ['-155/4', '165/4']], ['103/2', '103/2', ['-57/2', '103/2']], ['337/4', '17/4', ['-303/4', '17/4']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置90,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['9/2', '9/2', ['-151/2', '9/2']], ['-22', '58', ['-22', '58']], ['-199/2', '121/2', ['-39/2', '121/2']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置-120,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['57', '57', ['-23', '57']], ['83', '3', ['-77', '3']], ['163', '3', ['-77', '3']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置137,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['-29/4', '291/4', ['-29/4', '291/4']], ['-91/2', '69/2', ['-91/2', '69/2']], ['-633/4', '7/4', ['-313/4', '7/4']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置31,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['77/4', '77/4', ['-243/4', '77/4']], ['15/2', '15/2', ['-145/2', '15/2']], ['-103/4', '217/4', ['-103/4', '217/4']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置3,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['105/4', '105/4', ['-215/4', '105/4']], ['43/2', '43/2', ['-117/2', '43/2']], ['37/4', '37/4', ['-283/4', '37/4']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置-147,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['255/4', '255/4', ['-65/4', '255/4']], ['193/2', '33/2', ['-127/2', '33/2']], ['787/4', '147/4', ['-173/4', '147/4']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置-63,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['171/4', '171/4', ['-149/4', '171/4']], ['109/2', '109/2', ['-51/2', '109/2']], ['367/4', '47/4', ['-273/4', '47/4']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置73,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['35/4', '35/4', ['-285/4', '35/4']], ['-27/2', '133/2', ['-27/2', '133/2']], ['-313/4', '7/4', ['-313/4', '7/4']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
镜头位置-40,四层结果依次为[未折回位置,循环相位,相邻两块起点]:[['73', '73', ['-7', '73']], ['37', '37', ['-43', '37']], ['43', '43', ['-37', '43']], ['63', '63', ['-17', '63']]]。每块宽80,视口宽四十,两个相邻副本共同覆盖视口。
比例为零的层相位保持不变,其余层根据镜头和自身比例移动,越界只改变循环表示。
从前一次镜头到下一次的位移乘比例,应与该层未折回位移变化相反。两个相差完整纹理宽度的位置代表同一循环相位;折回结果必须非负且小于宽度,尤其检查负镜头位置。
滚动比例描述本例的画面效果,不是实际物体远近的物理测量。图层若不具备可平铺的边缘,仅正确计算循环位置也不能消除接缝。这里不计算遮挡、垂直滚动或相机缩放。
练习时可以只改动一项输入,预测从哪一步开始出现变化,再逐步比较。空状态、数值零和无法判断要分别记录;不要为了让最后结果一致而忽略中途的偏差。边界与同分约定同样属于规则,复核时应一并保留。