GBA探索日记(二)
OBJ及OAM
OBJ就是指的一个个的精灵,或说就是GBA中的小块小块的图片.他其实跟BG差不多.只是他要小一些.他也算个图层.比如GBA中的RPG游戏就喜欢把一个个的人物用OBJ来实现.这样方便控制他们的位置.当然,从GBA探索日记(-)中也能够看到BG的控制其实也是很方便的.而OBJ和BG的差别就是大小.
配置显示模式
假如您的程式里要用OBJ那么,
在配置显示模式的时候需要把DISP_OBJ_ON和DISP_OBJ_CHAR_1D_MAP加进去
*(vu16 *)REG_DISPCNT = DISP_MODE_1 | DISP_OBJ_ON | DISP_OBJ_CHAR_1D_MAP;
#define DISP_OBJ_CHAR_1D_MAP 0x0040 // OBJ Character Data 1D Mapping
#define DISP_OBJ_ON 0x1000 // OBJ ON
下面就直接来看看OBJ在GBA中怎么实现的.
首先要说明的就是OBJ在GBA中显示也是由一个个8x8的小图块拼成,跟BG相同.
共有下面12种大小.
0000: 8 x 8 1000: 8 x 16
0001: 16 x 16 1001: 8 x 32
0010: 32 x 32 1010: 16 x 32
0011: 64 x 64 1011: 32 x 64
0100: 16 x 8
0101: 32 x 8
0110: 32 x 16
0111: 64 x 32
OBJ的数据分三部分.
1.Character
他跟BG的数据格式是相同的,都是由8x8的小图块的图像数据.而且您也能够通过转换BG的工具来转换OBJ的Character.所以说BG和OBJ的数据结构基本是相同的.但是任何的OBJ总共的Character不能超过32K.
256色的OBJ能有512个Characters,每个Characters占8*8=64bytes.而16色的Characters能有1024个.每个Character占8*8/2=32Bytes.似乎比一个BG的256个Character多?但是BG能够有多个,不同的BG能够有不同的Character,而任何OBJ只能共用这512个Charater.
2.Palette
调色板就不用说了,他跟BG相同,支持一个256色调色板或16个16色的调色板.
3.OAM
OAM就是OBJ Attribure Memory的缩写.他就是控制OBJ属性的数据部分.比如OBJ的位置,大小等数据部分就放在这里.每个OBJ的OAM占8个字节,OAM是从内存中07000000h到070003FFh,共1024=8*128,所以OAM总共能有128个.
如何创建一个OBJ呢?
前面我就说过通过转换BG的工具也能够用于转换OBJ.
以前转换BG我建议使用的是AgbLib里的bmp2map.exe,同样,转换OBJ也同样用bmp2map.exe这个工具.
比如我把Character Data放到sprite_gfx这个数组里,把Palette放到sprite_pal里面.(OBJ中没有Map Data,您的转换时能够把Map data也转换进来,只但是后面用不着)
然后在程式里写入:
DmaArrayCopy(3, sprite_gfx,OBJ_MODE1_VRAM,32);
DmaArrayCopy(3, sprite_pal,OBJ_PLTT,32);
把sprite_gfx,sprite_pal拷贝到指定内存中去.
这里又设计到OBJ_MODE1_VRAM和OBJ_PLTT两个内存地址
还是看看AgbLib中是怎么定义他们的吧.
#define PLTT 0x05000000 // Palette RAM
#define PLTT_END (PLTT 0x400)
#define BG_PLTT (PLTT 0x0) // BG Palette RAM
#define BG_PLTT_END (PLTT 0x200)
#define OBJ_PLTT (PLTT 0x200) // OBJ Palette RAM
#define OBJ_PLTT_END (PLTT 0x400)
#define VRAM 0x06000000 // VRAM
#define VRAM_END (VRAM 0x18000)
#define BG_VRAM (VRAM 0x0) // BG Character/Screen RAM
#define OBJ_MODE0_VRAM (VRAM 0x10000) // OBJ Character RAM
#define OBJ_MODE1_VRAM (VRAM 0x10000)
#define OBJ_MODE2_VRAM (VRAM 0x10000)
#define OBJ_MODE3_VRAM (VRAM 0x14000)
#define OBJ_MODE4_VRAM (VRAM 0x14000)
#define OBJ_MODE5_VRAM (VRAM 0x14000)
#define OBJ_VRAM_END (VRAM 0x18000)
这里我把BG中的地址也包含近来了,您能够对比一下BG和OBJ中的地址.
然后就是配置OAM(OBJ Attribure Memory).
这里先看看官方文档中是怎么说这个OAM的数据结构的.
特别指出的是上面表格中Character Name是指这个OBJ的起始Character的引索
我将介绍两中方法来配置.
文章整理:西部数码--专业提供域名注册、虚拟主机服务
第一种方法很直观,也很简单.这是我在网上看到最多的.
首先定义了数据结构
typedef struct tagOAMEntry
{
u16 attribute0;
u16 attribute1;
u16 attribute2;
u16 attribute3;
}OAMEntry, *pOAMEntry;
//attribute0
#define ROTATION_FLAG 0x100
#define SIZE_DOUBLE 0x200
#define MODE_NORMAL 0x0
#define
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




