NES开发演示-HEOHdemo

计算机艺术节(也称为demopati)的历史在我国已有25年了。 来自全国各地的人们聚集在一起展示他们的练习,以从旧的或现代的计算机以及超少量的代码中提取不可能的事情。 在头五年中,1999年至2003年在喀山举行的CAFe (突然地, 计算机艺术节 )成为该国的主要变态之一。 后来,他很长一段时间就从雷达中消失了,将手掌交给了更著名的Chaos ConstructionsDiHalt 。今年他的回归是相当成功的-如果不是根据活动的规模,那么是因为各种作品的数量,这种现象持续到早上六点。 其中一个是我的,我将在本文中讨论其创建。


在演示上,我比积极参与者更同情。 我的主要兴趣是复古游戏和声音软件的开发。 早些时候,我仅制作了一个有条件的完整演示,以演示红色电话 ,此电话已成为场景模因,并为不同的平台提供了大约十二个小介绍。 CAFe的组织者,首先是通过共同的朋友,然后是在远程,然后是在个人会议中,开始了作者的个人鼓动,最终激发了我在全长演示类别中创作我的第一本真正完整作品的动力。 碰巧的是,在另一个不是最受欢迎的平台上-NES / Famicom游戏机,以Dandy的名字而闻名。

规划中


最初,我将为另一个更流行的8位平台制作一个长期构思的演示。 但是要实施它,有必要进行大量的研究工作,也就是说,既不了解时间安排,想法的基本可行性,也不知道可能结果的质量。 因此,采取的具体行动非常缓慢。 截止日期开始显着用完了,很明显,如果我想遵守参与的诺言,迫切需要选择另一个更可预测的实施项目。 在考虑了第二个想法之后,对于需要进行实验的“ 野生”类别,我决定回到三年前制作的NES的长期演示空白,然后再回到Multimatograph 。 结果,它们本身并没有真正被使用,但是最终确定了工作方向。

专门针对NES的工作计划最终于10月初获得批准,直到CAFe大约有三周的时间。 该项目文件夹于10月5日创建,但在此之前发生了一些移动。

需要解决的第一个问题是,需要多少效果(场景)才能使演示的持续时间足以声明一个大格式,而不是简单的简介。 还需要了解足够的持续时间是多少。
为此,除其他外, 回顾Pouet上所选平台的当前最佳作品,并分析了两个最佳作品-High HopesNESPECCY 。 最后一个是邀请参加同一场演示的人,于2018年12月发布,直到那一刻我还是没有引起我的注意。 起初,它甚至激发了一定的动力,因为我最初为以后的工作设定了一个更轻松的水平。

根据分析的结果,事实证明,在高希望中,大约有6种效果,持续时间为2:45,在NESPECCY中,大约有11种效果,持续时间为3:45。 平均每个效果约25秒。 我建议,平均来说,只有3-5个效果就足够了,但前提是这些效果中只有3-5个在技术上相对复杂,而其余的可以简单却很漂亮。 为了不延迟简单场景的显示,平均每个效果大约需要15秒,而演示的总持续时间大约是两到三分钟。

然后计算要花费多少时间来创建每种效果。 结果是半天到两天,没有计算出许多其他必要的作品,例如音乐,图形,某种想法,只是准备了结合效果的技术基础。 这样的时间表看起来并不现实,但是我决定尽我所能来制作尽可能多的效果,每个效果要花两天时间。

因此,确定了优先任务-能够及时做至少适合参加比赛的事情,以及能够以“没有时间解释”的方式发展模式。 这也排除了开发日记,现在您必须从内存中恢复事件,并尽量不要撒谎。

要求第一的工作任务没有提出。 主要的不是胜利,而是参与和所有这些,总的来说,主要的胜利是超越自己。 我没有根据所选类别不受欢迎的比赛结果做出任何特别的预测,并期望在最差(最好)的情况下参加几项相当有力的作品竞争的情况下,我的作品将成为复合填充物,这也是必要且重要的,如果没有作品,那么我会再次就像其他学科中已经发生的那样,他们之中的赢家。 当然,我想赢得一场像样的战斗,但是我本人对自己的作品的评价低于听众最终的估计。

代号


在设定了截止日期之后,很明显,为了有时间提出这样的项目,有必要配合不适当的完美主义,而不是尝试制作技术含量最高或最紧凑的演示代码。 更简单,更快,更好,同时保持足够的外部效果。

决定选择一个功能强大甚至冗余的配置-具有256 KB ROM代码和256 KB图形ROM的MMC3映射器,并尽力避免担心其全部潜力仍未开发。 此配置不是现有配置中最先进的,甚至可能更多,它已从Super Mario Bros开始广泛用于商业游戏中 3 (1988),但以前NES演示的作者仅限于更简单的映射器和更少的内存。 结果,使用了80%的ROM代码,略少于ROM图形的三分之二。 过多的内存使我们不会浪费额外的时间来解决数据压缩问题,尽管没有它是不可能的。

开发方法也很明显-主要在C语言中,根据需要插入汇编器,主要复制到视频存储器,中断处理程序和音乐播放器。 我一直在复古平台上成功使用此方法。 由于代码原型可以在本地完成,因此可以极大地节省开发时间:首先在C中实现它,并立即获得在NES上可运行的结果,然后,如果它不能足够快地运行,则根据已经准备好的模板将其重写为汇编器的各个部分,直到已达到所需的速度。



预期的主要问题之一是主RAM的数量,但实际上并没有造成太大麻烦-在NES处只有2 KB,尽管映射器基本上允许这样做,但在我的工作中我决定不扩展它。 鉴于其总的8位容量,基于6502处理器的系统中的内存通常以256字节页的形式考虑,并且在其中的RAM分配结果如下:

  • 一页用于“快速”变量;
  • 一页用于硬件堆栈和调色板(未使用堆栈的很大一部分);
  • 子画面列表缓冲区的一页(视频控制器体系结构的功能需要它);
  • 一页显示视频内存更新;
  • 一页,列出了光栅效果的参数。

最后两个在程序中以256字节的普通无符号char数组的形式声明,在某些地方还可以重用于其他目的。 剩余的三页在cc65程序堆栈下(即C程序的全局变量和局部变量下)给出。

应该注意的是,实际上不使用这种平台上的动态内存分配(malloc / free),需要静态解决方案。 最初,我坚持使用尽可能多的局部变量的方法,这使我能够自动为它们重用软件堆栈的内存。 但是局部变量的工作速度要慢得多,因此,全局变量可用的容量变得不够,以这种方式重复使用相同名称的变量来编写代码实在令人不舒服。 然后,我应用了一个以前未使用的解决方案:一个在链接器配置中的广告,该链接器配置了几个物理位于相同地址的RAM段。 在这些段中使用编译器指令放置了在相同效果内使用的变量组,从而允许重复使用相同的内存。

另一个问题-通过代码存储库分配C程序代码( NES使用页面寻址来扩展内存)-以前由我在其他项目中解决过,并且没有引起问题。 放置在页面中的代码限于功能完备的部分,最大限制为16 KB(可切换内存窗口的大小),并由overlay方法调用:覆盖所需的页面,处理该页面中的代码,执行返回主页面,并且无法进行页面之间的内存访问。 通过编译器指令将功能手动分配给库。 程序所有部分(例如音乐播放器,sprite输出和中断处理程序)所需的代码位于上部不可切换的内存窗口中,该窗口的大小也为16 KB。

在处理最后一个效果(与Mario的走廊)时,我遇到了一个有趣的编译错误消息: local label溢出 。 据我了解,编译器对一个对象模块内部生成的本地标签的数量(显然为65536)有内部限制,但是我使用了一个通用模块来简化共享内存的管理。 一种可能的解决方案是将代码分成几个模块,我已经计划应用它,但是,在将汇编程序的一部分常量从源移动到C的汇编程序部分(带有外部标签)后,问题自行解决,不再超过限制,甚至添加了几百行代码不再显示错误消息。

发展历程


在选择效果时,有一个计划将自己限制在简单但始终流畅的状态下,并以全显示速度(每秒60帧)工作。 最初没有考虑传统的演示效果,例如等离子和缩放旋转器,因为它们与机顶盒的体系结构不太吻合,机顶盒对视频存储器的访问有很大的限制-与在所有荣耀中反复实现这种效果的平台相比,这看起来很糟糕。

首先,我想根据三年的计划来制作大部分效果,基于对显示的栅格的逐行处理-在光束穿过栅格时更改每条线的垂直和水平位移以及显示图形的库。 这种方法可以在一个通用的代码块的基础上工作,从而节省了开发时间,但结果却在许多其他作品中发现是相当统一的,也是非常传统的。 此外,调试该通用代码块也很困难,因此,该演示仅包含这种效果之一,即旋转的盒式磁带。

在处理基于旧观念的几种效果时,其中一种最终变成了柯比效果,而第二种则没有进入演示,我开始编写文本文档,在其中写下了我想到的所有想法,包括个人效果和一般概念。 该列表包括40多种效果,而在最终作品中实现的效果不到15种,同时,大多数效果都是一种或多种动画,尽管每种效果的变化都非常独特,并使用各种技巧来确保可接受的内存消耗和所需的流畅操作。 偶然发生的情况是,效果的主要类型是事物的旋转。 原则上,这是一个很好的巧合,因为出现了一种概念上的统一。

构思并制作了一个大象简介,作为我以前作品主题的笑话,然后是带有彩色条纹和干扰的效果。 不用多想,工作名称HEOHdemo被选为引言中的笑话的延续(他不是他)。 当通过名称显示实现场景时,它被批准为最终的,因为那时没有更多成功的想法,也没有时间提出这些想法。

一个名为demo的自发决定促使了所有工作的最终概念,最终概念在截止日期前十天就形成了。 它暗示了使用可识别的视频游戏和流行文化材料,例如角色,徽标,游戏场景,但进行了修改,以使原始作品有所不同(例如“不是”)。 还决定将幽默从最初和最后的场景传播到整个演示,从而补偿不高的技术水平,这完全符合被引用时代(90年代中期)的精神,并且吸引了更广泛的受众-毕竟,旧游戏机拥有自己的游戏机,并没有与恶魔相交,也没有对技术有很大的启蒙,但是受众非常广泛。 大约在同一时间,决定使用90年代固有的演示程序将其划分为独立的独立场景,因为它们在可用的时间内更容易做到,并且随后极大地帮助了音乐部分和效果的同步。

在工作中,带有Vid,旋转徽标以及部分在走廊中带有Mario的场景的想法也自然而然地出现了。 它们是拖延的,这是一种拖延-直到主要的计划效果被粘上为止。

组装方式


最初,很明显,安排时间最多的时间包括介绍,标题,问候和最后的鸣谢。 它们的工作是首先进行的,因此,在某个时候,事实证明该演示已经具有完整的开始和结束(与最终版本中的相同),但是几乎没有中间的基础可以或多或少地准备一个效果。 截止日期临近。 该项目的工作变成了长达一个小时的马拉松比赛,占用了所有可能的免费时间,而不是也不免费。 计划中剩余的影响按复杂性排序,所有想法都尽可能简化。 制造了太空侵略者,克服了旋转弹药筒的问题,并完成了一个易于实现的带有吱吱作响的塔(通过外观试验)。 准备好效果后,即可确定其显示顺序。

每个琐事花费的时间比开始时多三倍,而在截止日期之前的几天,当效果或音乐仍然没有一半时,就有强烈的感觉无法奏效。 考虑了计划B,以完成并公开已经在另一个demopati上或其外部的工作。 但是后来做出了一个更有效的决定:紧急收集并完成已经存在的所有内容,至少准备好某种准备发布的产品,甚至完全是愚蠢的产品,为此写一些音乐,如果那之后还有时间,尝试添加更多效果。 在最后时刻添加的此类场景包括Pakman和走廊,与原始创意相比,这两个版本的简化程度最高。

这种组装方法导致演示过程中效果明显不连贯,并且在许多场景之间完全改变了音乐。 但是,它节省了很多时间,实际上,工作已完全准备好在截止日期的前一天发布。 这些额外的时间花在了敲定各个部分和音乐中的各种琐事上。 特别是在这个时候,入侵者和蟾蜍获得了另类的外表。

侦错


由于缺乏对实际硬件以及硬件本身的调试功能,因此仅在仿真器中调试了该演示。 主要工作是在FCEUX仿真器中。 它不是很准确,但是它具有良好的调试器,并且启动速度非常快,这对于“添加几行,运行,检查”的开发方法非常重要。 对时间紧迫的效果也进行了更精确但不太方便的MesenPunesNestopia调试

由于演示格式本身就意味着希望从平台上获得以前没有人做过的事情,因此它测试了模拟器的强度,包括表明他们对各种极端情况的不同意见,从而提高了准确性。 在一个仿真器中调试效果后,您可以在其他仿真器中获得工件。 因此,也由于NES体系结构的功能,与精确定时有关的许多效果必须重复调试多次。 结果,我设置了演示,以便在流行的FCEUX模拟器中进行清洁工作,并随同比赛一起使用,并在所有其他模拟器中进行正常工作。

在调试过程中发现的有趣错误中,场景中存在一个旋转徽标问题,该徽标仅在Mesen仿真器中体现出来。最初,此效果是根据将大量数据传输到视频存储器的启发而立即关闭的渲染下的渲染,并且直到下一帧开始时才重新打开。这在所有仿真器中都可以正常工作,但是在Mesen中,以一种难以理解的方式,飞行币的精灵显示完全停止了正常工作。转发后启用渲染可解决此问题。

该演示直接支持控制台NTSC版本,因为PAL支持它将大大增加工作量和调试时间-有些效果需要非常不同的设置,并且为了保持演示的持续时间和音乐的速度,您需要制作两组音乐数据并两次对效果进行手动调整。因此,在启动时进行系统确定,如果检测到PAL版本,则会发出有关可能的错误操作的警告。该演示本身会启动,但会在某些效果下使用强大的视觉伪像,但速度要慢17%​​。

发布后,一些观众在各种真实的控制台上进行了演示-美国NESFamicom AV甚至飞马(与Dendy Classic 2类似)在波兰,捷克共和国和其他一些国家/地区)。事实证明,该演示程序在所有控制台上通常都能正常运行,但在某些场景中存在视觉问题,而且最有趣的是,每个人的问题都不同。其中一些问题可能与流行的Flash盒中MMC3 映射器的实现不够准确有关,因为在具有真实MMC3的常规盒中出现的问题最少。下一个问题最少的配置是Pegasus,尽管那里的演示原则上不应该正常工作-它仅在Mario的舞台上显示了一个小物件。令我惊讶的是,最难调试且对时间要求严格的效果-旋转盒带-在任何测试熨斗配置上均可稳定运行。

硬件上发现的问题并不严重,最终将发布最终版本,并在此处进行修复。但是为此,还有哪些问题具体与演示代码有关,以及哪些测试配置功能尚待观察。之后,获得的信息可用于提高仿真器和闪存的质量

乐曲


音乐方面的工作始于从节目“ New Reality”中选择一个主题,然后尝试将其与“ Glory”交叉。这个过程花了很长时间。然后,AON激发了在演示的初始部分制作鼓的想法,即以两个不同高度的简单抖动信号的形式制作鼓,然后粗略地绘制了带有这种鼓的音乐片段,以产生一种称为演示的效果。这种想法还产生了相同的片段,但布局不同的情况,可以在带有问候的部分中使用,作为一般音乐主题的外表。在大多数情况下,音乐工作就在那里停止,其余的工作则在截止日期的前两天完成。同时,对效果和音乐素材进行了联合调整。

尽管NES声音系统功能适中,在平台上有Chiptune的几种传统,每种传统都有自己可识别的声音,直至猜测开发公司声音的能力。经过一些实验之后,我选择了一种混合风格,没有和弦琶音,这是日本音乐的典型特征,但是具有欧洲传统的合成鼓,听起来很强大,不需要使用样本通道。此通道未包含在演示中,因为它对代码的运行时间有很大影响,这会使与光束通过栅格时间有关的效果的调试复杂化。

在收割机中使用MIDI键盘进行选择和实验,在流行的FamiTracker编辑器中直接以传统方式编写音乐以进行现代开发。在创作旋律时,通过在收割者中用 MIDI键盘即兴演奏来进行搜索,而FamiTracker循环播放以前编程的节奏。



由于标准的FamiTracker播放器相当大地加载了NES处理器,最多占用了帧时间的五分之一,而替代播放器极大地限制了可能性,因此决定将寄存器转储经典版用于低功耗计算机上的演示-尽可能快地进行,但需要大量的内存。磁带盒上有足够的空间,可以省去最简单的格式而无需压缩。效用已经取得了转储的形成,从“丢失”排出FamiTracker “和NSF文件并将所有寄存器更改写入二进制文件。换句话说,音乐播放器的整个逻辑将进入编译阶段,在NES上,仅将完全完成的数据发送到声音生成器。

为了更好地与效果同步,还向音乐数据流添加了标记。在演示中,它们用于在带有标题和问候的场景中闪烁。标记被直接安装在FamiTrackerZXX,其标称设计用于直接安装电平DAC信道样本。

解析效果


开头的题词


该代码是从旧项目中借用的。该行的出现部分将显示带有不同调色板的精灵,然后将其压印在背景中。题为“基于真实效果”的提示暗示进一步的效果并非如此,这是在不断辩论有关演示中动画的可接受性和作用这一话题。

大象和爬行线简介


效果的想法从立即插入一条直线开始,一直延伸到完整的场景。因此,第一个角色出现在演示中。

从技术上讲,场景非常简单,主要困难在于将Graphics Gale中绘制的图形转换为多层精灵,以在其中提供异常多的颜色(10)。只有四层,每层都有自己的调色板。这些图层分别转换为NES屏幕工具,并在metasprite编辑器中手动堆叠到一个普通的sprite中。


干扰


简介的最初想法没有受到干扰,但原则上已计划了类似的效果,只是不清楚它最合适的位置。它成为第一批产品,为后来的更复杂效果的发展奠定了基础。

磁贴集包含8组噪声,它们由32个磁贴的不同密度组成,这些噪声是由PC上的一个简单程序生成的。它们显示在图块地图的前八行中。使用MMC3中断,该中断每隔七行触发一次栅格(同步丢失一个),对于每个图块行,通过大致设置显示地址来设置背景层的随机偏移。与相同密度的简单噪声相比,这使您可以获得更逼真的干扰动画。



彩色的条纹


为演示编写的第一个完整效果。实际上,它由两部分组成-首先显示一个计时器,显示当前的演示计时接近真实时间,然后将效果切换为逐渐增加的乐队动画。

尽管计时器在外观上看起来非常简单,并且您一眼便看不到它,但它在平台框架内也做了一些不寻常的事情。数字的大小为12x16像素,但是背景层由8x8的图块组成,并且子画面不能覆盖超过四分之一的屏幕宽度-而计时器则占三分之二。为了能够显示不适合网格的字体,应用了一个技巧-准备了一个从00到99的所有数字对的图形,然后将其转换为一组图块,并去除重复项-因此它可以容纳一百五十个图块。计时器下降效果是通过简单的垂直滚动产生的。由于颜色条的图形是纯色填充,因此它们的移动不会在视觉上出现。



题词离开屏幕后,将打开与干扰效果相同的MMC3中断处理程序,但是这次将其配置为在屏幕的所有显示行中简单地复制切片图的顶行。

缩小和放大的动画是针对图块地图的一行完成的,也就是说,仅32个字节的视频内存需要更新。该效果包含238帧,因此动画数据占用7 KB。在效果显示过程中,这组图块不会改变,它包含不落在图块边界上的带的所有可能的颜色过渡,共有53个。颜色过渡本身是手绘的,并且带的动画是由PC的更复杂的程序生成的,首先绘制了所需带比例的框架,并且然后从现成的集合中选择适当的图块和属性。


职称


首先,在该场景中还假装了另外两个具有相同字母的更复杂的效果;因此,选择了更易于实现的第三个选项。

字体被制成矩形以便于动画显示。每个字母基本上具有五个常规像素的高度和四个宽度。字母的每一行中有五种不同的像素组合。 Blender准备了一个动画,可以使所有五个组合从边缘到平面平滑旋转。将帧合并为一个文件,将颜色减少为三种颜色,然后将图像导入NES屏幕工具 -这样就为动画本身提供了一组82个图块和一个图块贴图。实际上,有两个这样的集合,用于沿不同方向旋转字母。



旋转字母显示在图块地图上;它由五个必需的动画条纹组成。由于一次只能看到一个字母动画,因此可以更改面部的颜色,从而产生了多种颜色的错觉。到达屏幕边缘的字母由精灵显示,它们的坐标和速度可以非常精确地手动选择,以创建必要的平滑度和物体速度的变化。精灵到达屏幕上的所需位置后,将替换为背景层上的动画。



通过中断处理程序MMC3制作了以不同速度飞行的水平条,这次它为每行图块设置背景层的水平水平像素偏移。

太空侵略者


这个非常简单的场景的想法是,在某个图片中聚集了大像素的旋转现象开始于作品的开始,与此同时Gale中手动绘制一些旋转动画选项。当演示的概念最终得以确立时,场景本身才得以实现,想法似乎表现出了邪教人物。



通过在背景层的视频存储器中记录来输出图块。星星由精灵显示。

根据每拍的图像,场景与音乐的同步说明了场景的持久性。尚未对显示效果的时间进行任何专门研究,并且看起来似乎并不很无聊。

旋转徽标


由于缺乏效果和开发它们的时间,我决定重用几年前写的一个小介绍,其中字母沿着静态徽标沿着相同的路径飞行。 最近,我再次对N64前缀产生了兴趣,我在90年代后期就忽略了它,在研究其他效果的过程中,一个自发的想法想到了著名徽标旋转的动画,这似乎很容易实现-这两个想法融合在一起,但是实现花费了比预期更长的时间。

场景的主要技术复杂性是减少了这种平滑而大型的动画所需的内存量。 如果您不压缩地存储其帧,则一帧将占据一个4 KB的集(因为两个帧无法容纳256个图块),并且将占用256 KB的图形ROM,即演示中使用的所有卷。 为了解决这个问题,一次应用了三个技巧:仅旋转90度(64帧)的动画,之后交换两种面部颜色; 有损图形转换,将四个帧的组放置在256个图块的集合中; 以及更新栅格可见部分中的视频内存。 因此,动画占用的空间减少了四倍。

字母模型和旋转动画是在Blender中制作的。 在她反映自己的想法来对应于演示的概念,这是有趣的 - 的场景说,“和和和和和和。” 动画帧被分组,颜色深度减小到4,并且这些图像通过NES屏幕工具中的有损导入功能进行转换。 此功能也许是我的主要秘密武器-如果在压缩过程中超出了图块限制,它将搜索最相似的可视图块并将其合并,直到剩下所需的图块数量为止。 当然,这会产生可视化的转换痕迹,并且需要随后的手动优化,但是允许您以更少的劳动将更复杂的图像压缩到极限。



对于徽标动画,切换图块组,并更新背景图块映射中的14 x 14图块窗口,为此使用了在文本行之前触发的MMC3中断。 该行还需要将图形设置切换为字体,然后在显示铭文行的时间中存在代码延迟,然后显示器关闭(背景颜色一直显示)并将数据传输到视频存储器。

硬币由子画面显示,并沿着或多或少诚实地计算出(使用固定点)的路径飞行。 对旧代码进行了修改,以便在可能的情况下进行旋转而不与较大的徽标相交,并且使硬币在正确的时刻逐渐出现和消失。 它们使用每个精灵具有的优先级标志超出徽标的图形。

旋转墨盒


效果的实现很简单,但是需要很长时间的调试。 中断处理程序在所需的行上启动光栅效果(为主线程留出时间)。 接下来,执行具有非常精确选择的时序的代码,以针对屏幕的每一行设置显示的图块地图的逐像素垂直偏移。 这需要一个非常棘手的写入PPU寄存器的方案,并且其中一些必须准确地落在该行的某个位置。 在机顶盒的NTSC版本中,处理器时钟速度和像素重复率不是倍数,并且代码执行时间可能会因几个因素而略有不同,因此每条线的时序会逐渐偏离并需要校正。

该场景的图形主要部分是几年前绘制的,用于先前为NES制作演示的尝试,但现在已经添加了其他墨盒表面和演示徽标。 原始图像高度堆叠在一个屏幕中。 为了简化效果代码,同一行在墨盒的背面重复多次。



旋转动画预先使用PC程序进行了完全计算,并占用了大量的ROM代码-三个存储区,每个存储区16 KB,其中,对于动画的256帧中的每一帧,表都存储在176个显示的光栅行中。 可以实时产生效果,我已经在另一个平台上做了类似的演示,但是在这种情况下,有足够的可用内存,没有多余的时间。

吃豆子


最初计划了一个更复杂的场景,但是由于时间紧缺,她以最简约的形式进入了演示,以音乐更换时场景的分解形式出现。

主要问题是找到一种快速创建动画的方法。 首先,提出了再次使用Blender或其他图形程序的想法。 但是经过第一次尝试和一些计算之后,很明显,只有八帧将嘴巴从完全闭合的位置张开到完全打开的动画就足够了,并且在Gale中手动绘制它们会变得更加容易和快捷。

接下来,为PC编写了一个程序,获取整个动画周期的一系列帧,并查找在图块之间变化的帧。 视频存储器中的图块映射中这些图块的地址保存为可变长度列表,演示中的效果只是更新了这些列表的更改部分。 所有帧的图形适合一组拼贴,并且在效果期间不会改变。



柯比


此效果已在我的 Catrix 图片上调试。 有计划通过某种视觉效果将猫的脸部图像更改为柴郡猫的替代图片。 当提出将游戏角色添加到演示中的想法时,经过短暂的选举-迫切需要绘制两张新的全屏图片-决定采用Kirby并使其成为“柴郡”版本。 在此过程中更改图像的效果已简化为短暂的闪烁。

当运动图像块到达正确的位置时,它们将显示为精灵,并印在图块地图上。 类似地,发生块删除。

塔楼


我一直很喜欢Battletoads游戏的最终关卡中的效果,我一直想重复一遍。 在演示中,他带着问候来到了现场。

技术部分非常简单,这是背景层的常规垂直滚动。 旋转效果是通过对图块的图形进行动画处理来实现的,而图块的地图保持不变。 对于动画, MMC3模式与四个可切换的CHR窗口一起使用。 第一个窗口包含静态部分的图块,而其他三个窗口以不同的速度切换。 其中一个窗口还可以平滑地更改动画的方向。 由于在每个窗口中放置了64个图块,并且动画元素仅需要28个,所以在每个窗口中复制图块的图形以接收相反方向的动画。



实现效果的主要问题是动画的准备。 它是由PC上的程序执行的,该程序在输入端为每个像素列采用16x16纹理和速度表,并以256个图块(其中一些为空)的形式生成16帧动画块。 通过incbin汇编程序指令的选项,可以将NES屏幕工具中转换为所需的格式,并以所需的偏移量分发到ROM图形库中。

关于问候语的另一个重要任务是不要忘记将其传递给每个想要的人。 由于此数字趋于无穷大,因此过长的场景看起来很无聊。 我决定只将自己限制在与我交往一年的人身上。 想到的名称存储在文本文件中。 当然,完成工作后,事实证明我仍然忘记提及很多人。

走廊


人们希望用透视图制作某种场景,例如经典隧道。 由于复杂性,经典隧道或真实的Wolfenstein 3D rakester已消失。 此外, NES已经拥有数种真正的rakaster,包括纹理,但是由于极低的速度,它们看上去都不太令人印象深刻。

我对早期游戏中的伪三维图形非常感兴趣,并且在旧的开发中,已经有一个精灵走廊,带有平滑的转弯动画,灵感来自ZX SpectrumZig Zag游戏。 决定使用它。 由于抽象走廊本身不是很有趣,因此发明了带有Mario和厕所幽默场景的内部情节,从而从逻辑上完善了整个场景以及整个演示。 场景是最后一个场景,尽管使用了空白,但连续工作超过11个小时,这还不包括规划过程中的准备工作。

在Gale中手动跟踪所有运动帧。 这是演示中的唯一效果,速度低于每秒60帧,尽管它可以以该速度工作而没有任何问题。 出于视觉可读性和在走廊上投掷音乐时与音乐同步的原因,屏幕刷新率被限制为每秒30帧,作为添加运动中间阶段的替代方法,因此没有足够的准备时间。

图形框架占用了两组磁贴。 在动画的必要时刻,将更新背景层,连接所需的图形集,并在两个调色板(分别用于屏幕的上半部分和下半部分)中设置两种颜色,因为旋转90度时,墙壁的颜色会改变位置。

首先,将动画拼贴卡通过代码从ROM的两个插入式下层存储区之一中的固定存储区复制到RAM。 在效果的显示窗口正下方显示光栅的过程中,渲染已关闭,数据从RAM传输到视频存储器。 关闭渲染还充当Mario精灵的视觉剪辑的下限。

字幕


根据旧项目之一的代码,此场景是第一个出现在彩条之后的场景之一。 它已经支持两种字体,不同的调色板和最后的减速。 对于该演示,绘制了新字体,该字体可在任何地方使用,并且在屏幕边缘添加了效果。

最初,我想使边缘平滑地变暗,但是在初步实验中,我尝试了使用水平线偏移的选项,我喜欢这种结果,因此决定不花费额外的时间。 使用NES视频控制器的有争议功能添加了轻微阴影,即对颜色分量进行增益静音。 争议在于以下事实:在不同的区域版本和控制台克隆中,此功能的工作方式不同,但是在此应用程序中应该没有任何特殊问题(不包括所谓的RGB PPU ,其中边缘将被白色填充)。

检视


在制作字幕场景的那段时间,这个场景的想法自然而然地出现了。 最初的想法是在一个随机的时刻插入它,但是最后它成功地适合了结尾。 尽管持续时间很短,但场景由三个元素组成:模拟小精灵的缩放比例,通过交替两帧增加灰色阴影的数量以及以编程方式播放DPCM样本。

为了模拟缩放,使用了NES上所有大的sprite都由小的sprite组成的事实,在这种情况下,大小为8x16。 如果将它们彼此相对移动,则可以得到缩放或失真的效果,通过较小的更改值,它们看起来相当不错。 为此,您需要将每个子画面相对于中心的偏移量乘以一个比例,但是由于NES处理器无法应对大量偶数整数乘法,因此应用了技巧-在帧的开头,考虑沿X和Y轴的坐标网格,并且子画面输出使用这些预先计算的值。 因此,所需的乘法次数已大大减少-使用8x8元素(64个精灵)的复合喷雾,仅需要16(8 + 8)次乘法,而不是128(8 * 8 * 2)次。

NES只能显示4种灰色阴影,包括白色和黑色。 该效果模仿了7个渐变:如果在整个帧中显示白色和白色像素,它将为白色,如果灰色和灰色则为灰色,并且如果您交替使用白色和灰色,则在视觉上它将看起来像是介于白色和灰色之间的中间渐变。 再次遇到的主要困难是图形的准备,即图像的两个半帧,这是通过GaleGIMP中的许多手动操作执行的。 为了减少闪烁,半帧的线条交替出现。



需要DPCM的程序回放,因为没有更好的格式存储样本的空间,硬件支持无法从存储器下半部分播放样本,但是在上部不可切换的存储器中没有这样长度的样本。 声音片段本身不是来自原始的屏幕保护程序,而是来自具有残酷装饰效果的著名游戏的相当类似的叮当声,在实际完成时会发出声音。

记忆卡


在开发过程中,经常使用NES Space Checker实用程序,该实用程序可视化了存储库的填充。 看到程序内部内容和位置的一个很好的例子非常有趣。



PRG00 ... PRG02-音乐数据
PRG03-具有View场景的示例
PRG04 ... PRG06-墨盒旋转动画数据
PRG07-深入走廊的瓷砖动画
PRG08-走廊中的瓷砖旋转动画
PRG09-塔楼现场代码
PRG0A-具有旋转徽标的场景代码
PRG0B-具有名称和走廊的场景代码
PRG0C-带有旋转墨盒,Kirby,View,入侵者,Pakman的场景代码
PRG0D-带有简介,噪点,颜色条,字幕的场景代码
PRG0E-代码的主要存储区,仅包含所有场景的调用
PRG0F-固定代码库,音乐播放器,子画面输出,中断处理程序

CHR00-小象和彩色条纹砖
CHR01-字体和杂讯
CHR02-查看名称中的旋转字母的精灵和图块
CHR03-普通柯比瓷砖
CHR04-柴郡柯比瓷砖
CHR05-带有旋转墨盒的场景的图形
CHR06 ... CHR0D-旋转徽标动画
CHR0E-一种用于入侵者瓷砖的问候和动画的字体
CHR0F-百曼瓷砖
CHR10 ... CHR13-塔纹理动画
CHR14-走廊瓷砖
CHR15-雪碧马里奥
CHR16 ... CHR1F-未使用

而不是结论


我将以连环模因结尾:在任何无法理解的情况下,编写演示场景,先生们!

Source: https://habr.com/ru/post/zh-CN474960/


All Articles