掌上游戲機開發指南GBA探索日記(10)(轉)
掌上游戲機開發指南GBA探索日記(10)(轉)[@more@] 研究GBA已經有半年了,GBA上能做的東西我都研究過。什麼BG,OBJ,OAM,SOUND,Interrupt都搞得很透,應該說我對GBA的認識比對PC的認識還深。現在打算真正做個像樣的GBA遊戲了。還好,我的朋友中有能搞美工的,所以拉來他,一起幹。可是似乎溝通有點問題,我叫他做的圖片老是不成功,改了又改,已經重新做了三次了,但是還需要再重新做。不過他倒是有點耐心。但是我已經等不及了,所以馬上喊出睡在我下鋪的同學,叫他用最笨的方式給我加工人物圖片。還好,人物的圖片基本上已經做好了一部分,加程式序裡測試,效果還不錯,挺逼真的。有關人物動畫的程式就這樣基本沒有問題。 下面卻遇到一個大難題。就是需要把一張超大的地圖裝載到一個BG中去。這個圖片一共有上萬的Characters,而GBA的Text BG最大也只能支援1024個。似乎不太可能。我想到把圖片縮小到1024x1024,然後裝進BG中,再透過BG來放大出來。不過很快我就打消了這個想法。首先即使我把圖片縮小到1024x1024,還是有好幾千的Characters,根本無法裝載。其次這樣做也會把圖片的解析度降低,圖片看起來就很不清晰了。 當天晚上我上QQ,我問azhong.這裡隨便再說一下,azhong搞GBA的技術很不錯的,而且還提供了我很多開發工具。azhong說有辦法解決我的問題,但是很難用語言說清楚,他就告訴我用動態的裝載方法來實現。然後寫了個小程式給我看看他把他電腦上的牆紙裝進GBA的BG的方法。可是這個程式裡面用了他的GsLib,所以具體實現的方法就無法得知了。但是我從它的執行效果猜出了它的原理。它的方法就是把好轉換的圖片全部轉換成沒有重複的Characters(就像OBJ的那樣)。然後自己用個for迴圈生成一個0,1,2,……,1024這樣的Map資料。 好了,有了思路,下面就開始幹了。首先是解除了自己長期以來的兩個誤解。一是原來一直以為Text BG只能使用16色的BG,但是實際情況它還是可以使用256色的,azhong給的我那個demo就是做在mode0下的text bg0下的256色的。二是原來一直以為一個BG最多隻能使用一個Characters Base(16KB),但實際情況並非如此。BGCNT屬性中的Characters Base只是說明BG的Characters資料的起始地址,但並沒有限制Characters的大小。如果可以,你甚至可以把4個Characters Base都用上(16 * 4 =64 KB),不過這樣就沒有地方裝map資料了。 azhong給我的那個bg2demo裡面就是使用3個Characters Base,BG是mode0下的bg0,大小是最小的256x256大。不過256x256的尺寸足以包括整個螢幕的240x160大小了。同時由於BG的Characters沒有重複,所以這樣一共就要使用256*256/64=1024.如果真的這樣做的話,那麼就需要佔用VRAM一共1024*64=64KB,那麼BG的Map資料就沒有地方放了。不過還好,我們連256x256的BG的Characters都不必全部裝進VRAM.我們需要的僅僅是恰好螢幕240x160大小的Characters.但是我們不可能恰好同時裁剪長和寬,所以我需要裝載的就是256x160大小的Characters.一共256x160/64=640個Characters. 顯然,這裡我們也只能使用Text Bg.因為Rotation BG最多隻能使用256,我們無論怎麼算,最少都要使用640個Characters,所以我們別無選擇,只能使用Text BG.好了。下面我來看看程式程式碼是怎麼做的。 看起來程式碼其實很簡單的 void LoadScreenTiles(u16 x,u16 y) { u16 i,j; u16 x_begin,y_begin; x_begin=x/8; y_begin=y/8; for(i=0;i<20;i++) DmaCopy(3,(void*)land_gfx+(i+y_begin)*303*64+x_begin*64,BG_VRAM+i*32*64,64*30,16); } 其中x,y是在裁剪原始大地圖中坐上角的座標.透過對x,y處理,我們就知道螢幕應該從哪裡開始裝載Tiles了. rect.x1=0; rect.y1=0; rect.x2=255; rect.y2=255; bg.number=0; bg.colorMode=BG_COLOR_256; bg.size=TEXTBG_SIZE_256x256; bg.mosaic=0; bg.charBaseBlock=0; bg.screenBaseBlock=28; bg.Palette_number=0; bg.x_scroll=0; bg.y_scroll=0; CreateMap(&bg,MAP_STYLE_DIFFER,&rect); screen_x=0; screen_y=0; LoadBackground256Palette(land_pal); LoadBackground(&bg); LoadScreenTiles(screen_x,screen_y); EnableBackground(&bg); UpdateBackground(&bg); 從上面的程式碼我們可以看出裝載BG的步驟.其中建立0,1,2,3,4,...,1024那樣的Map的函式CreateMap程式碼比較複雜,就不在這裡列出來了.或者用簡單的for迴圈就可以自己實現了. 最後提示一下建立全部不同的Characters的方法.在kaleid_1-2-3工具中轉換圖片的時候如果你不選擇Create Map,那麼生成的Characters就像OBJ的Characters那樣,全部都不同,這樣圖片中每個Tile都會相應生成一個Characters.也只有這樣的Characters能滿足我們那種0,1,2,3,..,1024的Map資料
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951690/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 掌上游戲機開發指南GBA探索日記(9)(轉)
- 開發日記10
- GBA開發C語言內功補習(轉)C語言
- Switch等掌上游戲機記憶體不夠用咋辦?宏旺半導體給你支招兒記憶體
- App Annie&IDC:預測掌上游戲機將流失更多的市場份額APP
- Forte for Java開發指南 (轉)Java
- ESMTP身份驗證機制探索手記 (轉)
- 開發日誌10
- 安卓APP開發日記1——名為Another的日記APP開發安卓APP
- 小辣椒開發日記
- 安卓開發日記57安卓
- 安卓開發日記56安卓
- 安卓開發日記55安卓
- 安卓開發日記26安卓
- 安卓開發日記25安卓
- 安卓開發日記24安卓
- 安卓開發日記28安卓
- 安卓開發日記27安卓
- 安卓開發日記4安卓
- 安卓開發日記13安卓
- 安卓開發日記14安卓
- 安卓開發日記12安卓
- 安卓開發日記17安卓
- 安卓開發日記16安卓
- 安卓開發日記15安卓
- 安卓開發日記19安卓
- 安卓開發日記18安卓
- 安卓開發日記46安卓
- 安卓開發日記45安卓
- 安卓開發日記47安卓
- 探索外包專案開發的管理(轉)
- 權威支援: WebSphere Application Server 日誌記錄開發人員指南WebAPPServer
- 掌趣電競系統開發技術分析,掌趣電競原始碼設計原始碼
- 5.13安卓開發日記34安卓
- 5.9安卓開發日記31安卓
- 在網站上游戲被財務清算稽核不給提該如何解決?網站
- 體驗有獎 | 1 分鐘 Serverless 部署掌上游戲機,“一行命令”找回小時候的樂趣!Server
- win10檢視開機日誌方法 win10怎麼檢視開機歷史記錄Win10