分享
 
 
 

掌上游戏机开发指南GBA探索日记(10)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

研究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

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数据.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有