博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
掌上游戏机开发指南GBA探索日记(10)(转)
阅读量:2450 次
发布时间:2019-05-10

本文共 2883 字,大约阅读时间需要 9 分钟。

掌上游戏机开发指南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/

你可能感兴趣的文章
react 中国际化_从头到尾如何在React中设置国际化
查看>>
自学真的很难成才吗_对于自学成才的开发人员而言真正有用的职业资源
查看>>
bulma.css_在5分钟内学习Bulma CSS-初学者教程
查看>>
如何快速设置您的ES6环境
查看>>
深圳哪个区的it工作多_如何创建虚拟IT工作区
查看>>
组件和高阶组件区别_高阶组件:终极指南
查看>>
ios 文本动画_如何创建微妙的动画文本开口
查看>>
如何知道Kubernetes是否适合您的SaaS
查看>>
如何使用React Native构建实时的Todo应用
查看>>
apollo调试工具_GraphQL工具包Apollo的完整介绍
查看>>
函数编程代码例子_使用函数式编程使代码更易于阅读
查看>>
文件从头开始读函数_这是您可以从头开始编写的一些函数修饰符
查看>>
通过这10部分免费课程学习Bootstrap 4
查看>>
react 左右互动_如何使React性与国家互动
查看>>
计算机编程课程顺序_470道免费的在线编程和计算机科学课程,四月开始
查看>>
嵌入式初学者用书_在面向初学者的免费和交互式课程中学习HTML5
查看>>
在3小时内学习Kubernetes:编排容器的详细指南
查看>>
清除所有浏览器历史数据脚本_不要让浏览器吸收所有数据
查看>>
如何使用Webpack 4从零开始创建React应用
查看>>
react 模式_React中不断发展的模式
查看>>