Sector 07 / 地下三层 光线投射引擎 · 480×270 帧缓冲 · 最近邻放大 23×23 网格 · 深度优先生成 + DDA 步进
OBJECTIVE寻找红门禁卡
点击画面锁定鼠标
1993 · Shareware Episode One

铅色地窖

第七区地下三层,照明只剩一半。找到红门禁卡,穿过滑闸门,抵达西北角的出口。走廊里还有人守着。

W A S D← →SHIFT 冲刺空格 开火E 开门TAB 地图
击杀 KILLS 0/0
生命 HEALTH 100
弹药 AMMO 24
门禁卡 KEYCARD
未取得
深度 SECTOR 07-B3

Controls / 操作

走廊里没有地图,
只有光走过的顺序。

移动
W A S D / 方向键 ↑↓
转向
鼠标拖动 · · 触屏左侧方向键
冲刺
SHIFT 按住(脚步声会变急)
开火
空格 / 鼠标左键 · 命中即为射线求交
滑闸门
E 面向门按一次,液压升起
全屏地图
TAB 按住查看已探索区域
重新生成
R 换一座迷宫 · ESC 暂停

Engine / 引擎

DDA:把一条光线在网格上走一遍

每一帧,画布被分成 480 条竖列。第 x 列发出一条射线,用 DDA(数字差分分析)在 23×23 的网格上一格一格跳——横向步进与纵向步进哪边更近就走哪边,直到撞上一面墙。命中的垂直距离是 perpendicular distance,它天生抵消了鱼眼畸变;乘上屏幕高度就得到这一列墙的高度。

命中点在墙面上的横向比例 wallX 决定采样 64×64 程序纹理的哪一列。远近决定明度:距离衰减加上纵墙再压 0.72 倍,转角立刻立起来。天花板与地板不是贴图,而是按扫描线到视平线的距离反算出的真实地面距离做明度衰减。

敌人、补给、出口牌都是广告牌精灵:先按到相机空间的距离排序,逐列与 z-buffer 比较,被墙挡住的列直接丢弃。所有像素写进同一块 480×270 的 ImageData,再最近邻放大到屏幕——那些粗颗粒是刻意留下的,它是这台机器的一部分。

PLAYER HIT + wallX perp distance WALL TYPE 02
FIG.1 — 逐列投射 · 网格步进 · 命中采样