導航:首頁 > 編程語言 > gba游戲編程教程

gba游戲編程教程

發布時間:2024-10-18 02:13:42

A. 如何製作GBA游戲或HACK GBA

GBAS 是 GameBoy Advance development System (GameBoy Advance 開發系統)的縮寫,它主要的功能便是用來做 GameBoy Advance 游戲以及數據的傳輸,使用者可以自行將自己所撰寫的 GameBoy Advance 軟體透過 GBAS 燒錄機傳至 GBAS 64M 或 GBS 128M 的覆寫卡上面,然後插入 GameBoy Advance 的主機執行。就是說,如果你自己也會開發GBA的游戲的話(據說對於好的程序員不是很難),那麼你根本不需要任天堂的授權,就可以把自己開發的GBA游戲直接通過GBAS系統在GBA上遊玩。GBAS 燒錄機的功能除了負責將 GameBoy Advance 的軟體傳輸至覆寫卡外,他還具備可將原版 GameBoy Advance 卡帶備份至計算機儲存成 *.GBA 的計算機檔案,或者將原版 GameBoy A dvance 卡帶以及 GBAS 覆寫卡中的記憶存檔備份成 *.SAV 的計算機檔案。這些備份的檔案均可配合各種 GameBoy Advance 計算機模擬器執行。而這就意味著你可以利用這款系統自由把網路上的GBA游戲的ROM通過GBAS燒錄機直接拷貝到專用GBAS卡帶上,想想網路上已經可以執行的GBA游戲ROM的數量,是不是有些心動了?應該說GBAS是一個相當完善的系統,雖然這款系統剛剛開發完畢,但是它在功能上已經相當優秀了,那我們現在看看它有那些特點。一、EEPROM 特殊記憶支持: 這款GBAS是目前唯一支持 EEPROM 記憶格式的 GBA 開發工具,也是目前唯一可以對應 Super Mario Advance (日/美)的開發工具。哈哈,要知道超級MARIO大冒險的美版還沒有出啊,而在網 絡上,這個游戲的ROM早就有了,所以大家可以看到在圖片中執行的GBA游戲就是超級MARIO大冒險的美版。二、超大電池記憶: 超大 1M 電池記憶,支持所有游戲記憶(包括游戲王五代的超大電池記憶也能支持)。 這個特點是相當好的,也比較貼近玩家的特點,一般來說,用了這個東西,什麼游戲的記錄都不會出問題了,玩家完全沒有必要擔心、GBAS的記憶空間不足。三、合卡功能: GBAS 支持合卡,64M 版本可支持兩個 32M 的游戲合卡。這樣,玩家可以一次錄進兩個32M的游戲,使GBAS成為一個合卡,要是玩家擁有的是128M的覆寫卡,嘿嘿,那就可以讓你的GBAS成為4合1卡了,這樣就節約了游戲燒錄拷貝的時間,當然,128M的卡幾個自然要高得多了。四、 操作介面:全新窗口下燒錄介面(包含游戲上載,下載以及游戲記錄文件上載下載功能)全新修正了游戲傳輸問題,更快速更准確,支持窗口 9X 作業平台,安裝容易使用方便,使用者完全不用擔心會出什麼問題。GBA的軟體製作燒錄系統—GBAS簡單入門-一. GBA開發包--DevKitAdv 簡介DevKitAdv 主要包括兩部分,一是GCC++編譯器,二是 GBA庫.GCC++編譯器功能和我們常用的VC差不多,只不過少了個編輯源代碼的文本編輯器(至少我沒發現,我用的是EditPlus,UltraEdit也可以),還有就是--不支持類(class),真是讓人頭痛,只能用struct來替代.它的作用是把我們寫的代碼編譯成二進制的可執行文件,當然這個可執行文件是相對GBA和GBA模擬器而言的.就 Windows里的EXE文件無法在Mac機上使用是一樣的道理;GBA庫提供了圖像,控制及聲音一系列的函數,和GCC++配合使用.下載地址: http://occultforces.mine.nu/~darkfader/gba/files/devkitadv.zip二. DevKitAdv 的安裝沒啥好說的,解壓後就可以直接使用,編譯時設置DevKitAdv的路徑就可以了,建議做一個批處理文件,比如 go.batset PATH=d:\devkitadv\bin;%PATH%cmd (win98是command)三. 最簡單的 GBA 程序 (t1)// main.c// 一些基本數據類型typedef unsigned char u8;typedef unsigned short u16;typedef unsigned long u32;#define REG_DISPCNT *(u16*)0x04000000 // 顯示寄存器地址#define VRAM 0x06000000 // 圖像緩沖區地址#define M5_VRAM 0x0600A000 // M5緩沖區地址#define BACKBUFFER 0x010 // 雙緩沖/背緩沖地址#define PALETTE 0x5000000 // 調色板地址#define MODE_3 0x03 // 240*160 15bits/單緩沖區#define MODE_4 0x04 // 240*160 8bits/雙緩沖區#define MODE_5 0x05 // 160*128 15bits/雙緩沖區#define BG2_ENABLE 0x0400 // BG_2#define SetMode(Mode) REG_DISPCNT=(Mode) // 設置顯示模式的宏定義// ----------- 主程序 ------------int main(){//設置屏幕模式,這里使用MODE_4SetMode (MODE_4 | BG2_ENABLE);}1.MODE_5和MODE_3都是16bits,但MODE_3隻有單緩沖,製作動畫效 果肯定沒雙緩沖好,因此排除MODE_3;2.MODE_4是8bits,理論上256色對於掌機夠用了,雖然16bits真彩的誘惑沒有人想抗拒,可MODE_5隻有160*128咧,在實際應用中建議還是使用MODE_4.很簡單吧--的確是的,現在要用GCC編譯它:gcc -lm -o main.elf main.cobj -v -O binary main.elf main.bin你會看目錄下多了個"main.bin",這個就是能在GBA模擬器上執行的二進制文件!教程中t1-t10目錄為源程序目錄,裡面有個make.bat,修改代碼後直接執行它就可以編譯,但要注意我的devkitadv是裝在D:,你要是裝在別的盤就得改一下make.bat的path參數.四. 在MODE_4背景層畫圖的 GBA 程序 (t2)在GBA的MODE_4里畫一幅圖要經過3個步驟:1. 把原始256色圖像文件轉換成 *.h / *.c 的數據文件,我們用的是 < BMP2GBA > ,這里以"image.bmp"為例,轉換後我們就得到了一個"image.h"文件;2. 在程序開頭#include "image.h",這樣就能在程序中使用"image.h"定義的調色板和圖像數據;3. 在程序中把"image.h"定義的調色板和圖像數據寫入MODE_4背景層的調色板和圖像緩沖區.另外,GBA還有專為精靈設置的物體層,它的用法和背景層一樣,只是功能有點不一樣,地址是0x06000000.有關用這里就不詳細說了,大家可以把精靈數據直接輸出到物體緩沖區就可以了.下面是源程序:... ...// 包含圖像調色板和數據的頭文件#include "gfx/image.h"// ----------- 全局變數 --------// 系統調 色板u16* palette_mem=(u16*)PALETTE;// 圖像緩沖區u16* video_buffer=(u16*)VRAM;// ----------- 函數定義 ---------// MODE_4繪圖函數void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data);// ----------- 主程序 ------------int main(){// 設置屏幕模式,這里使用MODE_4SetMode (MODE_4 | BG2_ENABLE);// 在背景層畫圖,Palette和Data是在"image.h"定義的調色板和圖像數據數組名Draw(Palette,Data,palette_mem,video_buffer);}// MODE_4繪圖函數void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data){int loop,x,y;// 寫入目的調色板for(loop = 0; loop < 256; loop++)dst_palette[loop] = src_palette[loop];// 寫入圖像緩沖區for(x = 0; x < 120; x++){for(y = 0; y < 160; y++){dst_data[(y) *120 + (x)]=src_data[(y) *120 + (x)];}}}編譯後得到main.bin,然後在GBA模擬器里運行,就可以得到這樣的結果:五. 在MODE_5畫圖的 GBA 程序 (t3)在GBA的MODE_5里畫一幅圖也要經過相似3個步驟,只不過不需要調色板數據:1. 把原始真彩圖像文件轉換成 *.h / *.c 的數據文件,我們用的是 < Targa2GBA > ,這里以"image.bmp"(240*160)為例,DOS窗口下進Targa2GBA目錄, 輸入"t2g mode5 image.bmp image.h",轉換後我們就得到了一個"image.h"文件;2. 在程序開頭#include "image.h",這樣就能在程序中使用"image.h"定義的圖像數據;3. 在程序中把"image.h"定義的圖像數據寫入圖像緩沖區.下面就是源程序:// 包含圖像數據的頭文件#include "gfx/image.h"// ----------- 全局變數 --------// 圖像緩沖區u16* video_buffer=(u16*)VRAM;// ----------- 函數定義 ---------// MODE_5繪圖函數void Draw(int x,int y,int w,int h,u16 *src_data,u16 *dst_data);// ----------- 主程序 ------------int main(){// 設置屏幕模式,這里使用MODE_5SetMode (MODE_5 | BG2_ENABL);// 在背景層畫圖,image是在"image.h"定義的圖像數據數組名Draw(0,0,240,160,image,video_buffer);}// MODE_5繪圖函數void Draw(int x,int y,int w,int h,u16 *src_data,u16 *dst_data){int i,o,idst;// 把源圖像數據復制到圖像緩沖區的指定地方idst =(y*160)+x;for (i=0;i<h;i++){for (o=0;o<w;o++){if (*src_data != 0){dst_data[idst] = *src_data;}idst++;src_data++;}idst += (160-w);}}編譯後運行結果:六. 全屏顯示的 MODE_5 GBA 程序 (t4)由於GBA不支持線性的圖像變換,因此得到的結果會產生一些馬賽克的現象,現在還是附上這個變換函數和最終結果,其實質量還是可以接受的,大家可以試試使用這個新的MODE_5.// 切換到新MODE_5全屏模式,page為緩沖區,原理是把顯示寄存器數據X,Y交換,得到128*160的顯示,GBA就會全屏顯示.void SetFlipMode(int page){u16 *ioreg=(u16*)0x4000000;*ioreg=5+((page&1)>>4)+(1>>10);ioreg[0x10]=0;ioreg[0x11]=256;ioreg[0x12]=128;ioreg[0x13]=0;}int main(){// 設置屏幕模式,這里使用MODE_5SetMode (MODE_5 | BG2_ENABLE);// 切換模式SetFlipMode(0);// 在背景層畫圖,image是在"image.h"定義的圖像數據數組名Draw(0,0,240,160,image,video_buffer);r七. GBA的雙緩沖顯示(t5)大家在做上面MODEL_5的程序時一定會發現圖像在閃動(第六節的240*160的MM象被破了相...),而MODEL_4下卻比較穩定--這是因為MODEL_5下要處理16bits(實質上是15bits)的圖像,數據量比MODEL_4下的8bits大很多,在沒使用雙緩沖的情況下,圖像填充時就會造成閃爍,這就是為什麼我們拋棄了MODEL_3的原因...原理也很簡單,圖像在背緩沖區里填充好之後再直接輸出到前緩沖區顯示,程序里就是一個 "等待同步-> 交換緩沖" 的過程:... ...// ----------- 全局變數 --------// 圖像緩沖區u16* video_bu ffer=(u16*)M5_VRAM;// ----------- 函數定義 ---------... ...// 等待緩沖區數據同步void WaitSync ();// 交換緩沖區內容void SwapScreen ();// ----------- 主程序 ------------int main(){// 設置屏幕模式,這里使用MODE_5SetMode (MODE_5 | BG2_ENABLE);while(1){// 在背景層畫圖,image是在"image.h"定義的圖像數據數組名Draw(0,0,240,160,image,video_buffer);WaitSync();SwapScreen();}}// 等待緩沖區數據同步void WaitSync (){while (*(volatile u16*)0x4000006<160) {};}// 交換緩沖區void SwapScreen ():{if (REG_DISPCNT & BACKBUFFER){REG_DISPCNT &= ~BACKBUFFER;video_buffer = (u16*) M5_VRAM;}else{REG_DISPCNT |= BACKBUFFER;video_buffer = (u16*) VRAM;}}八. GBA 的按鍵輸入(t6)講了老半天的圖像,雖說是對著MM,但大家一定也有點煩了,我們現在就換個方向,來看看GBA的控制.... ...// 按鍵控制#define KEY_A 1#define KEY_B 2#define KEY_SELECT 4#define KEY_START 8#define KEY_RIGHT 16#define KEY_LEFT 32#define KEY_UP 64#define KEY_DOWN 128#define KEY_R 256#define KEY_L 512volatile u32* KEYS = (volatile u32*)0x04000130;// 包含圖像調色板和數據的頭文件#include "gfx/image.h"// ----------- 全局變數 --------// 圖像緩沖區u16* video_buffer=(u16*)M5_VRAM;// 圖像顯示坐標int img_x,img_y;// ----------- 函數定義 ---------// 按鍵控制void KeyAction();... ...// ----------- 主程序 ------------int main(){// 設置屏幕模式,這里使用MODE_5SetMode (MODE_5 | BG2_ENABLE);while(1){// 處理按鍵事件KeyAction();// 在背景層畫圖,image是在"image.h"定義的圖像數據數組名Draw(img_x,img_y,96,64,image,video_buffer); WaitSync();SwapScreen();}}// 處理按鍵事件void KeyAction(){// 上方向鍵if(! ( (*KEYS) & KEY_UP) ){img_y+=5;}// 下方向鍵if(! ( (*KEYS) & KEY_DOWN) ){img_y-=5;}}eturn(0);九. 簡單聲音輸出(t7)Simple is the Best(簡潔至上),這里我們使用一個現成的聲音模塊(Troff Player,by Vova & Serge).這里還要用到一個轉換工具< MOD2GBA >,用來把MOD音樂文件轉換成GBA的 *.c / *.h 聲音數據文件.MOD和MIDI差不多,但支持更多更強的效果.MOD可以由konvertor這個強大的軟體轉換而來.// MOD數據文件#include "song_data.h"// MOD: 播放函數文件#include "modplayer.h"// ----------- 主程序 ------------int main(){//設置屏幕模式,這里使用MODE_4SetMode (MODE_4 | BG2_ENABLE);// 初始化聲音(聲道數,音量)InitSound(2, 7);// 初始化音樂(節拍,循環)InitSong(20000, 0);while(1){// 更新音樂播放狀態UpdateSong();}}OK,就這么EZ.十. 用圖塊建立可滾動/縮放/旋轉的背景(t8)這一節主要是源程序中注釋為主,這里就不詳細說明了."gba.h"包含基本宏定義,"maths.h"是sin/cos乘256後的值數組,"main.h"包括了我們定義背景結構及操作背景的函數.程序中的地圖背景是由 同的圖塊所構成,而這些圖塊統一緊挨著放在一個圖像文件,這樣每個圖塊就會有一個索引號;地圖信息只要記錄這張地圖里共有多少個 單位(圖塊)以及每個單位對應的圖塊索引號就OK了,在例子中"gfx/tiles.h"就是圖塊大本營,而"gfx/level1.h"則是圖塊索引排列表.地圖工具為"map editor beta 4".背景的滾動/縮放/旋轉是通過一系列的簡單數學計算,修改GBA系統提供的一些背景屬性來完成,因為是由硬體來完成背景的操作(MODE_1),所以速度很快,我還有個MODE_5下直接修改像素點位置來完成旋轉的常式,待會兒大家可以比較一下.

閱讀全文

與gba游戲編程教程相關的資料

熱點內容
64腳pic單片機 瀏覽:219
nba2k17壓縮包 瀏覽:868
取快遞為什麼有加密號碼 瀏覽:288
伺服器太多人登錄怎麼引導 瀏覽:594
歸整演算法 瀏覽:981
長沙應屆生找工作用什麼app 瀏覽:605
貨車空調壓縮機根部線斷了能修嗎 瀏覽:156
提示文件夾正在使用怎麼關 瀏覽:526
老人單片機編程 瀏覽:63
計算機視覺處理的基本演算法 瀏覽:786
東芝64位單片機 瀏覽:773
新松編程 瀏覽:548
快手app大屏下線通知什麼意思 瀏覽:843
移動政務伺服器地址是多少 瀏覽:644
ios打包編譯命令 瀏覽:906
幸福演算法師 瀏覽:586
照片壓縮包格式zip 瀏覽:393
oa伺服器如何設置台式機 瀏覽:658
51單片機4個並口功能 瀏覽:948
androidmk目錄 瀏覽:974