重生1990做游戲
陳默的“工作室”,是周大雷家電腦房里一張堆滿可樂瓶和煙灰缸的舊桌子。
286電腦的風(fēng)扇發(fā)出拖拉機(jī)般的轟鳴,屏幕上,DOS的命令行光標(biāo)一閃一閃,像一只不耐煩的眼睛。
“默哥,你真不用我?guī)兔???br>
周大雷把一罐冰汽水放在桌上,玻璃罐外凝結(jié)的水珠,很快在布滿劃痕的桌面上洇開一片深色。
“你幫我守著點(diǎn),別讓張老師突然‘微服私訪’就行?!?br>
陳默頭也不抬,手指在咯吱作響的機(jī)械鍵盤上飛舞。
他正在用Tur*o C++寫一個(gè)圖形驅(qū)動(dòng)。
1990年的電腦,顯存寶貴,他必須用最精簡(jiǎn)的代碼,首接操作顯卡的寄存器,才能在640x480的分辨率下,勉強(qiáng)擠出16色的畫面。
這活兒在前世,有現(xiàn)成的DirectX或OpenGL庫,點(diǎn)幾下鼠標(biāo)就能完成。
而現(xiàn)在,他感覺自己像個(gè)石器時(shí)代的工匠,正用指甲在巖石上雕刻花紋。
“陳默,”林小雨的聲音從旁邊傳來,她手里拿著一本翻得卷邊的《C程序設(shè)計(jì)》,眉頭微蹙,“你這里的指針操作……會(huì)不會(huì)太復(fù)雜了?
我怕容易出錯(cuò)。”
陳默看了一眼,笑了。
屏幕上是一段用于精靈(Sprite)動(dòng)畫幀切換的代碼,為了節(jié)省內(nèi)存,他用了一個(gè)嵌套的指針數(shù)組,指向不同動(dòng)作(行走、跳躍、攻擊)的幀數(shù)據(jù)。
“小雨,你看,”他指著屏幕,“如果用結(jié)構(gòu)體,每個(gè)精靈都要占用幾十個(gè)字節(jié)的冗余空間。
但用指針,我們只需要存儲(chǔ)‘地址’,就像……就像圖書館的索引卡,告訴程序去哪里找真正的‘書’(圖像數(shù)據(jù))?!?br>
林小雨的眼睛亮了起來。
她不是死記硬背的學(xué)霸,她喜歡這種邏輯的美感。
她湊得更近了些,發(fā)梢?guī)缀鯍叩疥惸氖直常骸八?,你把所有的圖像數(shù)據(jù)都?jí)嚎s成位圖,然后用指針來快速切換?”
“對(duì)!”
陳默有些興奮,“這樣一來,我們一個(gè)‘怪物’精靈,內(nèi)存占用還不到200字節(jié)。
整個(gè)關(guān)卡的地圖數(shù)據(jù),也能控制在30K以內(nèi)?!?br>
“我的天……”周大雷聽得一頭霧水,但不妨礙他吹捧,“默哥,你這腦子是CPU做的吧?”
陳默沒時(shí)間得意。
一個(gè)更頭疼的問題擺在面前——聲音。
1990年的PC喇叭,只能發(fā)出單調(diào)的“嗶嗶”聲。
而他腦海中的《山海行》,主角“羿”射出神箭時(shí),應(yīng)該有弓弦震顫的嗡鳴;踩死“九頭蟲”小怪時(shí),應(yīng)該有滑稽的“噗嘰”聲。
“沒有聲卡,沒有DAC……”陳默喃喃自語,“怎么辦?”
系統(tǒng)提示:檢測(cè)到宿主遇到技術(shù)瓶頸,是否消耗10點(diǎn)‘靈感值’,解鎖‘PC Speaker音效合成方案’?
陳默心中一動(dòng)。
靈感值是系統(tǒng)的新設(shè)定,通過解決技術(shù)難題、獲得他人認(rèn)可或完成階段性目標(biāo)來積累。
他目前只有可憐的20點(diǎn)。
“兌換!”
瞬間,一段復(fù)雜的算法涌入腦海——通過精確控制PC喇叭的發(fā)聲頻率和時(shí)長(zhǎng),模擬出不同音色的方波。
雖然音質(zhì)像破鑼,但足以表達(dá)簡(jiǎn)單的音效!
陳默立刻動(dòng)手。
他寫了一個(gè)音效驅(qū)動(dòng),用查表法(Lookup Ta*le)存儲(chǔ)不同音符的頻率值。
當(dāng)他第一次讓電腦發(fā)出一聲清脆的“?!睍r(shí),林小雨驚喜地叫了出來,周大雷則把嘴里叼著的冰棍掉在了地上。
有了基礎(chǔ)框架,真正的創(chuàng)作開始了。
陳默沒有首接復(fù)刻《超級(jí)瑪麗》。
系統(tǒng)提供的藍(lán)圖是“簡(jiǎn)化版”,目的是讓他熟悉開發(fā)流程。
他要做的是,把中國(guó)神話的魂,塞進(jìn)這個(gè)經(jīng)典的“平臺(tái)跳躍”骨架里。
“關(guān)卡設(shè)計(jì),不能是簡(jiǎn)單的水管和磚塊?!?br>
陳默在一張草稿紙上畫著,“我們要有‘昆侖墟’的云梯,‘歸墟’的海眼,‘大荒’的青銅神樹?!?br>
林小雨負(fù)責(zé)美術(shù)資源。
她沒有專業(yè)的繪圖軟件,只能用最原始的“畫圖”程序,一個(gè)像素一個(gè)像素地描。
她畫的主角“羿”,是個(gè)扎著沖天辮、穿著獸皮裙的小孩,手里拿著一把木弓。
雖然簡(jiǎn)陋,但眼神靈動(dòng),充滿了倔強(qiáng)。
“這個(gè)‘九頭蟲’怪物,”周大雷指著設(shè)計(jì)稿,口水橫飛,“一定要設(shè)計(jì)成踩上去會(huì)‘噗嘰’一聲,爆成一灘綠漿的!
最好再加點(diǎn)音效,像放屁一樣!”
“……”陳默和林小雨同時(shí)沉默了。
“大雷,”陳默拍了拍他的肩膀,“你的審美,就和你這電腦房的衛(wèi)生一樣,需要提升?!?br>
不過,周大雷的“惡趣味”倒是提醒了陳默。
游戲需要“反饋”,需要讓玩家感受到“操作”的樂趣。
他給“羿”的跳躍加了“壓幀”——起跳時(shí)角色會(huì)先微微下蹲,落地時(shí)會(huì)有塵土飛揚(yáng)的粒子效果(其實(shí)就是幾個(gè)隨機(jī)飄落的點(diǎn))。
雖然簡(jiǎn)單,卻讓角色的動(dòng)作充滿了“重量感”。
技術(shù)難題接踵而至。
為了實(shí)現(xiàn)“云梯”的滾動(dòng)效果,陳默必須自己寫一個(gè)“卷軸”(Scrolling)算法。
他采用了一種“分塊”(Tile-*ased)的思路,把地圖切成一個(gè)個(gè)16x16的小方塊,只渲染屏幕范圍內(nèi)的方塊,從而節(jié)省寶貴的CPU資源。
當(dāng)“羿”移動(dòng)時(shí),他通過巧妙地移動(dòng)顯存中的“顯示窗口”,制造出**滾動(dòng)的假象。
“這就像……”林小雨看著代碼,若有所思,“就像我們看皮影戲,幕布后面只動(dòng)一小塊,觀眾卻覺得整個(gè)世界都在動(dòng)?!?br>
“沒錯(cuò)!”
陳默贊許地看著她,“小雨,你天生就是做游戲的料?!?br>
林小雨的臉一下子紅了,她低下頭,假裝專心涂改她的像素畫。
最驚險(xiǎn)的一次,是游戲即將完成時(shí),一個(gè)隱藏的“內(nèi)存泄漏”(Memory Leak)導(dǎo)致程序運(yùn)行半小時(shí)后就會(huì)崩潰。
陳默花了整整兩天,用最原始的“打印調(diào)試法”(在代碼里**printf,輸出變量值),才定位到問題——一個(gè)用于管理怪物鏈表的指針,在刪除節(jié)點(diǎn)時(shí)沒有正確釋放內(nèi)存。
“在沒有垃圾回收機(jī)制的時(shí)**代碼,就像在雷區(qū)里跳舞。”
陳默長(zhǎng)舒一口氣,修好*ug后,他靠在吱呀作響的椅子上,自嘲道。
游戲,是千萬人共同的夢(mèng)一個(gè)月的期限到了。
陳默的《山海行》Demo,只有三個(gè)關(guān)卡,一個(gè)主角,三種怪物(九頭蟲、火鴉、土傀儡),沒有劇情文本,沒有**音樂(PC喇叭實(shí)在搞不定復(fù)雜的旋律)。
但它有一個(gè)完整的內(nèi)核:跳躍、射擊、收集“息壤”(一種發(fā)光的**方塊),以及一個(gè)充滿東方奇幻色彩的世界觀雛形。
他忐忑不安地把軟盤交給王芳老師。
辦公室里,王芳、**國(guó),還有教導(dǎo)主任,都圍了過來。
王芳把軟盤塞進(jìn)學(xué)校機(jī)房那臺(tái)最好的386電腦,屏幕上,出現(xiàn)了林小雨畫的、歪歪扭扭的標(biāo)題——《山海行》。
“這是……陳默你做的?”
**國(guó)的聲音有些顫抖。
他看到那個(gè)叫“羿”的小人,在云梯上靈活地跳躍,用木弓射下空中的火鴉,動(dòng)作流暢得讓他想起了每天在操場(chǎng)上打籃球的學(xué)生。
王芳看著陳默設(shè)計(jì)的“土傀儡”——一種會(huì)從地里鉆出來、行動(dòng)遲緩的石頭怪。
當(dāng)“羿”從它頭頂跳過時(shí),土傀儡會(huì)發(fā)出一聲沮喪的“嗚嗚”聲(陳默用PC喇叭模擬的低頻音),然后縮回地里。
她忍不住“撲哧”一聲笑了出來。
“這……這還挺有意思的?!?br>
教導(dǎo)主任摸著下巴,“比那個(gè)……小霸王上的游戲,好像也不差?”
陳默的心提到了嗓子眼。
王芳沒有說話,她拿起筆,在陳默的月考成績(jī)單上,寫下了“準(zhǔn)予留級(jí)觀察”的批語。
然后,她把成績(jī)單遞給陳默,語氣依舊嚴(yán)肅,卻少了幾分冰冷:“游戲可以做,但學(xué)習(xí)不能落下。
下次月考,你的數(shù)學(xué)要是再低于110分,我就把你電腦房的鑰匙沒收了?!?br>
“謝謝老師!”
陳默如蒙大赦。
走出辦公室,周大雷一蹦三尺高:“默哥!
我就知道你能行!
冰棍!
一個(gè)月的冰棍!”
林小雨沒有說話,只是看著陳默,眼睛里閃爍著比窗外陽光更耀眼的光芒。
那天晚上,陳默沒有回電腦房。
他站在天臺(tái)上,看著1990年城市稀疏的燈火。
口袋里的手機(jī)(一臺(tái)從二手市場(chǎng)淘來的、只能打電話的“板磚”)震動(dòng)了一下,是林小雨發(fā)來的短信:“陳默,我們的游戲,明天就能在大雷的電腦房上線了。
你說,會(huì)有人喜歡嗎?”
陳默笑了笑,回復(fù)道:“會(huì)的。
因?yàn)檫@是我們共同的夢(mèng)?!?br>
他知道,這個(gè)夢(mèng),才剛剛開始。
在640K內(nèi)存的限制里,在PC喇叭單調(diào)的嗶嗶聲中,在老師和家長(zhǎng)的質(zhì)疑聲下,他用一行行代碼,鑿開了一道通往未來的門。
門后,是一個(gè)他熟悉又陌生的世界。
在那里,游戲不再是“玩物喪志”的代名詞,而是一種全新的語言,一種連接人心的橋梁,一種可以承載文明與夢(mèng)想的容器。
而他,陳默,就是那個(gè)最初的造夢(mèng)者。
286電腦的風(fēng)扇發(fā)出拖拉機(jī)般的轟鳴,屏幕上,DOS的命令行光標(biāo)一閃一閃,像一只不耐煩的眼睛。
“默哥,你真不用我?guī)兔???br>
周大雷把一罐冰汽水放在桌上,玻璃罐外凝結(jié)的水珠,很快在布滿劃痕的桌面上洇開一片深色。
“你幫我守著點(diǎn),別讓張老師突然‘微服私訪’就行?!?br>
陳默頭也不抬,手指在咯吱作響的機(jī)械鍵盤上飛舞。
他正在用Tur*o C++寫一個(gè)圖形驅(qū)動(dòng)。
1990年的電腦,顯存寶貴,他必須用最精簡(jiǎn)的代碼,首接操作顯卡的寄存器,才能在640x480的分辨率下,勉強(qiáng)擠出16色的畫面。
這活兒在前世,有現(xiàn)成的DirectX或OpenGL庫,點(diǎn)幾下鼠標(biāo)就能完成。
而現(xiàn)在,他感覺自己像個(gè)石器時(shí)代的工匠,正用指甲在巖石上雕刻花紋。
“陳默,”林小雨的聲音從旁邊傳來,她手里拿著一本翻得卷邊的《C程序設(shè)計(jì)》,眉頭微蹙,“你這里的指針操作……會(huì)不會(huì)太復(fù)雜了?
我怕容易出錯(cuò)。”
陳默看了一眼,笑了。
屏幕上是一段用于精靈(Sprite)動(dòng)畫幀切換的代碼,為了節(jié)省內(nèi)存,他用了一個(gè)嵌套的指針數(shù)組,指向不同動(dòng)作(行走、跳躍、攻擊)的幀數(shù)據(jù)。
“小雨,你看,”他指著屏幕,“如果用結(jié)構(gòu)體,每個(gè)精靈都要占用幾十個(gè)字節(jié)的冗余空間。
但用指針,我們只需要存儲(chǔ)‘地址’,就像……就像圖書館的索引卡,告訴程序去哪里找真正的‘書’(圖像數(shù)據(jù))?!?br>
林小雨的眼睛亮了起來。
她不是死記硬背的學(xué)霸,她喜歡這種邏輯的美感。
她湊得更近了些,發(fā)梢?guī)缀鯍叩疥惸氖直常骸八?,你把所有的圖像數(shù)據(jù)都?jí)嚎s成位圖,然后用指針來快速切換?”
“對(duì)!”
陳默有些興奮,“這樣一來,我們一個(gè)‘怪物’精靈,內(nèi)存占用還不到200字節(jié)。
整個(gè)關(guān)卡的地圖數(shù)據(jù),也能控制在30K以內(nèi)?!?br>
“我的天……”周大雷聽得一頭霧水,但不妨礙他吹捧,“默哥,你這腦子是CPU做的吧?”
陳默沒時(shí)間得意。
一個(gè)更頭疼的問題擺在面前——聲音。
1990年的PC喇叭,只能發(fā)出單調(diào)的“嗶嗶”聲。
而他腦海中的《山海行》,主角“羿”射出神箭時(shí),應(yīng)該有弓弦震顫的嗡鳴;踩死“九頭蟲”小怪時(shí),應(yīng)該有滑稽的“噗嘰”聲。
“沒有聲卡,沒有DAC……”陳默喃喃自語,“怎么辦?”
系統(tǒng)提示:檢測(cè)到宿主遇到技術(shù)瓶頸,是否消耗10點(diǎn)‘靈感值’,解鎖‘PC Speaker音效合成方案’?
陳默心中一動(dòng)。
靈感值是系統(tǒng)的新設(shè)定,通過解決技術(shù)難題、獲得他人認(rèn)可或完成階段性目標(biāo)來積累。
他目前只有可憐的20點(diǎn)。
“兌換!”
瞬間,一段復(fù)雜的算法涌入腦海——通過精確控制PC喇叭的發(fā)聲頻率和時(shí)長(zhǎng),模擬出不同音色的方波。
雖然音質(zhì)像破鑼,但足以表達(dá)簡(jiǎn)單的音效!
陳默立刻動(dòng)手。
他寫了一個(gè)音效驅(qū)動(dòng),用查表法(Lookup Ta*le)存儲(chǔ)不同音符的頻率值。
當(dāng)他第一次讓電腦發(fā)出一聲清脆的“?!睍r(shí),林小雨驚喜地叫了出來,周大雷則把嘴里叼著的冰棍掉在了地上。
有了基礎(chǔ)框架,真正的創(chuàng)作開始了。
陳默沒有首接復(fù)刻《超級(jí)瑪麗》。
系統(tǒng)提供的藍(lán)圖是“簡(jiǎn)化版”,目的是讓他熟悉開發(fā)流程。
他要做的是,把中國(guó)神話的魂,塞進(jìn)這個(gè)經(jīng)典的“平臺(tái)跳躍”骨架里。
“關(guān)卡設(shè)計(jì),不能是簡(jiǎn)單的水管和磚塊?!?br>
陳默在一張草稿紙上畫著,“我們要有‘昆侖墟’的云梯,‘歸墟’的海眼,‘大荒’的青銅神樹?!?br>
林小雨負(fù)責(zé)美術(shù)資源。
她沒有專業(yè)的繪圖軟件,只能用最原始的“畫圖”程序,一個(gè)像素一個(gè)像素地描。
她畫的主角“羿”,是個(gè)扎著沖天辮、穿著獸皮裙的小孩,手里拿著一把木弓。
雖然簡(jiǎn)陋,但眼神靈動(dòng),充滿了倔強(qiáng)。
“這個(gè)‘九頭蟲’怪物,”周大雷指著設(shè)計(jì)稿,口水橫飛,“一定要設(shè)計(jì)成踩上去會(huì)‘噗嘰’一聲,爆成一灘綠漿的!
最好再加點(diǎn)音效,像放屁一樣!”
“……”陳默和林小雨同時(shí)沉默了。
“大雷,”陳默拍了拍他的肩膀,“你的審美,就和你這電腦房的衛(wèi)生一樣,需要提升?!?br>
不過,周大雷的“惡趣味”倒是提醒了陳默。
游戲需要“反饋”,需要讓玩家感受到“操作”的樂趣。
他給“羿”的跳躍加了“壓幀”——起跳時(shí)角色會(huì)先微微下蹲,落地時(shí)會(huì)有塵土飛揚(yáng)的粒子效果(其實(shí)就是幾個(gè)隨機(jī)飄落的點(diǎn))。
雖然簡(jiǎn)單,卻讓角色的動(dòng)作充滿了“重量感”。
技術(shù)難題接踵而至。
為了實(shí)現(xiàn)“云梯”的滾動(dòng)效果,陳默必須自己寫一個(gè)“卷軸”(Scrolling)算法。
他采用了一種“分塊”(Tile-*ased)的思路,把地圖切成一個(gè)個(gè)16x16的小方塊,只渲染屏幕范圍內(nèi)的方塊,從而節(jié)省寶貴的CPU資源。
當(dāng)“羿”移動(dòng)時(shí),他通過巧妙地移動(dòng)顯存中的“顯示窗口”,制造出**滾動(dòng)的假象。
“這就像……”林小雨看著代碼,若有所思,“就像我們看皮影戲,幕布后面只動(dòng)一小塊,觀眾卻覺得整個(gè)世界都在動(dòng)?!?br>
“沒錯(cuò)!”
陳默贊許地看著她,“小雨,你天生就是做游戲的料?!?br>
林小雨的臉一下子紅了,她低下頭,假裝專心涂改她的像素畫。
最驚險(xiǎn)的一次,是游戲即將完成時(shí),一個(gè)隱藏的“內(nèi)存泄漏”(Memory Leak)導(dǎo)致程序運(yùn)行半小時(shí)后就會(huì)崩潰。
陳默花了整整兩天,用最原始的“打印調(diào)試法”(在代碼里**printf,輸出變量值),才定位到問題——一個(gè)用于管理怪物鏈表的指針,在刪除節(jié)點(diǎn)時(shí)沒有正確釋放內(nèi)存。
“在沒有垃圾回收機(jī)制的時(shí)**代碼,就像在雷區(qū)里跳舞。”
陳默長(zhǎng)舒一口氣,修好*ug后,他靠在吱呀作響的椅子上,自嘲道。
游戲,是千萬人共同的夢(mèng)一個(gè)月的期限到了。
陳默的《山海行》Demo,只有三個(gè)關(guān)卡,一個(gè)主角,三種怪物(九頭蟲、火鴉、土傀儡),沒有劇情文本,沒有**音樂(PC喇叭實(shí)在搞不定復(fù)雜的旋律)。
但它有一個(gè)完整的內(nèi)核:跳躍、射擊、收集“息壤”(一種發(fā)光的**方塊),以及一個(gè)充滿東方奇幻色彩的世界觀雛形。
他忐忑不安地把軟盤交給王芳老師。
辦公室里,王芳、**國(guó),還有教導(dǎo)主任,都圍了過來。
王芳把軟盤塞進(jìn)學(xué)校機(jī)房那臺(tái)最好的386電腦,屏幕上,出現(xiàn)了林小雨畫的、歪歪扭扭的標(biāo)題——《山海行》。
“這是……陳默你做的?”
**國(guó)的聲音有些顫抖。
他看到那個(gè)叫“羿”的小人,在云梯上靈活地跳躍,用木弓射下空中的火鴉,動(dòng)作流暢得讓他想起了每天在操場(chǎng)上打籃球的學(xué)生。
王芳看著陳默設(shè)計(jì)的“土傀儡”——一種會(huì)從地里鉆出來、行動(dòng)遲緩的石頭怪。
當(dāng)“羿”從它頭頂跳過時(shí),土傀儡會(huì)發(fā)出一聲沮喪的“嗚嗚”聲(陳默用PC喇叭模擬的低頻音),然后縮回地里。
她忍不住“撲哧”一聲笑了出來。
“這……這還挺有意思的?!?br>
教導(dǎo)主任摸著下巴,“比那個(gè)……小霸王上的游戲,好像也不差?”
陳默的心提到了嗓子眼。
王芳沒有說話,她拿起筆,在陳默的月考成績(jī)單上,寫下了“準(zhǔn)予留級(jí)觀察”的批語。
然后,她把成績(jī)單遞給陳默,語氣依舊嚴(yán)肅,卻少了幾分冰冷:“游戲可以做,但學(xué)習(xí)不能落下。
下次月考,你的數(shù)學(xué)要是再低于110分,我就把你電腦房的鑰匙沒收了?!?br>
“謝謝老師!”
陳默如蒙大赦。
走出辦公室,周大雷一蹦三尺高:“默哥!
我就知道你能行!
冰棍!
一個(gè)月的冰棍!”
林小雨沒有說話,只是看著陳默,眼睛里閃爍著比窗外陽光更耀眼的光芒。
那天晚上,陳默沒有回電腦房。
他站在天臺(tái)上,看著1990年城市稀疏的燈火。
口袋里的手機(jī)(一臺(tái)從二手市場(chǎng)淘來的、只能打電話的“板磚”)震動(dòng)了一下,是林小雨發(fā)來的短信:“陳默,我們的游戲,明天就能在大雷的電腦房上線了。
你說,會(huì)有人喜歡嗎?”
陳默笑了笑,回復(fù)道:“會(huì)的。
因?yàn)檫@是我們共同的夢(mèng)?!?br>
他知道,這個(gè)夢(mèng),才剛剛開始。
在640K內(nèi)存的限制里,在PC喇叭單調(diào)的嗶嗶聲中,在老師和家長(zhǎng)的質(zhì)疑聲下,他用一行行代碼,鑿開了一道通往未來的門。
門后,是一個(gè)他熟悉又陌生的世界。
在那里,游戲不再是“玩物喪志”的代名詞,而是一種全新的語言,一種連接人心的橋梁,一種可以承載文明與夢(mèng)想的容器。
而他,陳默,就是那個(gè)最初的造夢(mèng)者。