原標題《魂斗羅中的角色,趴下的時候總是要「蘿莉式屈腿俯臥」》,IT之家編輯酌情修改。
游戲開發(fā)者勝勛作如下解釋:
FC的圖形處理器(PPU)有如下的硬件限制:
1、一幀畫面的同一個橫軸上,最多同時能渲染8個SPRITE。
2、一個SPRITE為8×8 Pixel或者8×16 Pixel。
所以,把角色盡量做成“上下長、左右短”的形狀,才可以避免角色的閃爍現(xiàn)象。
另外,“改成下蹲也可以減少活動塊兒”,此話甚是啊。
問題是,魂斗羅需要趴下來躲避橫向飛過來的炮彈啊。
如果把趴下改成下蹲的話,請看下圖——
大炮發(fā)出的綠色炮彈,能直接打在魂斗羅的臉上,死定了。
所以魂斗羅必須趴下。要么直腿趴下狂閃爍,要么蘿莉趴。
有網(wǎng)友提到“不對吧,KONAMI的綠色兵團是直腿趴下的?”
所以我也做了截圖,請看下圖——
藍人和紅人,同時趴下,橫面上又出現(xiàn)了3個小兵。
藍人問紅人:你的頭哪去了?
紅人回答說:FC同軸最多顯示8個SPRITE,讓我們一起閃爍吧
于是乎,請接著看下面一系列的圖——
藍人說:哎喲!我的腳哪去了?
呵呵,這些圖是連續(xù)的靜態(tài)畫面。
實際游戲畫面里是各個角色一頓輪番閃爍的。
Thinkraft表示以上勝勛的答案說得不錯。要繼續(xù)補充一些額外信息。
首先是關于活動塊(Sprite)。
為了最大限度利用資源、提升表現(xiàn)效果,2D卷軸時代的游戲機基本上都是背景+活動塊+色盤的設計,我以前在《拳皇中的人物變色是如何實現(xiàn)的?- Thinkraft的回答》中提到過MVS的實現(xiàn),這里說說FC的。
由于PPU機能限制,F(xiàn)C每個水平掃描行只能顯示8個活動塊。
FC的PPU運行頻率是5.36MHz,輸出256*240@60Hz畫面。具體原理在維基百科中有很詳細的介紹,我這里簡單總結一下:
每秒60幀,每幀渲染262行(其中240行輸出可見圖像,其余空閑時間用于寫入顯存數(shù)據(jù)),每渲染一行使用341個PPU cycle。其中每個背景塊需要8個cycle處理;每行有32個背景塊(256/8),因此光是背景處理就需要256個cycle;此外每個活動塊也需要8個cycle處理,再扣掉預讀下一行數(shù)據(jù)的時間,最后結果就是設計上只允許顯示8個活動塊。
如果游戲在同一掃描線上存在超過8個活動塊,多余的將不會被顯示。
一個可行的解決方案是利用人眼視覺暫留效果,使用Flicker(閃爍),即輪流顯示這些活動塊——同一幀內的靜態(tài)圖像還是只有8個,動起來就能看到全部了。
程序員必須手動實現(xiàn)Sprite優(yōu)先級的調整,以保證游戲效果——如果敵人的子彈總是隱形的,玩家就要摔手柄了。
除了同屏活動塊總數(shù)限制(64個)、同掃描行顯示限制(8個)之外,還有一個重要限制是Palette(色盤)。
FC定義了64個系統(tǒng)顏色,去掉不可用的和重復的是53個(也有說法是54或55)。所謂色盤,就是從這53個顏色中挑出4個,編上號,供圖塊使用,也就是說FC的每個色盤只有4色——實際上是3色,因為背景塊的0號色必須是通用背景色,而活動塊的0號色必須是透明。系統(tǒng)支持4個背景塊色盤和4個活動塊色盤。
每個活動塊只能使用一個色盤。換句話說, 單個活動塊只能顯示3種顏色。
那么,來看看FC魂斗羅的圖片吧:
這個趴姿射擊的圖片,尺寸是32*16,總共用到了8個8*8的活動塊(或者4個8*16,這里暫且認為是前者)。你可以清晰地看到,左半的4個活動塊和右半使用了不同色盤,導致上臂部分都變色了。
由于槍伸出太多,光是上半身就占用了一大半寬度。如果把腿放平,最少也要再加一個活動塊才可以。
再看看主角死亡時的圖片:
注意褲腰的位置,上半身只占了一小半寬度。于是這次終于有一條腿可以伸平了。另一條腿彎著可能是多少想顯得立體一些吧。
總之,我的結論和勝勛是相同的: 就FC魂斗羅而言,趴姿屈腿是為了節(jié)省活動塊,不蹲是因為蹲下躲不過子彈。
——所以你看,這是畫風問題(大誤)。
然后再說說題主編輯的關于角色尺寸的疑問「測量了一下發(fā)現(xiàn)人物臥姿長度有36個像素」。這個追問其實根本就是無效的——我這里嚴重懷疑題主的模擬器截圖精確性,比如不小心拉伸了一下窗口導致畫面變形之類的。
續(xù)作中重繪了角色動作,下半身的取色也被調整了。然而整體寬度依然是32像素(4*2個活動塊)。
最后,問題并沒有完全解決。因為以上說的都是FC版(1988)的情況,而魂斗羅原作是街機游戲(1987)。
如圖,原作中的趴下也是屈腿。
本來想回答得更確切一些,但我并沒有找到明確靠譜的關于這個機臺的硬件信息??紤]到當年的游戲機畫面原理大同小異,只是性能的區(qū)別(例如后來的MVS,同一水平線支持96個寬度為16像素的活動塊),這個屈腿動作應該也是相同的原因。
上圖中角色的寬度是48像素,正好是8(或16)的整數(shù)倍。
微信搜索“IT之家”關注搶6s大禮!下載IT之家客戶端(戳這里)也可參與評論抽樓層大獎!