掌上游戲機開發指南GBA探索日記(10)(轉)

post0發表於2007-08-12
掌上游戲機開發指南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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章