最早的那款飞机游戏,说白了就是那个红白机上按键一按,俩数据包直接往天里扔,看哪位先落地。
那时候还没人管啥“核心”,也没那么严谨的“游戏设计”概念,也就是一堆程序员硬塞进系统里的数学公式和物理模拟,跑出来的东西,大约率能飞,但也可能直接出于内存溢出要么直接趴窝。 大量人会把它跟后来的《银河系漫游指南》要么《星际拓荒》搞混,当作那是科幻作品里随手写的模拟器,实际上不然。
那玩意儿算上《忒空方位》要么《忒空机动》,在 1980 年代中期之前,根本上就是单机物理引擎的雏形。最经典的案例得数 1980 年微软出的《忒空射击》(Space Shooter),要么 1981 年泰德·布伦纳(Ted Brennan)做的《忒空战机》(Space Invaders)。
这两者别看名字akes 有点不同,但核心逻辑一样:屏幕里有个二维矩形代表飞船,下面有个二维数组代表一群要么一群敌人,程序只负责算碰撞,画哪位没哪位,哪位没碰到哪位。 要是你拿个盒饭去问路人,他们指着那些像素点会问你:“这是不是飞得还挺稳?”那时候的“稳”,大约是在某个特定的角度下,能射出两发子弹把对面两个点给撞死。至于“手感”,那彻底是靠试错建立的。你知道按下空格是射击,按下箭头是转向,但如何飞才是“好”的,要么如何设计关卡,那时候哪位也没想通。
大多数时候,开发者为了凑人数,就画个 10 个箱子,要么 20 个敌人,你就那样框死一圈。
那时候没有“敌人”,只有“子弹”;没有“关卡”,只有“范围”。你不用去摧毁任何东西,你只需求让子弹不至于把屏幕填满。 说到数据,咱们得拆解一下它如何运作的。早期的系统里,飞船往往就是一个固定的矩形,要么一个圆的变体。它的移动不是靠鼠标拖,也不是靠 WASD 命令,而是靠屏幕边缘的反射,要么一个预设的坐标表。飞行轨迹是一条线段,速度恒定,受力恒定,像物理题里的质点。
这一切都建立在纯粹的像素运算之上。
要是你想让子弹拐弯,你得用三角函数算角度,然后在那条线段上每隔几帧就画一条短线段,这叫“分段直线”。
要是你想增添难度,那就好办粗暴地加一个数组,数组里的每个元素代表一种敌人,它往左走还是往右走,能不能碰到子弹,全看碰撞检测算法的副功能。 最让人头疼的不是计算,而是渲染。
那时候 CPU 算力的瓶颈在于像素填充。每一帧画面都得重新算一遍,哪怕场景没变。便我们就有了这种怪的体验:你坐在机舱里,手指头在键盘上疯狂乱按,屏幕上的画面却像粘在一起了一样,要么干脆是一片黑。出于画面是“静态”的,要不就每帧都刷新,否则看起来就像你那一瞬间在发呆。
那时候的“流畅度”,就连不如目前用 60 帧渲染那种丝滑的“假体”。 说到那个年代的“设计”,那是绝对主观的。工程师们更在乎的是能不能填满屏幕,能不能让玩家一直玩下去,而不是游戏好不好玩。
故此那时候的飞机游戏,往往就是那种“右侧冒出一个箱子,左侧冒出一个箱子,中间就没了”的无限循环。
没有敌人,没有目标,没有升级系统,就连没有“得分”这个概念,往往只有“存活工夫”要么“子弹数量”。玩家就是在那儿瞎飞,直到被屏幕边缘撞死,要么困死在某个死循环里,游戏就终止了。
那时候的“游戏循环”,就是玩家输入 -> 程序计算 -> 屏幕刷新 -> 玩家再输入,这个过程无限且重复,直到玩家累了要么游戏死。 更有意思的还有一段历史。1981 年,泰德·布伦纳在斯坦福大学搞了一个项目,叫《忒空战机》(Space Invaders)。
这玩意儿名声臭了,出于它是用 BASIC 语言写的,连个循环都没写好,直接退出了。
后来有人重新写了个版本,用 C 要么 FoxPro,加了个菜单,加了个计分板,加了个升级系统,这才叫个“游戏”。
这个过程恰恰说明白当时的生态:没有现成的库,没有设计模式,就是一个个函数,一个个乱拼的积木。开发者们拼凑出来的东西,要么是个能飞的飞机,要么就是个乱飞的垃圾场,中间隔着庞大的鸿沟。 真正的转折点一般要等到 90 年代中期,也就是《俄罗斯方块》(Tetris)要么《电玩城》(Squash & Otters)出现的时候。
那时候,游戏才真正启动把“玩法”和“数值”结合起来,玩家启动为了得分而做运动,为了成长而做策略。但在此之前,所有的尝试,都只是为了证明“能够飞”,而不是为了证明“好玩”。 故此,当你今天玩那些精致的 3D 飞机游戏,看着飞船在云层里穿梭,认定那是“模拟飞行”,实际上几千年来,人类就在做这件事。只不过工具变了,从键盘上的空格条,变成了手柄上的摇杆;从二维的矩形点阵,变成了 3D 的光照纹理;从单纯的碰撞检测,变成了复杂的 AI 路径规划。但核心没变:我们依然是在屏幕里扔东西,看哪位先落地。
那个最早的“飞机游戏”,就是那个红白机上的《忒空射击》,它用简陋的像素和粗糙的物理,定义了人类对“飞行”最初的幻想。
那时候的代码里,只有好办的 `IF` 语句和绘图命令,但人们就在那儿,猜着下一帧会出现啥。