下载此文档

GBA游戏制作.doc


文档分类:生活休闲 | 页数:约14页 举报非法文档有奖
1/14
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/14 下载此文档
文档列表 文档介绍
该【GBA游戏制作 】是由【Bastok】上传分享,文档一共【14】页,该文档可以免费在线阅读,需要了解更多关于【GBA游戏制作 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。GBA游戏制作
GBAS是GameBoyAdvancedevelopmentSystem(GameBoyAdvance
开发系统)的缩写,它主要的功能便是用来做GameBoyAdvance游戏以及数据的传输,使用者可以自行将自己所撰写的GameBoyAdvance软件透过GBAS烧录机传至GBAS64M或GBS128M的覆写卡上面,然后插入GameBoyAdvance的主机执行。就是说,如果你自己也会开发GBA的游戏的话(据说对于好的程序员不是很难),那么你根本不需要任天堂的授权,就可以把自己开发的GBA游戏直接通过GBAS系统在GBA上游玩。
GBAS烧录机的功能除了负责将GameBoyAdvance的软件传输至覆写卡外,他还具备可将原版GameBoyAdvance卡带备份至计算机储存成*.GBA的计算机档案,或者将原版GameBoyAdvance卡带以及GBAS覆写卡中的记忆存盘备份成*.SAV的计算机档案。这些备份的档案均可配合各种GameBoyAdvance计算机仿真器执行。而这就意味着你可以利用这款系统自由把网络上的GBA游戏的ROM通过GBAS烧录机直接拷贝到专用GBAS卡带上,想想网络上已经可以执行的GBA游戏ROM的数量,是不是有些心动了,
应该说GBAS是一个相当完善的系统,虽然这款系统刚刚开发完毕,但是它在功能上已经相当优秀了,那我们现在看看它有那些特点。一、EEPROM特殊记忆支持:这款GBAS是目前唯一支持EEPROM记忆格式的GBA开发工具,也是目前唯一可以对应SuperMarioAdvance(日/美)的开发工具。哈哈,要知道超级MARIO大冒险的美版还没有出啊,而在网络上,这个游戏的ROM早就有了,所以大家可以看到在图片中执行的GBA游戏就是超级MARIO大冒险的美版。
二、超大电池记忆:超大1M电池记忆,支持所有游戏记忆(包括游戏王五代的超大电池记忆也能支持)。这个特点是相当好的,也比较贴近玩家的特点,一般来说,用了这个东西,什么游戏的记录都不会出问题了,玩家完全没有必要担心、GBAS的记忆空间不足。三、合卡功能:GBAS支持合卡,64M版本可支持两个32M的游戏
合卡。这样,玩家可以一次录进两个32M的游戏,使GBAS成为一个合卡,要是玩家拥有的是128M的覆写卡,嘿嘿,那就可以让你的GBAS成为4合1卡了,这样就节约了游戏烧录拷贝的时间,当然,128M的卡几个自然要高得多了。
四、操作接口:全新窗口下烧录接口(包含游戏上载,下载以及游戏记录文件上载下载功能)全新修正了游戏传输问题,更快速更准确,支持窗口9X作业平台,安装容易使用方便,使用者完全不用担心会出什么问题。
GBA的软件制作烧录系统—GBAS
简单入门-
--DevKitAdv简介
DevKitAdv主要包括两部分,一是GCC++编译器,二是GBA库.
GCC++编译器功能和我们常用的VC差不多,只不过少了个编辑源代码的文本编辑器(至少我没发现,我用的是EditPlus,UltraEdit也可以),还有就是--不支持类(class),真是让人头痛,,;
GBA库提供了图像,控制及声音一系列的函数,和GCC++配合使用.
下载地址:
~darkfader/gba/files/devkitadv.
zip

没啥好说的,解压后就可以直接使用,编译时设置DevKitAdv的路径就可以了,建议做一个批处理文件,
setPATH=d:\devkitadv\bin;%PATH%
cmd(win98是command)
(t1)
//
//一些基本数据类型
typedefunsignedcharu8;typedefunsignedshortu16;typedefunsignedlongu32;#defineREG_DISPCNT*(u16*)0x04000000//显示寄存器地址#defineVRAM0x06000000//图像缓冲区地址
#defineM5_VRAM0x0600A000//M5缓冲区地址
#defineBACKBUFFER0x010//双缓冲/背缓冲地址#definePALETTE0x5000000//调色板地址
#defineMODE_30x03//240*16015bits/单缓冲区#defineMODE_40x04//240*1608bits/双缓冲区#defineMODE_50x05//160*12815bits/双缓冲区#defineBG2_ENABLE0x0400//BG_2
#defineSetMode(Mode)REG_DISPCNT=(Mode)//设置显示模式的宏定义
//-----------主程序------------intmain()
{
//设置屏幕模式,这里使用MODE_4
SetMode(MODE_4|BG2_ENABLE);}
,但MODE_3只有单缓冲,制作动画效果肯定没双缓冲好,因此排除MODE_3;
,理论上256色对于掌机够用了,虽然16bits真彩的诱惑没有人想抗拒,可MODE_5只有160*128咧,在实际应用中建议还是使用MODE_4.
很简单吧--的确是的,现在要用GCC编译它:
gcc-lm-
objcopy-v-
你会看目录下多了个"",这个就是能在GBA模拟器上执行的二进制文件!
教程中t1-t10目录为源程序目录,,修改代码后直接执行它就可以编译,但要注意我的devkitadv是装在D:,.
(t2)
在GBA的MODE_4里画一幅图要经过3个步骤:
*.h/*.c的数据文件,我们用的是<BMP2GBA>,这里以""为例,转换后我们就得到了一个""文件;
#include"",这样就能在程序中使用
""定义的调色板和图像数据;
""定义的调色板和图像数据写入MODE_4背景层的调色板和图像缓冲区.
另外,GBA还有专为精灵设置的物体层,它的用法和背景层一样,只是功能有点不一样,,大家可以把精灵数据直接输出到物体缓冲区就可以了.
下面是源程序:
......
//包含图像调色板和数据的头文件
#include"gfx/"
//-----------全局变量--------
//系统调色板
u16*palette_mem=(u16*)PALETTE;//图像缓冲区
u16*video_buffer=(u16*)VRAM;
//-----------函数定义---------
//MODE_4绘图函数
voidDraw(u16*src_palette,u16*src_data,u16*
dst_palette,u16*dst_data);
//-----------主程序------------intmain()
{
//设置屏幕模式,这里使用MODE_4
SetMode(MODE_4|BG2_ENABLE);
//在背景层画图,Palette和Data是在""定义的调色板和图像数据数组名
Draw(Palette,Data,palette_mem,video_buffer);
}
//MODE_4绘图函数
voidDraw(u16*src_palette,u16*src_data,u16*
dst_palette,u16*dst_data){
intloop,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)];
}
}
}
,然后在GBA模拟器里运行,就可以得到这样的结果:
(t3)
在GBA的MODE_5里画一幅图也要经过相似3个步骤,只不过不需要调色板数据:
*.h/*.c的数据文件,我们用的是<Targa2GBA>,这里以""(240*160)为例,DOS窗口下进Targa2GBA目录,输入"",转换后我们就得到了一个""文件;
#include"",这样就能在程序中使用""定义的图像数据;
""定义的图像数据写入图像缓冲区.
下面就是源程序:
//包含图像数据的头文件
#include"gfx/"
//-----------全局变量--------
//图像缓冲区
u16*video_buffer=(u16*)VRAM;
//-----------函数定义---------
//MODE_5绘图函数
voidDraw(intx,inty,intw,inth,u16*src_data,u16
*dst_data);
//-----------主程序------------intmain()
{
//设置屏幕模式,这里使用MODE_5
SetMode(MODE_5|BG2_ENABLE);
//在背景层画图,image是在""定义的图像数据数组名Draw(0,0,240,160,image,video_buffer);
}
//MODE_5绘图函数
voidDraw(intx,inty,intw,inth,u16*src_data,u16*dst_data)
{
inti,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);
}
}
编译后运行结果:
(t4)
由于GBA不支持线性的图像变换,因此得到的结果会产生一些马赛克的现象,现在还是附上这个变换函数和最终结果,其实质量还是可以接受的,大家可以试试使用这个新的MODE_5.
//切换到新MODE_5全屏模式,page为缓冲区,原理是把显示寄存器数据X,Y交换,得到128*160的显示,(intpage){
u16*ioreg=(u16*)0x4000000;
*ioreg=5+((page&1)>>4)+(1>>10);ioreg[0x10]=0;
ioreg[0x11]=256;
ioreg[0x12]=128;
ioreg[0x13]=0;
}
intmain()
{
//设置屏幕模式,这里使用MODE_5
SetMode(MODE_5|BG2_ENABLE);
//切换模式
SetFlipMode(0);
//在背景层画图,image是在""定义的图像数据数组名Draw(0,0,240,160,image,video_buffer);
(t5)
大家在做上面MODEL_5的程序时一定会发现图像在闪动(第六节的240*160的MM象被破了相...),而MODEL_4下却比较稳定--这是因为MODEL_5下要处理16bits(实质上是15bits)的图像,数据量比MODEL_4下的8bits大很多,在没使用双缓冲的情况下,图像填充时就会造成闪烁,这就是为什么我们抛弃了MODEL_3的原因...
原理也很简单,图像在背缓冲区里填充好之后再直接输出到前缓冲区显示,程序里就是一个"等待同步->交换缓冲"的过程:
......
//-----------全局变量--------
//图像缓冲区
u16*video_buffer=(u16*)M5_VRAM;
//-----------函数定义---------
......
//等待缓冲区数据同步
voidWaitSync();
//交换缓冲区内容
voidSwapScreen();
//-----------主程序------------intmain()
{
//设置屏幕模式,这里使用MODE_5
SetMode(MODE_5|BG2_ENABLE);
while(1)
{
//在背景层画图,image是在""定义的图像数据数组名Draw(0,0,240,160,image,video_buffer);
WaitSync();
SwapScreen();
}
}
//等待缓冲区数据同步
voidWaitSync()
{
while(*(volatileu16*)0x4000006<160){};
}
//交换缓冲区
voidSwapScreen()
{
if(REG_DISPCNT&BACKBUFFER){
REG_DISPCNT&=~BACKBUFFER;video_buffer=(u16*)M5_VRAM;}

GBA游戏制作 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数14
  • 收藏数0 收藏
  • 顶次数0
  • 上传人Bastok
  • 文件大小33 KB
  • 时间2023-02-27