隨著微控制器性能增強(qiáng),已經(jīng)有可能用它們執(zhí)行一些在90年代還需要PC處理能力的程序,而游戲領(lǐng)域的應(yīng)用受這一進(jìn)展影響很大,F(xiàn)在可以在某種移動(dòng)應(yīng)用(包含圖形LCD和一個(gè)32位ARM微控制器)中實(shí)現(xiàn)第一個(gè)PC上的3D游戲。本文將闡述如何將一個(gè)開源PC游戲的代碼移植到一款有適當(dāng)源文件結(jié)構(gòu)的微控制器上。在上世紀(jì)90年代,游戲開始在計(jì)算機(jī)世界中蔓延。我還記得第一次玩Wolfenstein3D,那是第一款3D的PC射擊游戲。它由IdSoftware于1992年開發(fā),是
隨著微控制器性能增強(qiáng),已經(jīng)有可能用它們執(zhí)行一些在90年代還需要PC處理能力的程序,而游戲領(lǐng)域的應(yīng)用受這一進(jìn)展影響很大,F(xiàn)在可以在某種移動(dòng)應(yīng)用(包含圖形
LCD和一個(gè)32位 ARM微控制器)中實(shí)現(xiàn)第一個(gè)PC上的3D游戲。本文將闡述如何將一個(gè)開源PC游戲的代碼移植到一款有適當(dāng)源文件結(jié)構(gòu)的微控制器上。
在上世紀(jì)90年代,游戲開始在計(jì)算機(jī)世界中蔓延。我還記得第一次玩Wolfenstein 3D,那是第一款3D的PC射擊游戲。它由IdSoftware于1992年開發(fā),是Doom的前身。Wolfenstein 3D證明PC的圖形能力已足以滿足這種類型3D動(dòng)畫的開發(fā)。90年代很多十幾歲的年青人都會(huì)記得Wolfenstein 3D,因?yàn)檫@是第一款把3D世界帶到他們PC上的游戲。90年代中期它的源碼在互聯(lián)網(wǎng)上公開,現(xiàn)在還能找到,F(xiàn)在我想再玩這款游戲,但不是在我的PC上。我將利用一只微控制器的
功率和集成度。
這里需要補(bǔ)充一句:本文并不打算分析Wolfenstein 3D的源碼。很多文章已經(jīng)做過(guò)這件事了。本文的目標(biāo)是說(shuō)明將復(fù)雜代碼移植到新平臺(tái)上的方法。不過(guò),這款游戲的結(jié)構(gòu)做得很好,解釋一下還是很有意思的。事實(shí)上在1992年,Wolfenstein 3D在3D游戲領(lǐng)域是一場(chǎng)革命。它是第一款玩家能在3D場(chǎng)景中自由移動(dòng)的游戲。
在此游戲中,圖像與源碼同等重要,因?yàn)樗捎昧舜罅抠N圖和子畫面。這些都采用光線投射(
RayCasting)方法定位在屏幕上,從而給游戲以一種3D效果。光線投射包含了從一個(gè)POV(視點(diǎn))的投射半徑。并采用了一
系列技巧以實(shí)現(xiàn)加速。例如,為了在像素點(diǎn)屏幕上投射一個(gè)半徑,要做一個(gè)空間搜索,以找到該半徑與最近墻上的交匯點(diǎn)。在Wolfenstein 3D中,墻面和貼圖的尺寸都是64 x 64像素(見(jiàn)圖3)。
雖然該游戲在當(dāng)時(shí)取得了無(wú)比的成功,但它也有一些局限。其中之一是墻的高度全都一樣,它們?nèi)?0°,沒(méi)有斜角。這些限制減輕了移植的難度,因?yàn)樗鼈兇碇创a不太復(fù)雜。另一個(gè)限制是地面和天花板沒(méi)有貼圖。
我會(huì)嘗試在一只較新的32位微控制器上給這款游戲以新的生命。一個(gè)必需的部件是建立一個(gè)控制游戲的應(yīng)用電路板。從用戶角度只有兩個(gè)東西是可見(jiàn)的,一個(gè)
240x 320
TFT彩色屏幕,以及一組讓玩家在Wolfenstein 3D迷宮中穿越的按鍵。另外,微控制器用于屏幕和按鍵管理。由于這種類型屏幕采用一種并行接口(
16位寬),需要選擇一種能夠驅(qū)動(dòng)這種屏幕的微控制器。
如何更順利地移植源碼?
Wolfenstein 3D的源碼相當(dāng)復(fù)雜。源碼越復(fù)雜,控制它就越難。因此,將這個(gè)應(yīng)用移植到一個(gè)新的目標(biāo)上非常困難。在開始以前,重要的是了解用于編寫原應(yīng)用的語(yǔ)言是否為可移植的,而且該語(yǔ)言的的編譯器是否能用于新的目標(biāo)。Wolfenstein 3D采用C語(yǔ)言編寫。C語(yǔ)言有利于移植,因?yàn)樗谖⒖刂破黝I(lǐng)域廣泛可用,市場(chǎng)上現(xiàn)有很多編譯器與調(diào)試器。
C語(yǔ)言允許一個(gè)源碼對(duì)多個(gè)目標(biāo),前提是它采用一種邏輯和清楚的方式編寫。項(xiàng)目源文件的組織是一個(gè)考慮因素。圖4提出了一種方法。
圖示的軟件方法將原始源碼與應(yīng)用板使用的物理層分隔開來(lái)。移植過(guò)程中,原始游戲的源碼必須作少許修改,用到硬件的函數(shù)必須轉(zhuǎn)移(并修改)到“可移植”段。
當(dāng)你準(zhǔn)備將一個(gè)程序移植到一個(gè)新的目標(biāo)時(shí),主要問(wèn)題是“哪種新目標(biāo)機(jī)能夠執(zhí)行這個(gè)程序?”要理解這個(gè)需求,就需要知道源碼的主要功能,如外設(shè)的類型和數(shù)量,以及
內(nèi)存的大。╓olfenstein 3D需要至少500KB程序空間和96KB RAM空間)。