在2020年制作一款SNES游戏(使用现代工具)

2020-05-31 09:48:47

为复古游戏机制作新游戏是业余开发人员可以相当容易地做的事情,这要归功于今天的技术。去年,我为我最喜欢的游戏机发布了一款新游戏:超级任天堂(SNES)。该项目甚至达到了实际的物理发布,使用了一个像90年代那样的墨盒和纸盒。在这篇文章中,我将向你展示这个不可思议的旅程中的许多步骤:设计游戏,在编程时克服与SNES相关的技术问题,制造新的SNES墨盒,以及制作手册和盒子。

Yo-Yo Shuriken是一款快节奏的街机游戏,适用于超级任天堂(SNES)上的1到2名玩家。

核心游戏围绕射击一个舒里肯展开,你可以在任何时候神奇地回忆起它,所以你可以从前面或从后面攻击敌人!。你甚至可以将能量集中到舒瑞肯身上,发出一次强大的冲锋攻击,一次可以砍穿几个敌人。

这款游戏有一个漂亮的纸板盒和一本CatSkull Games:https://catskullgames.com/yo-yo-shuriken提供的手册。

如果你更喜欢在模拟器上玩它,你也可以在这里获得游戏的光盘:https://drludos.itch.io/yo-yo-shuriken。

现在你对游戏本身更熟悉了,让我们来探索一下它是如何设计的。

制作溜溜球寿司是一个相当有机的过程。当我想出游戏点子时,我对它们进行了测试,并试图将它们提炼出来,直到我手头有了一款有趣的游戏。让我们从最初的想法开始吧。很长一段时间以来,我一直想用一颗子弹做一个射击游戏。所以玩家每次射击都必须把它拿回来。除了“一颗子弹”的想法外,我还想做一款可以和朋友一起在合作社里玩的游戏。考虑到这两个想法,我一步一步地创建了这款游戏。我取得的每一项重大进步都被贴上了新版本的标签,并进行了大量的测试。如果当前版本不错,我会继续添加新功能。除此之外,我一直致力于目前的功能,直到游戏再次变得有趣,然后才添加任何新的东西。以下是主要游戏原型的概要,并附有屏幕截图。如果你想播放这些原型的实际光盘,它们是我的Patreon支持者可以获得的众多福利之一。

在你不知道的平台上制作游戏的第一件事就是在屏幕上显示一些东西!所以我画了一个机器人忍者精灵,并试图让SNES把它显示在屏幕上。当它工作时,我添加了代码来使精灵与D-Pad一起移动。然后,当精灵移动时,我制作了一个行走的动画。这些第一步看起来可能很简单。但请记住,这是我第一次为SNES制作游戏!所以这实际上花了相当长的时间,因为我在制作游戏的同时正在学习机器是如何工作的。因为目前的项目只展示了一个机器人忍者,所以我给它取名为“网络忍者”。

真正的玩家精灵,一个忍者,出现在第二个版本中。所以机器人精灵自然而然地成为了他们的敌人,因为每个人都知道忍者和机器人互相憎恨!作为一个骄傲的忍者,玩家可以投掷一个舒里肯。舒里肯可能会卡在屏幕边缘,玩家必须把它捡起来才能再次拍摄。机器人敌人可以在屏幕上漫无目的移动,但还没有进行碰撞检测。

经过几次测试,我认为当玩家第二次按下按钮时,舒里肯可以自动回到忍者身上。我在测试这个机械师的时候玩得很开心,所以它成了整个游戏的核心!我还更改了项目名称以反映这一演变:向网络忍者说再见,欢迎来到Yo-Yo Shuriken(#34;Yo-Yo Shuriken";!)。事实上,在游戏中,舒里肯来回穿梭,就像溜溜球一样。

我还添加了碰撞检测功能。现在,当舒里肯攻击机器人时,它们就消失了。但是如果一个机器人击中了玩家,他就是那个消失的人。虽然一切仍处于非常基本的状态,但在这第三款游戏原型中,游戏的核心玩法几乎完成了。因此,我决定对引擎进行压力测试,看看我能在游戏落后之前把它推到什么程度。我设法让多达80个敌人在屏幕上行走和互动。请记住,SNES总共可以显示128个精灵,因此让其中80个精灵每秒更新60次碰撞和动画是一种成就。

在这个第四版中,敌人不再局限于直线运动。它们现在可以朝几个方向移动。它们还会弹离屏幕边界,以避免离开游戏区。结果比赛变得更有趣了。

我添加了不同的背景颜色,并添加了一个无休止地滋生敌人的系统。在之前的版本中,一旦80个机器人被摧毁,游戏就是空的。这里产生了无穷无尽的机器人大军!敌人也可以跟着玩家,迫使他继续移动。事实上,在这个第五版中,如果玩家保持静止,游戏很快就会变得非常无聊。

在这个版本中,我面临了我的第一个重大技术难题:每当机器人死亡时,都会显示巨大的爆炸精灵。我选择了一个相当小的玩家和敌人精灵:16x16像素。这样,我可以在屏幕上显示大量的游戏,同时保留足够的空白空间让玩家四处走动,避免击中敌人(SNES屏幕分辨率为256x224像素)。然而,我决定用更大的尺寸来画我的爆炸图:32x32像素。超级任天堂能够同时显示两个不同大小的精灵。开发人员可以从较短的尺寸列表(8x8、16x16、32x32和64x64)中选择小尺寸和大尺寸,控制台将在访问视频RAM以在屏幕上显示子画面数据时使用此信息。这是让游戏开发人员生活更轻松的众多图形功能之一。但作为任何技术功能,当你不知道如何使用它时,它会变得令人望而生畏!

在我的例子中,在目前的原型中,我只能显示一小部分爆炸精灵,无论我做什么。问题其实很简单:我没有把精灵数据上传到SNES显存中需要的地方。这样机器就不能把它们读回来了。在花了几个小时研究自制软件社区多年来制作的精彩纪录片后,我确实找到了解决方案。我非常感谢他们为创造和分享所有这些宝贵的知识所做的辛勤工作:没有他们,像我这样的业余爱好者就不能制作SNES游戏!

新的敌人也加入了这场战斗:橙色的机器人可以在爆炸前被击中几次,蓝色的机器人可以在任何地方追逐玩家。我还加了硬币,你必须收集这些硬币才能得分。这个机甲极大地提高了游戏的可玩性。事实上,得分的唯一方法就是收集硬币。杀死机器人本身不会给你带来任何奖励,它只是防止你的化身死亡的一种方式。机器人死后会掉硬币。但是硬币在几秒钟后就消失了。而且屏幕上总是有大量的机器人,当你被触摸时,它们会立即杀死你。为了获得分数,玩家必须冒很大的风险,在机器人之间移动,否则他不会得到高分。但有时,最好让一些硬币消失,以避免失去一条生命。这就是游戏设计师所说的风险/回报选择,这是让游戏变得有趣的好方法。在这里,这个机械能让悠悠舒瑞肯提供一个平稳的难度进展给玩家。通常,菜鸟玩家会倾向于保持静止,只专注于摧毁机器人。他不会得到积分,但他将能够在比赛中继续下去,击败最终的老板。一旦玩家开始变得更自信,他就会变得更自信。

随着游戏测试的进行,我意识到这个游戏变得相当重复。我测试了几个解决这个问题的想法。我发现最有趣的一件事是按住射击按钮,让你的舒里肯充电。当你松开按钮时,它会触发一次超级射击,可以砍穿几个敌人。这个机械人给游戏带来了一些战略思维。现在,玩家可以选择执行几个简单的射击来逐个杀死敌人。或者,他可以选择进行一次带电射击,一次杀死几个敌人。但是,当超级射手冲锋时,他会变得脆弱不堪。

从这个版本开始,所有定义核心游戏性的游戏机制都加入了。因此,该项目进入了时间最长、最繁琐的阶段:添加内容和润色游戏。首先,我添加了我用BFXR创建的音效。我还收录了XRACECAR创作的精彩音乐曲目。我还修改了游戏GUI并将其移到屏幕顶部。

关于图形,我在游戏背景中添加了一个图案。由于我的艺术技巧有限,我很难画出令人信服的背景。我做了几次尝试,包括这一次,在落脚于木板地板之前,我强调游戏发生在道场内(见下一个版本)。

最后但并非最不重要的一点是,我开始创建各种游戏关卡。每一级都是由几个敌浪组成的,而且力量和数量都在增加。我花了大量疯狂的时间来测试和平衡那些敌人的波浪,以使游戏变得有趣。每个游戏设计者都有自己的做法。就我个人而言,对于街机游戏,我喜欢将激烈和具有挑战性的时刻与更轻松的时刻混合在一起,这样玩家就可以喘口气了。例如,如果玩家在道馆里已经挤满了行动缓慢的敌人的时候,设法让快速移动的机器人追赶他一段时间,我会奖励他一个节奏较慢的时刻。比如4-5个基本敌人移动非常慢,所以你可以很容易地杀死他们并收集他们的硬币。

顺便说一句,您可能会注意到,在这个阶段,爆炸图形仍然特别难看。

在这个版本中,一种新的敌人加入了战斗:盾牌机器人。他们只能从后面被击中。在这里,“溜溜球舒里肯”变得更有意义了。事实上,杀死盾牌机器人的最好方法是先在它们周围射击。然后,你将不得不召回舒瑞肯,并试图通过控制它的返回轨迹来击中他们。我还制作了新的爆炸精灵,背景图像更好看。我甚至增加了一个无敌加值皮卡(一个白色忍者头颅,在最后一场比赛中被一个明星取代)。

这个版本的最后一个主要功能是:游戏老板。我花了很多时间来设计和测试无数的老板。这是游戏开发过程中最令人愉快的部分之一!

在截图中,你可以看到蛇老板的原型,以及最终版本中没有的老板:坦克。坦克头目必须分几步摧毁。它有几个弱点(橙色的球),必须一个接一个地击中。一旦一个弱点被摧毁,它就会移除部分坦克结构,暴露出新的弱点。这是一位极具挑战性的老板。例如,一个弱点是在隧道的尽头,所以需要非常精确的瞄准。

从理论上讲,这个老板的想法相当有趣。我花了好几天的时间来编写程序。但在玩了很多次之后,我决定把它从游戏中删除,因为它很无聊。事实上,有时要摧毁老板是相当困难的,因为它的规模很大。另外,如果老板设法把你挡在角落里,你就死定了,因为你打不中它的任何弱点。最后,面对这位老板,与其说是一次有趣的经历,不如说是一次令人沮丧的经历。正如你所看到的,即使是在业余游戏项目中,有时你也不得不删掉令人失望的内容,尽管你花了很多时间制作它!

这个最终版本的关键词是波兰语。我添加了标题屏幕、引言和结尾动画,以及一个解释游戏玩法的屏幕。最后一招是包括一个隐藏的奖励模式:双忍者模式,在这个模式下,你可以用一个控制器控制两个忍者。要解锁此模式,您只需完成一次游戏(或使用作弊代码!)。

所以,经过一年多的开发,5491行代码,悠悠舒瑞肯终于完成了!这个游戏的ROM运行得非常好。它在几个版本的原始游戏机(日本Super Famicom、美国Super NES、PAL Super Nintendo)、现代版本(PAL用FFVIMan的50/60 hz套件调制、模拟Super NT)以及许多模拟器(Higan/BSNES、SNES9X、ZSNES、No$SNS、RetroArch等)上进行了测试。适用于各种平台(PC、智能手机、PSP、Raspberry PI等)。

一旦游戏软件最终版本通过验证(经过广泛的Beta测试阶段,所有错误都已修复),项目的硬件部分就可以开始了。换句话说,我们需要用一个漂亮的纸板盒使游戏在实际的盒式磁带上可用!但在探索过程的这一部分之前,我想给你提供更多关于为SNES开发这款游戏的细节。

在复古平台上制作游戏有很多技术限制。与90年代的开发人员所面对的相比,使用现代工具确实简化了任务。但与有限的硬件规格相关的限制仍然很多。像所有其他自制软件开发者一样,我在制作Yo-Yo Shuriken时也在与这些限制作斗争。以下是我使用的工具和我面临的主要问题。我希望他们能帮助你弄清楚SNES是如何在引擎盖下工作的。

回到90年代,游戏程序员必须为他们正在工作的每台机器学习和使用汇编。SNES是一台很难操作的机器,因为你必须学习的不是一种,而是两种汇编语言:用于中央处理器的65816汇编和用于音频芯片的SPC700汇编。

如今,你仍然可以使用汇编,这实际上是从任何复古机器中获得最大功率的唯一途径。但是你也可以用更容易学的语言制作一些非常酷的游戏,比如C或BASIC。对于SNES,您只有一个C编译器可用:tcc816。它远不完美,因为您必须使用一些python脚本来优化/修复它输出的代码中的bug,但它是有效的。一位名叫Alekmaul的天才程序员利用这个编译器构建了一个完整的框架来简化游戏的创建:PVSNESlib。

我用这个库制作了Yo-Yo Shuriken,这样我就可以用C语言编写它了。对于图形,我绘制了转换为SNES图形格式的BMP图像。对于音频,框架接受用于音效的WAV文件和用于音乐的.it文件(ImPulse Tacker格式)。让一款游戏在SNES上运行仍然是一个相当大的挑战,但PVSNESlib让它成为了一个艰难而有趣的挑战!

与Mega Drive/Genesis或PC-Engine/TurboGrafx16等其他机器相比,SNES是一台相当复杂的机器,具有许多不同的图形模式。但它的一般工作流程实际上相当简单。基本上,SNES可以使用两个通道显示图形数据:";背景";和";精灵";。背景是由8x8瓷砖组成的全屏图像。背景可以有几个可以独立滚动的层(从1层到4层)。视频RAM是有限的,因此您通常必须将图形数据从盒式磁带ROM实时传输到视频RAM,才能显示一些无边无际或较大的滚动区域。

对于精灵,SNE可以显示不同的大小:8x8、16x16、32x32和64x64-仅有两个这样的大小可以同时显示在屏幕上。要制作精灵动画,您必须手动设置它们在屏幕上的位置,并修改它们将显示的图形数据,每秒60次。要做到这一点,就像处理背景一样,您首先必须将图形数据(即,样本表的一部分)从盒式磁带ROM芯片复制到控制台的视频RAM中。

SNES还可以使用专用芯片(SPC700)播放音频。对于输入,很容易读懂玩家在SNES游戏板上按下了什么按钮。(有史以来设计的最好的游戏手柄!)。

最后,即使你使用PVSNESLib这样的工具,你也需要熟悉SNES是如何工作的,才能为它制作真正的游戏。希望精彩的自制软件社区已经整合了一些非常广泛的文档。我将推荐:

PVSNESLib wiki,它将指导您如何设置工具以及如何制作简单的SNES程序:https://github.com/alekmaul/pvsneslib/wiki。

NESdev论坛的SNESdev部分:https://forums.nesdev.com/viewforum.php?f=12社区非常乐于助人,技术娴熟。我做悠悠寿司的时候,他们不止一次救了我的命!

现在我们已经介绍了一些基础知识,让我们深入研究一下我所面临的一些技术问题。

在溜溜球舒瑞肯这样的游戏中,屏幕上的精灵(敌人、爆炸等)越多,游戏就会越好!然而,这个游戏不能落后。因此,您必须找到CPU可以处理的最大敌人数量,同时保持60fps的流畅显示。与Genesis/Mega Drive相比,SNES经常被吹捧为慢速(BLAST Processing)。在某种程度上,这是真的。虽然SNES可以显示更丰富多彩的图像和更高质量的声音,但可用的CPU时间通常低于Genesis。换句话说,与SNES相比,创世纪通常可以在屏幕上移动更多的精灵。这种区别最好的例子是Contra III(SNES)和IV(Genesis)。更具体地说,每个游戏如何处理爆炸:

SNES-#39;Contra III(左)上的爆炸是用一些精灵加上特殊的图形效果(透明),而Genesis';Contra IV(右)则在屏幕上渲染出疯狂数量的精灵。当直接在汇编器中对每个控制台进行编程时,您可以感受到处理能力的这种差异。但是当像我为Yo-Yo Shuriken所做的那样使用C编译器时,差别就变得更加明显了。因此,我可以显示的敌人总数受到可用CPU时间的限制。但是CPU任务并不局限于精灵管理。它还必须处理动画、将图形数据上传到视频RAM、管理冲突、读取控制器输入、音频芯片上的触发器声音和音乐等。开发Yo-Yo Shuriken是一项持续不断的斗争,目的是让尽可能多的敌人出现在屏幕上,而所有其他元素都在消耗可用的总CPU时间。因此,当我在游戏中添加新功能时,我不得不几次减少敌人的数量。

起初,当只有标准的机器人在没有碰撞检测的情况下直线移动时,我可以在屏幕上显示80个敌人(外加1名玩家和他的舒里肯)。当我添加敌人、玩家和舒瑞肯之间的碰撞检测时,我不得不将这个数字减少到40个敌人。添加第二个播放器、爆炸、音效和音乐也占用了大量可用的CPU时间。最终,最终的游戏最多只能在屏幕上显示24个敌人,以保持流畅的60帧/秒的显示速率。虽然纸面上听起来可能很少,但当你玩这款游戏时,你会看到24个敌人足以提供一个通过挑战,特别是在游戏的后期!

老实说,能够在屏幕上控制38个动画精灵(24个敌人+2个玩家+2个舒里肯+10次爆炸)而没有任何减速仍然是一项成就。但这一成就背后有一个诀窍:并不是所有的精灵都会在每一帧都更新。事实上,虽然公众。

..