《魂斗罗》中的角色,趴下的时候总是要「萝莉式屈腿俯卧」

知乎日报 胜勋;Thinkraft; 367℃ 评论

《魂斗罗》中的角色,趴下的时候总是要「萝莉式屈腿俯卧」

图片:《魂斗罗》

KONAMI 的《魂斗罗》(Contra)中角色为什么要“萝莉式屈腿俯卧”?

胜勋,游戏开发者

FC 的图形处理器(PPU)有如下的硬件限制:

1,一帧画面的同一个横轴上,最多同时能渲染 8 个 SPRITE。

2,一个 SPRITE 为 8x8 Pixel 或者 8x16 Pixel。

所以,把角色尽量做成《上下长》《左右短》的形状,才可以避免角色的闪烁现象。

另外,楼主说《改成下蹲也可以减少活动块儿》,此话甚是啊。

问题是,魂斗罗需要趴下来躲避横向飞过来的炮弹啊。

如果把趴下改成下蹲的话,请看下图

大炮发出的绿色炮弹,能直接打在魂斗罗的脸上,死定了。

所以魂斗罗必须趴下。要么直腿趴下狂闪烁,要么萝莉趴。

有网友提到《不对吧,KONAMI 的绿色兵团是直腿趴下的》。

所以我也做了截图,请看下图

蓝人和红人,同时趴下,横面上又出现了 3 个小兵。

蓝人问红人:你的头哪去了?

红人回答说:FC 同轴最多显示 8 个 SPRITE,让我们一起闪烁吧

于是乎,请接着看下面一系列的图

蓝人说:哎哟!我的脚哪去了?

呵呵,这些图是连续的静态画面。

实际游戏画面里是各个角色一顿轮番闪烁的。

Thinkraft,Obsessive-Compulsive-Personality-Disorde

@胜勋的答案说得不错。我这里补充一些额外信息。

首先是关于活动块(Sprite)

为了最大限度利用资源、提升表现效果,2D卷轴时代的游戏机基本上都是背景+活动块+色盘的设计,我以前在拳皇中的人物变色是如何实现的? - Thinkraft 的回答中提到过MVS的实现,这里说说FC的。

由于PPU机能限制,FC每个水平扫描行只能显示8个活动块

FC的PPU运行频率是5.36MHz,输出256*240@60Hz画面。具体原理在http://wiki.nesdev.com/w/index.php/PPU_rendering有很详细的介绍,我这里简单总结一下:

每秒60帧,每帧渲染262行(其中240行输出可见图像,其余空闲时间用于写入显存数据),每渲染一行使用341个PPU cycle。其中每个背景块需要8个cycle处理;每行有32个背景块(256/8),因此光是背景处理就需要256个cycle;此外每个活动块也需要8个cycle处理,再扣掉预读下一行数据的时间,最后结果就是设计上只允许显示8个活动块。

(参见http://wiki.nesdev.com/w/index.php/File:Ntsc_timing.png

如果游戏在同一扫描线上存在超过8个活动块,多余的将不会被显示。

一个可行的解决方案是利用人眼视觉暂留效果,使用Flicker(闪烁),即轮流显示这些活动块——同一帧内的静态图像还是只有8个,动起来就能看到全部了。

程序员必须手动实现Sprite优先级的调整,以保证游戏效果——如果敌人的子弹总是隐形的,玩家就要摔手柄了。

除了同屏活动块总数限制(64个)、同扫描行显示限制(8个)之外,还有一个重要限制是Palette(色盘)。

FC定义了64个系统颜色,去掉不可用的和重复的是53个(也有说法是54或55)。所谓色盘,就是从这53个颜色中挑出4个,编上号,供图块使用,也就是说FC的每个色盘只有4色——实际上是3色,因为背景块的0号色必须是通用背景色,而活动块的0号色必须是透明。系统支持4个背景块色盘和4个活动块色盘。

每个活动块只能使用一个色盘。换句话说,单个活动块只能显示3种颜色

那么,来看看FC魂斗罗的图片吧(素材取自http://www.sprites-unlimited.com/game/?code=contra,背景色被我处理成粉色):

这个趴姿射击的图片,尺寸是32*16,总共用到了8个8*8的活动块(或者4个8*16,这里暂且认为是前者)。你可以清晰地看到,左半的4个活动块和右半使用了不同色盘,导致上臂部分都变色了

由于枪伸出太多,光是上半身就占用了一大半宽度。如果把腿放平,最少也要再加一个活动块才可以。

再看看主角死亡时的图片:

注意裤腰的位置,上半身只占了一小半宽度。于是这次终于有一条腿可以伸平了。另一条腿弯着可能是多少想显得立体一些吧。

总之,我的结论和 @胜勋 是相同的:就FC魂斗罗而言,趴姿屈腿是为了节省活动块,不蹲是因为蹲下躲不过子弹

——所以你看,这是画风问题(大误)。

然后再说说题主编辑的关于角色尺寸的疑问「测量了一下发现人物卧姿长度有36个像素」。这个追问其实根本就是无效的——我这里严重怀疑题主的模拟器截图精确性,比如不小心拉伸了一下窗口导致画面变形之类的。

FC超级魂斗罗图片素材参照http://www.spriters-resource.com/nes/superc/sheet/12076/

续作中重绘了角色动作,下半身的取色也被调整了。然而整体宽度依然是32像素(4*2个活动块)。

最后,问题并没有完全解决。因为以上说的都是FC版(1988)的情况,而魂斗罗原作是街机游戏(1987)

如图,原作中的趴下也是屈腿。

本来想回答得更确切一些,但我并没有找到明确靠谱的关于这个机台的硬件信息。考虑到当年的游戏机画面原理大同小异,只是性能的区别(例如后来的MVS,同一水平线支持96个宽度为16像素的活动块),这个屈腿动作应该也是相同的原因。

上图中角色的宽度是48像素,正好是8(或16)的整数倍。

大概就说这么多吧~

转载请注明:微图摘 » 《魂斗罗》中的角色,趴下的时候总是要「萝莉式屈腿俯卧」

喜欢 (0)or分享 (0)
发表我的评论