虚拟游戏机 REDSHIFT 开发指南

本文翻译自游戏 EXAPUNKS 的第二个文档中的关于 TEC RED SHIFT 的一节。

你一定知道 TEC RED SHIFT(以下简称红移掌机),一款基于卡带的游戏掌机,附带有巧妙的3D模式。同时也是一个严重翻车产品,导致TEC从游戏产业退出。但红移掌机绝不仅仅只是你知道的这样。今天,距离它推出已经过去5年了,它成为了一款可以很容易在二手市场上找到的超级可编程设备。

幸运的是,为红移掌机制作游戏实际上非常有趣,只要你掌握到了窍门。让我们迅速看一下红移掌机为专业或者业余游戏开发者提供了什么。

帧同步

第一件你要学会的重要的事情是,如何 WAIT(等待)。如果你以前学过游戏开发的话,你会觉得这是个很熟悉的概念。 红移掌机的VM包含了一个特殊的 WAIT 指令,这不是核心EXA编程标准的一部分。执行一个 WAIT 指令会让一个 EXA 暂停,直到下个帧同步,帧同步一分钟30次。这样一个复杂的游戏保持一个固定速度运行就会变得很容易,不用管这个游戏有多少代码。

数据文件

红移掌机的VM也包含了另一条非标准指令:DATADATA 指令不会被执行(这一点很像NOTES),而是被用于指定一个初始文件,当游戏启动时,EXA就会拿起它的初始文件。一个 DATA 指令后面可以跟任意数量个数值,用空格隔开。如果你不能一行把所有数值都写完,你可以额外再增加几行DATA来记录剩下的。

图像系统

红移掌机有一个 120 * 100 的黑白屏幕。在3D模式下,白色像素会分离成红和蓝,戴上3D眼镜的话,图像看起来就会像是在屏幕之上或之下。这本来会是红移掌机的一个大卖点,在当时,其他掌机则是向彩色显示发展。不幸的是, 红移掌机的3D模式臭名远扬,因为玩起来可能会导致头疼,所以不能长时间使用。红移掌机所有的广告和手册都建议每隔15分钟休息一次。而我则建议你每隔5分钟就休息,或者干脆不要用3D模式。

每个EXA有一个 10 * 10 大小的黑白 Sprite,可以通过代码编辑。这个 Sprite 可以通过向 GXGY 寄存器中写数值来定位。GX 表示到左边屏幕的偏移,GY 表示到顶部屏幕的偏移。
img

如果你一定要使用3D模式玩的话,Sprite深度可以通过向 GZ 寄存器写数值来改变( -9 表示向里最深,9 表示向外最突出)。

Sprite 可以在运行时改变,通过向 GP 寄存器中写入一个 3 位数。第一位表示操作( 0=关,1=开,2=切换),第二位和第三位表示要改变的像素坐标( X 和 Y 坐标,从左上角定位)。所以,190 表示把右上角的像素打开,209 表示切换左下角的像素,以此类推。
img

内置字体

等一下,这里也有基本的文本支持。通过向 GP 寄存器中写入一个 300s(也就是百位是3的三位数),就能把整个 Sprite 变成一个字符,基于十位数个位数来表示(规则参照下图)。所以,324表示将 Sprite 变成24号字符,也就是字母X.
img

碰撞系统

Sprites 可以互相重叠,当每个 Sprite 在屏幕同一点都有白色像素的话,就会被判定为重叠。这时候,每个 EXA 的 CI (collision input) 寄存器会被设置为 与它相碰撞的 EXA 的 CO (collision output) 寄存器的数值。如果多个 Sprite 重叠一个 Sprite 的话,最大的 CO 值获胜。
img

音频系统

红移掌机有 4 个声道,每个都与一个寄存器相连接:两个方波(#SQR0 / #SQR1),一个三角波(#TRI0),和一个噪声通道(#NSE0)

向一个三角波或者方波声道写入一个数值,就会让它一直演奏这个音符,直到写入0才会停止。

噪声通道写入一个数值,能控制它的音高。较小的数值会产生低频率的噪音,0则会把它完全关掉。
img

输入系统

#PADX 寄存器表示十字键的水平状态( -1=左,0=中间,1=右)。#PADY 寄存器表示十字键的竖直状态( -1=上,0=中间,1=下)。

#PADB 寄存器表示 X, Y, Z, 和 START 键的状态。如果 X 键被按住,个位数就会是1,否则是0。Y 键则是用十位数表示,Z 键用百位数表示,START 键用千位数表示。

#EN3D 寄存器表示是否使用3D模式1=开,0=关)。

总结

以上红移掌机系统的主要内容。最后一件事,不论你做的是什么,别忘了和你的朋友分享!