Pico-8——神奇的虛構遊戲機
當已有的機器無法給你更多啟發的時候,那就換一台虛構的吧。
原文刊載於《Skrolli》雜誌,本文翻譯自 2016.1E(國際版):Pico-8 – Fascinating fantasy console
許多的電腦愛好者在它們的發燒之路上嘗試過各種各樣的硬體設備和軟體平台。而很多時候它們會有意的搜集這些平台和設備,來嘗試上面的遊戲或是完成它們的藝術作品。這一探索過程也幫助這些發燒友們了解各個平台的特性,並幫助他們發掘自己喜愛或是感興趣的電腦平台。而虛構的遊戲機平台Pico-8就是其中別具趣味的一個。
對Pico-8最好的解釋,就是它是一款並不真實存在的遊戲機的模擬器。它的具有非常鮮明的8-bit風格,因此你可以把它像想為類似Game Boy Color這樣的小掌機。它的提供一塊128x128像素,16色的顯示屏,以及四通道的音樂晶元。
不過,Pico-8卻不僅僅是某種架空歷史的實踐,它設計的出發點與市面上已有的類似設備有著很大的不同。它並沒有試圖去最大化的利用有限的邏輯功能,而是提供了一批積木式的代碼部件,儘可能的挖掘使用的樂趣。開發商希望隨著時間的推移,Pico-8的技術框架將形成一種獨特的審美觀:極簡主義並有著豐富的表現力。
第一印象
Pico-8乍看上去有一點「精神分裂」。啟動之後它給人的感覺並不是一台遊戲機,而更像是一台帶有鍵盤滑鼠的家用電腦。它使用命令解釋器來載入軟體和輸出提示,舉例來說,按下ESC按鈕,你會打開一個文本編輯器,它具有自己獨立的區域來存儲代碼、圖像和聲音內容。不過,只有系統內置的應用程序可以訪問鍵盤、滑鼠和完整的文件系統——對於外部載入的應用程序來說,Pico是一台使用ROM卡帶和雙按鈕手柄的遊戲機。
Pico使用Lua作為它的開發語言,這款為遊戲腳本而生的語言雖然功能有限,但卻具有強大的表達能力。實際上,Pico虛擬機本身並不模擬任何處理器晶元——它甚至不會執行位元組碼。所有的東西全都使用Lua寫成,這也是程序員們能訪問到的最底層的東西。
分發Pico-8平台的遊戲和軟體主要有兩種方式,一種方式被稱作「卡帶」(cartridges)或者「卡」(carts),它實際上是一張PNG圖片,看起來像是一張帶有封面貼紙的遊戲卡,「卡帶」圖片使用了文件的低位(lower bits)來存儲程序代碼、圖像和聲音數據,類似某種文件指紋。而另一種方式則是將軟體導出為HTML5格式並使用現代瀏覽器來運行,以這種方式運行的軟體可以不需要Pico-8環境。
邊界和限制
Pico最明顯的技術特徵就是128x128像素的屏幕解析度以及固定的16色調色盤了,這一調色板具有相當獨特而易於辨識的色彩組合,顯示了其設計者對色彩的嗅覺相比一般的工程師更勝一籌。
雖然典型的Pico遊戲通常使用8x8像素的方格來構成遊戲地圖,並使用8x8像素的動畫精靈,但這卻不是平台的限制之一。Pico的圖形模式是純粹的像素緩衝模式,它實際上可以繪製任何的圖形——而機器的性能也足夠流暢的運行90年代演示程序中的各種特效。不過,平台通過提供速度更快的繪製地圖和精靈的功能函數,鼓勵開發者使用8x8像素快而不是使用自己的代碼逐個像素的繪製圖形。
一張「遊戲卡」可以存儲15360位元組(15KB)壓縮後的代碼,編輯器所能支持的最大長度是65536個字元或是8192個「標記」(tokens)。這一限制實際上並不容易達到,即使是許多Pico平台上最好的遊戲其代碼量也要明顯低於這個數額。從另一個方面講,這種限制鼓勵開發者開發簡單而線性的遊戲邏輯,Pico上面沒有空間容納龐大的遊戲引擎或多層的抽象邏輯。
「遊戲卡」上還有12544位元組(12.25KB)的空間預留給圖像資源,另外4608位元組(4.5KB)則留給聲音。當然這些數據區域也可以被用作其他用途——內存操作指令可以在位元組層面去操作它們。當程序開始運行之後,「遊戲卡」中的數據將會被複制到RAM,然後程序就可以在需要的時候修改它們。用戶可使用的RAM還包括了略低於7KB的用戶保留空間,以及8KB的顯存。
圖形數據由8x8像素的精靈組成,它們可以包含調色板中的任意顏色。系統可以支持最多256個精靈,而地圖則由128x32個精靈組成。如果只使用128個精靈的話,地圖的尺寸還可以再翻倍。
在聲音方面,與「精靈」對應的是「聲效」(sound effect - sfx),每個聲效由32個音符位置(note locations)組成,每個音符位置都包含了音符和它的波形、音量和特效,每一個選項都有8種不同的設置可選,播放的速度也可以修改,較慢的播放速度更適合演奏音樂而不是音效。
與Tracker(序列器)音樂類似,一首歌曲由四個通道上定義了不同效果的「圖案」(patterns)構成,Pico-8支持最多64個圖案,通過使用循環和圖案結束標記可以在一個文件中容納多首歌曲。
雖然Pico-8的圖形功能可以讓開發者操作單個像素,但用戶卻無法直接訪問聲音系統的「寄存器」。理論上講你可以通過實時修改聲音數據來實現播放器功能,但虛擬機的時序限制很可能讓這種功能無法被實現出來。不過,通過向音效內存里寫入隨機數據的方式,還是可以輕鬆的創造出若干試驗性的聲效的。
除了程序代碼,數據RAM和卡帶ROM之外,Pico還為Lua解釋器提供了256KB內存空間。相比Pico的其他內存空間來說這一空間要大上不少,但它卻比較容易被用完,比如說在操作大型表(Table - Lua中的一種數據結構)的時候。數字表的每個元素最多可以存儲8位元組,但實際的數據只能使用其中的一半。每個數字包含16 bit整數和16 bit小數部分,這些意味著通過位算數運算可以對它們進行比較。
當內存空間不足時,Pico也可以從其他ROM卡帶中讀取數據,甚至可以向卡帶中寫入數據。但程序代碼有著嚴格的限制,只可以從它們原始的卡帶中運行。Lua本身支持將數據作為代碼運行,但Pico-8刪除了這一功能,這意味著需要使用更多代碼空間的程序需要構建它們自己的虛擬機。
Pico-8並不能以電腦處理器的全速執行Lua代碼。執行不同函數所需的時間已經被預先設定好。而這種速度限制也可以減少典型的Pico軟體開發時所可能出現的問題,同時也將其對硬體的需求標準化,並避免了硬體需求的螺旋上升。按照作者的描述,第一代的樹莓派就足以讓最複雜的Pico軟體全速運行了。
如何編寫代碼?
Lua是一種全部使用大寫字母的語言,因此它往往會讓人聯想起BASIC。舉例來說許多人都會記得如何使用BASIC語言無限循環列印文本:
::START::PRINT "HELLO"GOTO START
不同於標準的Lua庫,Pico提供了一組有限的BASIC風格的函數:其中包括了繪圖函數,一組聲音函數,控制器輸入函數和一些內存管理、數學運算、位運算和字元串處理函數。
基本的繪圖命令可以繪製像素、四邊形、線段、圓形、文本、精靈和背景地圖。繪圖命令可以切換其使用的調色盤顏色,你也可以將精靈和背景的顏色變為透明色。
Pico繪製活動圖形的功能更接近於PC而不是8-bit家用電腦。Pico沒有「硬體精靈」或者「硬體捲軸」相反,通常每一次刷新都需要重新繪製:清除屏幕、繪製背景並繪製需要的精靈。
繪製精靈可以使用兩個不同的函數:spr()可以在指定的坐標上繪製一個8x8像素的精靈,而sspr()則可以在任意區域以任意縮放比例繪製精靈。縮放功能可以幫助開發者實現在大多數經典硬體上開銷較大的技巧,比如說Doom風格的紋理映射。
開發者可以將繪圖命令放到一個無限循環當中,但更優雅的方式則是將其定義為名為_draw()的函數,這樣每一次屏幕刷新都會觸發到它,也就是說每秒會調用30次。因此上面的例子可以被這樣改寫:
FUNCTION _DRAW()PRINT "TERVEHDYS"END
btn()函數可以讀取遊戲手柄狀態,它支持使用數字作為檢查特定按鈕是否被按下的參數。一段將0號精靈向左或向右移動的代碼大概是這樣:
X=64FUNCTION _DRAW()CLS()SPR(0,X,112)IF BTN(0) THEN X=X-1 ENDIF BTN(1) THEN X=X+1 ENDEND
為了能夠在屏幕上有所顯示,在執行這段代碼之前,您需要先在精靈編輯器里繪製0號精靈。
有時候_draw()函數可能包含了太多的功能,因此無法在每次屏幕刷新時執行。在這種情況下,開發者需要改用_update()函數來刷新遊戲狀態——理論上講——它每秒也會被調用30次。同樣的從理論上講,由於沒有使用定時器中斷,如果_draw()花費的時間更長,它可能會被調用若干次。
一般來講雙緩衝(Double-buffering)的繪圖技巧在Pico上面並不適用,因為只有當_draw()函數執行完成後更改顯存的操作才其作用。另一方面來講,即使在刪除掉一些聲音效果之後,用戶內存也僅僅能夠裝下一個全屏雙緩衝器。
聲音方面Pico提供了sfx()和music()兩個函數。前者會在第一個空閑的通道上播放指定參數的音效,而後者則會從指定的「圖案」編號處開始播放音樂。
小型2D遊戲的開發者們並不需要太在意命令執行的速度,只有當將要達到平台極限的時候才會出現問題。pset()函數刷新屏幕上所有像素所需的時間大概是正常情況下屏幕刷新的1.5倍。直接使用poke()函數寫入顯存則比一般情況下快將近三倍。然而,使用memcpy()和memset()函數的話,速度將會快上10倍,並且繪製背景圖像的命令map()的速度也是一樣快。
像素方塊的樂趣
Pico的許多功能都會讓人聯想起1980年代的家用電腦,但它卻沒有止步於對傳統或技術的復原,而更加強調創作的樂趣和像素方塊風格的美術效果。那些對這一點感到疑惑的人們應當考慮到它畢竟是一款虛構的遊戲平台:虛擬世界並不總是完美無缺的,但它設定了許多有趣的事件,並能夠激發參與者的想像力。
如果我們用一個詞來總結Pico-8的精神的話,我想應該是「直截了當」。其中的一部分來自於8-bit電腦和運行在上面的BASIC語言:你可以在「開機」之後立刻編寫程序,而不需要考慮如何配置操作系統、API和運行環境。所有的事情都簡潔明了:內存里的某個比特總是會反饋到屏幕上某個位置的某個色塊上。
然而這一概念並不止於此,它沒有時鐘周期和柵格線,沒有顏色單元邊界,沒有折騰開發工具和文件的困擾。平台自身的限制避免了磨洋工式的細節調整。這得益於沒有可以調節的調色盤、採樣系統和機器語言指令,你不再需要對它們進行微調。而較少的像素數讓完美主義者們也不會花太多時間在處理抗鋸齒上。
對於那些對它感興趣了人們來說,Pico-8確實有一些技術挑戰和智力問題在等著它們。但我們也同樣不會認為Pico-8的世界裡需要極度關注細節。Pico程序寫起來很快也很容易,熟悉這一平台基礎只是的開發者可以在一晚上就寫出一款相對精美的遊戲。
當我寫作這篇文章時,Pico仍然處於Alpha測試版本,至少在開發環境中這種不完善還是很容易被發覺的。代碼編輯器不能自動跳到有錯誤的行,而繪製像素的時候鍵盤也不能使用。這些軟體並不能很好的幫助用戶進行開發,相反用戶需要閱讀零散的文檔才能知道可以用ESC鍵打開編輯器這樣簡單的功能。地圖編輯器也讓人有點摸不著頭腦,因為它沒有任何地方標明地圖裡的零號精靈永遠都是空白的。
但瑕不掩瑜,我還是推薦大家嘗試Pico,即使新手程序員也是如此——至少是其中那些喜歡8-bit像素方塊美術風格同時也不怕閱讀文字說明的人。Lua語言沒有明顯的缺點,而Pico簡化的介面鼓勵開發者自行解決問題而不是尋找現成的方案。對於更有經驗的開發者而言,Pico提供了一種輕鬆愉快的消遣方式,而其結果則比簡單的塗鴉和水彩畫豐富的多。
社區和創意
Pico-8在開發之時就曾經參與眾籌,並在發布之前就聚集了一大批熱心粉絲。在我寫下這篇文章之時,開發者論壇和Lexaloffle Games為Pico準備了超過250張卡帶,包括遊戲和各種軟體。這其中大部分是平台遊戲和各類傳統2D動作遊戲,但其中偶爾也夾雜著更加試驗性的作品。在Pico平台上甚至可以找到一些Demoscene作品。
線上論壇從一開始就是Pico社區開發和發行的中心,這些論壇中有著溫和和充滿鼓勵的氣氛。社區中的成員以友好和互助的姿態歡迎初學者的加入。Pico開發團隊的成員也經常參與討論,這也讓論壇成為討論Pico技術細節的最佳去處。
Pico-8同樣有著自己的發燒友雜誌《Pico-8 Fanzine》,它收到了包括Lexaloffle的主力開發者「zep」在內的許多投稿。獨立平台冒險遊戲VVVVV的開發者Terry Cavanagh則是其中最有名的作者之一。發燒友雜誌的作者和讀者都是該平台的愛好者,截止到寫作這篇文章的時候,這份發燒友雜誌已經發行了三期。這份雜誌和其他雜誌類似,也包含了編寫遊戲的指導、採訪、遊戲測評、不同類型的Pico-8編程文章,當然還有愛好者們創作的美術作品。
行文至此,我想許多讀者們會非常確定的認為這款充滿熱血而開放的開發者文化的軟體玩具一定是免費甚至開源的。但情況卻並非如此,Pico-8是一款商業產品,目前正以$20的標價提供下載。二進位文件可以在三種重要的x86操作系統上運行:Windows,Mac OS和Linux。許多人都希望能推出一款基於硬體的Pico-8遊戲機,但到目前為止,Pico-8仍然只能提供二進位格式的軟體運行環境。
當然Pico是一款簡單的平台,對其進行逆向工程未必很困難,並且Lua解釋器本身已經是開源的。不過這一項目正被「友善光環」所圍繞,因此沒有多少黑客敢於開發免費和開源的Pico變種。相比之下我們更期待Lexaloffle自己會在客戶們逐漸喪失興趣的時候會將Pico開源。當社區衰退,開發也不再活躍之時,Pico可能會成為遊戲開發的一個有趣的小眾選項,乃至進入教育市場。
虛構平台的未來
像Pico-8這樣的虛構遊戲機是一種相對比較新的現象,雖然早在1970年代的微電腦愛好者中就已經存在Chip-8這樣的虛擬機,並在某種程度上可以視為是它的前身,而許多教育軟體也會使用簡化的機器架構,而Pico的一個與眾不同之處,就是它是「以創意作為第一考量」的。也因此它真正的前身可能只有Lexaloffle更早的Voxatron虛構遊戲機。
在未來,很可能有相比Pico更小也更易於掌握的虛構平台出現,但其出現的原因卻並不一定是要與Pico競爭或是比較——而很可能僅僅是出於好奇心。
Pico的功能鼓勵人們在其上開發有趣可愛而又懷舊的作品,但選擇不同的功能組合則可能創造出截然不同的精神世界和美術風格。比如說,如果人們開發出一款強調陰鬱厚重風格的平台作為Pico的「邪惡雙胞胎」就是一個頗為有趣的想法。當然,類似的現象在電腦平台發展史上時有發生,但創造虛構平台的亞文化可能會為研究這種現象提供某種有趣的試驗環境。
無論未來的前景如何,Pico-8仍然是一個有趣的開發環境,相比那些經典的電腦和遊戲機平台,它提供了一種更為輕鬆的選項。它將充滿啟發性的8-bit平台的種種限制和簡單易用的現代設計理念結合起來,即使是那些對編程最不感冒的人群,也可能會被大顆像素的風格吸引,並從中找到諸多的樂趣。
芬蘭語版本:Pico-8 – Fantasiakonsolin pauloissa 文字作者:Visa-Valtteri Pimi?, Ville-Matias Heikkil?
圖片作者:Laura Pesola, Ville-Matias Heikkil?
Pico-8官網:http://www.pico-8.com/
Pico-8遊戲下載
Duangle 2015 Intro
Dusk Child
Celeste
Ennuigi
Hybris
Hyperspace 1.1.1
Lemmtris
PICORACER-2048
Star Beast
推薦閱讀:
※技術美術的核心競爭力是什麼?
※大家對遊戲開發都存在哪些認知誤區?
※從事遊戲開發,需要什麼技能?
※steam上的3A大作過節時打折那麼狠,遊戲製作人們真的有得賺嗎?