掌上游戏机开发指南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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-951690/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值