口袋改版吧 关注:25,732贴子:170,262

【久违的教程】影月君的GBA图形教程,的确很久没发教程了...

只看楼主收藏回复

在暑假结束之际,我也要上课了,刚好现在又当上了大吧,我就留下一篇原创的教程吧。
注意,这篇教程需要一定的改版基础才能看懂。
其实这篇教程涉及的大多都是图像的教程,对美工是有很大的帮助的。
【转载注明出处】
这篇教程会带大家理解BG,OBJ,RAW,图形库,色深库,IO等GBA的图形知识以及提及部分Lz77压缩的知识,对GBA改版会有不少帮助的。
(一)BG与OBJ
BG和OBJ是什么呢?
在我们改版的时候,打开VBA的调色板查看器,你会发现最下面有4个按钮吧?

这里你会发现,有‘保存BG’‘保存OBJ’
到底BG和OBJ是什么呢?
其实,
BG是图层,也可以叫做背景,图层是由一块块8x8的小图块组成的,可以拼出很多图形,例如封面,地图,包括对话框也是BG来的。
OBJ是精灵,什么是精灵?其实就是可以移动的一个个模型,例如行走图就是精灵了。GBA支持128个精灵,每个最大尺寸是64x64。
首先,我们从BG入手看看。(这里我使用了Ruby的封面来做示范)
打开VBA-工具-图层查看器

我们先看左边的部分。
你会看到‘背景’
BG0
BG1
BG2
BG3
GBA有4个图层,就是以上的4个图层了,每个图层可以显示不一样的东西。
我们看回中间
图层库:
色深库:
尺寸:
颜色:
优先级:
这里就涉及到图层库和色深库了。
图层库,其实我们可以更加亲切地理解为存放RAW的地方。RAW是什么,我就不解释了。
在VBA中打开工具-活动块查看器
由于在上图的图层库是0x600C000,那么我们也在活动器查看器中按到0x600C000

那么,在0x600C000的其实就是封面的RAW了。在unlz里查看你会发现是一样的。
现在,我们说色深库。
其实,色深库我们可以理解成放Tile的地方。Tile我也不解释了。
同样打开活动区查看器,跳到0x6008000

在0x608000的位置你同样会看到封面的tile吧。
那么,我们现在可以暂时得到一个结论,BG就是由Tile和RAW拼成的。
所以,凡是在BG可以看到的图像,都一定会有属于他的‘RAW’
刚刚我们在图层查看器里,我现在继续解释。
尺寸:(就是大小,这个图层的大小,我们一般会见到256x256,256x512,512x512,512x256之类的大小,这个大小是由IO控制的,这个下文会讲)
颜色:(这里分为16色调色模式和256色调色模式,在IO控制)
优先级:(这个是控制图层的先后顺序,一样在IO中控制)
在图层查看器中,我在右边的图层顺便点了一个图块。

这个时候你会发现中间的有数值了。我一一解释下。
(x坐标,y坐标)这个是这个图块在图层中的坐标。
地址:(这个位置在图层库的地址)
活动块:(在所在的色深库的活动器查看器中每一个图块的活动块号)
调色板:(这个图块的调色板)
这里你会发现,其实一个图层可以有多个调色板,没错,多色的封面就是这样做出来的。
这个时候我们补充下活动器查看器的说明吧。

其实会改版的对这个也不陌生了,所以基本的我就不说了。
在这里你会发现有5个焦点库。
其实,前面的是4个是BG的,后面的是OBJ的,如果你有心,你就会发现只有BG的才会有RAW,而OBJ是不需要RAW的。
每一个焦点库都有他的活动块,这个自己参试下就可以了。
现在我们说说OBJ,其实,我对OBJ并不熟悉,只能勉强讲讲。
在第5个焦点库,就是0x6010000开始到0x6017FFF,这里是存放OBJ的地方。
而OAM显示的地方则在0x7000000开始。
查看OAM可以在工具-对象属性查看器 查看

这个我就不多说了。
以上的就是关于BG与OBJ的,或许我讲得并不好,原因么?新人喽。
现在,我继续讲讲IO吧,原本打算想顺便把IO数值的运算方法写出来的,不过怕你们有点看不懂。
IO,里面存放着各种控制寄存器。可以实现各种特效,例如屏幕的移动,显示BG,半透明特效等的。
IO的内存映射地址在0x4000000.
LCD I/O Registers
4000000h 2 R/W DISPCNT LCD Control
4000002h 2 R/W - Undocumented - Green Swap
4000004h 2 R/W DISPSTAT General LCD Status (STAT,LYC)
4000006h 2 R VCOUNT Vertical Counter (LY)
4000008h 2 R/W BG0CNT BG0 Control
400000Ah 2 R/W BG1CNT BG1 Control
400000Ch 2 R/W BG2CNT BG2 Control
400000Eh 2 R/W BG3CNT BG3 Control
4000010h 2 W BG0HOFS BG0 X-Offset
4000012h 2 W BG0VOFS BG0 Y-Offset
4000014h 2 W BG1HOFS BG1 X-Offset
4000016h 2 W BG1VOFS BG1 Y-Offset
4000018h 2 W BG2HOFS BG2 X-Offset
400001Ah 2 W BG2VOFS BG2 Y-Offset
400001Ch 2 W BG3HOFS BG3 X-Offset
400001Eh 2 W BG3VOFS BG3 Y-Offset
4000020h 2 W BG2PA BG2 Rotation/Scaling Parameter A (dx)
4000022h 2 W BG2PB BG2 Rotation/Scaling Parameter B (dmx)
4000024h 2 W BG2PC BG2 Rotation/Scaling Parameter C (dy)
4000026h 2 W BG2PD BG2 Rotation/Scaling Parameter D (dmy)
4000028h 4 W BG2X BG2 Reference Point X-Coordinate
400002Ch 4 W BG2Y BG2 Reference Point Y-Coordinate
4000030h 2 W BG3PA BG3 Rotation/Scaling Parameter A (dx)
4000032h 2 W BG3PB BG3 Rotation/Scaling Parameter B (dmx)
4000034h 2 W BG3PC BG3 Rotation/Scaling Parameter C (dy)
4000036h 2 W BG3PD BG3 Rotation/Scaling Parameter D (dmy)
4000038h 4 W BG3X BG3 Reference Point X-Coordinate
400003Ch 4 W BG3Y BG3 Reference Point Y-Coordinate
4000040h 2 W WIN0H Window 0 Horizontal Dimensions
4000042h 2 W WIN1H Window 1 Horizontal Dimensions
4000044h 2 W WIN0V Window 0 Vertical Dimensions
4000046h 2 W WIN1V Window 1 Vertical Dimensions
4000048h 2 R/W WININ Inside of Window 0 and 1
400004Ah 2 R/W WINOUT Inside of OBJ Window & Outside of Windows
400004Ch 2 W MOSAIC Mosaic Size
400004Eh - - Not used
4000050h 2 R/W BLDCNT Color Special Effects Selection
4000052h 2 W BLDALPHA Alpha Blending Coefficients
4000054h 2 W BLDY Brightness (Fade-In/Out) Coefficient
4000056h - - Not used
Sound Registers
4000060h 2 R/W SOUND1CNT_L Channel 1 Sweep register (NR10)
4000062h 2 R/W SOUND1CNT_H Channel 1 Duty/Length/Envelope (NR11, NR12)
4000064h 2 R/W SOUND1CNT_X Channel 1 Frequency/Control (NR13, NR14)
4000066h - - Not used
4000068h 2 R/W SOUND2CNT_L Channel 2 Duty/Length/Envelope (NR21, NR22)
400006Ah - - Not used
400006Ch 2 R/W SOUND2CNT_H Channel 2 Frequency/Control (NR23, NR24)
400006Eh - - Not used
4000070h 2 R/W SOUND3CNT_L Channel 3 Stop/Wave RAM select (NR30)
4000072h 2 R/W SOUND3CNT_H Channel 3 Length/Volume (NR31, NR32)
4000074h 2 R/W SOUND3CNT_X Channel 3 Frequency/Control (NR33, NR34)
4000076h - - Not used
4000078h 2 R/W SOUND4CNT_L Channel 4 Length/Envelope (NR41, NR42)
400007Ah - - Not used
400007Ch 2 R/W SOUND4CNT_H Channel 4 Frequency/Control (NR43, NR44)
400007Eh - - Not used
4000080h 2 R/W SOUNDCNT_L Control Stereo/Volume/Enable (NR50, NR51)
4000082h 2 R/W SOUNDCNT_H Control Mixing/DMA Control
4000084h 2 R/W SOUNDCNT_X Control Sound on/off (NR52)
4000086h - - Not used
4000088h 2 BIOS SOUNDBIAS Sound PWM Control
400008Ah .. - - Not used
4000090h 2x10h R/W WAVE_RAM Channel 3 Wave Pattern RAM (2 banks!!)
40000A0h 4 W FIFO_A Channel A FIFO, Data 0-3
40000A4h 4 W FIFO_B Channel B FIFO, Data 0-3
40000A8h - - Not used
DMA Transfer Channels
40000B0h 4 W DMA0SAD DMA 0 Source Address
40000B4h 4 W DMA0DAD DMA 0 Destination Address
40000B8h 2 W DMA0CNT_L DMA 0 Word Count
40000BAh 2 R/W DMA0CNT_H DMA 0 Control
40000BCh 4 W DMA1SAD DMA 1 Source Address
40000C0h 4 W DMA1DAD DMA 1 Destination Address
40000C4h 2 W DMA1CNT_L DMA 1 Word Count
40000C6h 2 R/W DMA1CNT_H DMA 1 Control
40000C8h 4 W DMA2SAD DMA 2 Source Address
40000CCh 4 W DMA2DAD DMA 2 Destination Address
40000D0h 2 W DMA2CNT_L DMA 2 Word Count
40000D2h 2 R/W DMA2CNT_H DMA 2 Control
40000D4h 4 W DMA3SAD DMA 3 Source Address
40000D8h 4 W DMA3DAD DMA 3 Destination Address
40000DCh 2 W DMA3CNT_L DMA 3 Word Count
40000DEh 2 R/W DMA3CNT_H DMA 3 Control
40000E0h - - Not used
Timer Registers
4000100h 2 R/W TM0CNT_L Timer 0 Counter/Reload
4000102h 2 R/W TM0CNT_H Timer 0 Control
4000104h 2 R/W TM1CNT_L Timer 1 Counter/Reload
4000106h 2 R/W TM1CNT_H Timer 1 Control
4000108h 2 R/W TM2CNT_L Timer 2 Counter/Reload
400010Ah 2 R/W TM2CNT_H Timer 2 Control
400010Ch 2 R/W TM3CNT_L Timer 3 Counter/Reload
400010Eh 2 R/W TM3CNT_H Timer 3 Control
4000110h - - Not used
Serial Communication (1)
4000120h 4 R/W SIODATA32 SIO Data (Normal-32bit Mode) (shared with below!)
4000120h 2 R/W SIOMULTI0 SIO Data 0 (Parent) (Multi-Player Mode)
4000122h 2 R/W SIOMULTI1 SIO Data 1 (1st Child) (Multi-Player Mode)
4000124h 2 R/W SIOMULTI2 SIO Data 2 (2nd Child) (Multi-Player Mode)
4000126h 2 R/W SIOMULTI3 SIO Data 3 (3rd Child) (Multi-Player Mode)
4000128h 2 R/W SIOCNT SIO Control Register
400012Ah 2 R/W SIOMLT_SEND SIO Data (Local of Multi-Player) (shared below)
400012Ah 2 R/W SIODATA8 SIO Data (Normal-8bit and UART Mode)
400012Ch - - Not used
Keypad Input
4000130h 2 R KEYINPUT Key Status
4000132h 2 R/W KEYCNT Key Interrupt Control
Serial Communication (2)
4000134h 2 R/W RCNT SIO Mode Select/General Purpose Data
4000136h - - IR Ancient - Infrared Register (Prototypes only)
4000138h - - Not used
4000140h 2 R/W JOYCNT SIO JOY Bus Control
4000142h - - Not used
4000150h 4 R/W JOY_RECV SIO JOY Bus Receive Data
4000154h 4 R/W JOY_TRANS SIO JOY Bus Transmit Data
4000158h 2 R/? JOYSTAT SIO JOY Bus Receive Status
400015Ah - - Not used
Interrupt, Waitstate, and Power-Down Control
4000200h 2 R/W IE Interrupt Enable Register
4000202h 2 R/W IF Interrupt Request Flags / IRQ Acknowledge
4000204h 2 R/W WAITCNT Game Pak Waitstate Control
4000206h - - Not used
4000208h 2 R/W IME Interrupt Master Enable Register
400020Ah - - Not used
4000300h 1 R/W POSTFLG Undocumented - Post Boot Flag
4000301h 1 W HALTCNT Undocumented - Power Down Control
4000302h - - Not used
4000410h ? ? ? Undocumented - Purpose Unknown / Bug ??? 0FFh
4000411h - - Not used
4000800h 4 R/W ? Undocumented - Internal Memory Control (R/W)
4000804h - - Not used
4xx0800h 4 R/W ? Mirrors of 4000800h (repeated each 64K)
以上的为全部的IO寄存器。
其实,在vba也可以查看,打开工具-IO查看器

这里就是我认为整个GBA中最复杂的地方了。具体怎么用,大家最好是自己试试。
右上角的数值,是2个字节吧?
在IO中,0-7位的使用一个数值,8-15使用另一个数值。
他们都是使用2进制,最后转成16进制的。
每一个位里的意思都是不一样的,大家可以看看这个文档,想学习的对你帮助太大了。
http://nocash.emubase.de/gbatek.htm
IO就到此一段落吧。
现在我简单的讲述下Lz77压缩吧。
在GBA和NDS中使用的比较多的就是Lz77压缩了,在unlz(其实准确的说,unlz是一个读取Lz77压缩的工具)看到的图片,其实都是Lz77压缩后的,压缩的不一定是图片,可以是raw,色板等等。例如封面的素材和raw就是压缩的。而在一般的Tile查看器看到的图片,例如CT2,里面看到的图片都是不压缩的,所以Tile查看器才可以读出来。
So,unlz读取的图片和CT2读取的图片一定是没有交集的!
Lz77压缩过的东西有一个好处,可以省空间,他在导入压缩时已经把压缩的文件大小一起写在了里面。例如精灵的色板就是压缩过的,可以在unlz直接写入。
大家有没有郁闷,系统是怎么读取压缩和非压缩的文件的。
这里,系统使用的指令就是SWI了。
当系统读取的是Lz77压缩的时候,
使用的指令是swi 12
ldr r0,=#0x
ldr r1,=#0x
swi 12
这个指令是不用在填大小的。
假如是非压缩的,用的是swi B
ldr r0,=#0x
ldr r1,=#0x
ldr r2,=#0x
swi B
这里的r2就要填上大小了,所以,压缩与非压缩,差别就是这样。
教程就到这里了。这篇教程是我刚刚写出来的,看看时间,也快2点半了,或许有很多写得不好,欢迎纠正。
尾声:只有试得多,才会成功,不要一味的只问别人,参试自己解决问题。-- 一位只加入改版界一年的新手 留


IP属地:广东1楼2013-08-31 02:30回复
    二楼


    IP属地:浙江来自Android客户端2楼2013-08-31 05:44
    回复
      3楼帮顶


      IP属地:四川来自Android客户端3楼2013-08-31 07:35
      回复


        IP属地:浙江来自iPhone客户端4楼2013-08-31 07:45
        回复


          IP属地:浙江来自手机贴吧5楼2013-08-31 08:56
          回复
            影月看来你已经把那本gba编程手册看透了...


            IP属地:美国6楼2013-08-31 09:03
            收起回复
              不懂帮顶


              来自手机贴吧7楼2013-08-31 09:14
              回复



                IP属地:中国澳门8楼2013-08-31 09:31
                收起回复
                  (⊙_⊙)(⊙_⊙)
                  [闭关修炼中,勿扰。] ┏ ((╯﹏╰))=☞。。。


                  IP属地:新疆来自Android客户端9楼2013-08-31 09:54
                  收起回复
                    还是有些地方不懂


                    IP属地:广东10楼2013-08-31 10:09
                    回复
                      有的地方好复杂的,帮顶


                      IP属地:广东来自Android客户端11楼2013-08-31 10:25
                      回复
                        改动画。好样的。骚年何时来一发?


                        IP属地:云南来自手机贴吧12楼2013-08-31 11:15
                        回复
                          好赞顶
                          ✎﹏真的不骗你这是最标准的十五个字


                          IP属地:浙江来自Android客户端13楼2013-08-31 12:14
                          回复
                            肯定有改版了数年的聚聚存在


                            14楼2013-08-31 15:46
                            回复
                              看不懂


                              15楼2013-08-31 21:43
                              回复