NDS开发Wiki翻译:第五天:背景(1)



掌叔
2008-06-06 15:47:54

摘自:chenyi1976.spaces.live.com
翻译:陈轶

这是一个使用PAlib显示背景的教程


DS背景说明

以介绍精灵同样的方法,我们开始介绍背景相关知识。。。背景的变化太多了,晤,就算PALib也没有真正覆盖到背景相关的所有可能性,而只是选择比较有用和通用的部分。。。

* DS在一个屏幕上能够显示4个不同的背景,每个背景都有一个256色的调色板。每个背景都由两部分组成:
*
o 方块们,每个方块是8×8象素大小,他们共同组合成整个图片
o 方块地图,一个范围为256×256或512×512的小地图,描述了方块是怎样对齐到屏幕上的。
* 除了方块地图以外,你还可以直接使用8位色或16位色的位图,bmp,gif甚至jpeg,还可以在上面画线画点。。。但是,这种背景在一个屏幕上只能有一个,而且会占用很大的内存(8位色的会占用8分之3的内存,而16位色的占用8分之6的内存)

DS能够在一个屏幕上显示最大2个选择或放大的背景。实际用的其实不多,提出来只是让你高兴一下。哈哈。

第一个背景教程中,我们将看到如何使用方块背景,你将看到它已经够用了。。。

下面是个关于DS屏幕的图解

DS屏幕大小

再一次介绍Bennyboo制作的DS屏幕图解,很有用。(译:罗嗦)

[attach]31[/attach]

转换


(译:和精灵部分的转换相同,因此跳过)

方块背景

让我们开始使用方块背景吧,它将是你用的最多的。再次罗嗦一遍,每次可以装载4个方块背景,每个背景都有自己的调色板。

请使用PAGfx转化背景。。。

装载


有两种办法可以装载,最简单的和次简单的。。。当然选最简单的先介绍了!

PA_LoadTiledBg

这个函数非常容易使用,不过你必须用PAGfx转化你的背景。。。它的参数如下:PA_LoadTiledBg(screen, background number, background name);

DS每屏幕可以有4个背景,背景编号为0-3。。。最小的编号,最高的优先级(和精灵一摸一样)。。。背景0在背景1之前,依此类推。。。

既然这是第一篇背景的教程,我将粘贴PAlibExamples/backgrounds/LoadBg例子的完整代码如下。。。

// Load a simple background, very easy and simple...

// Includes
#include // Include for PA_Lib

// Converted using PAGfxConverter
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"

// Function: main()
int main(int argc, char ** argv)
{
PA_Init(); // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL

// Load Backgrounds with their palettes !
PA_LoadTiledBg(0, // screen
3, // background number (0-3)
bg0); // Background name, used by PAGfx...
PA_LoadTiledBg(1, 0, bg0);

// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}

return 0;
} // End of main()

真的好简单,在两个屏幕上装载他们的背景和调色板。。。没什么可说的,我想。你也可以看看LoadBgs 例子,它在一个屏幕上装载了4个背景。。。

PA_LoadSimpleBg

此函数用于装载使用gfx2gba转化出来的背景。

PA_LoadSimpleBg(screen,bg_number,bg_Tiles,bg_Map,bg_Size,wraparound,color_mode);

要使用这个函数,我们要根据每个背景下列信息来创建3个文件。

* 方块
* 图
* 调色板

现在我解释一下如何使用gfx2gba转化4个背景,以及如何把他们放到你的代码中。

Gfx2GBA


想象在源文件目录里面,你有另外4个256×256象素的背景文件:BG1.bmp BG2.bmp BG3.bmp BG4.bmp

好的,如果4个背景的颜色能够保存到一个单独的256色调色板里面,那么你必须敲入这个命令来转化他们:

gfx2gba -fsrc -m -pbg.pal -t8 *.bmp

解释一下:

*
-fsrc → 保存文件到.c文件
*
-m → 保存图文件
*
-p*.pal → 保存调色板信息到你指定的文件中
*
-t8 → 方块尺寸信息
*
*.bmp → 要转化的bmp文件(* 是指改目录下所有的bmp文件)


好了,这个命令将为每个背景创建2个文件,方块和图;除此以外,还有一个共用的调色板文件,bg.pal.c。现在我们已经有了我们代码中需要的背景文件。

Including

好了,背景都转好了,下面要include他们:

//Loadign simple BGs wich were no converted with PAGfx

#include
//including all bgs
#include "gfx/BG1.raw.c"
#include "gfx/BG1.map.c"

#include "gfx/BG2.raw.c"
#include "gfx/BG2.map.c"

#include "gfx/BG3.raw.c"
#include "gfx/BG3.map.c"

#include "gfx/BG4.raw.c"
#include "gfx/BG4.map.c"

// including palette

#include "gfx/bg.pal.c

//main function
int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();

PA_LoadPal(PAL_BG0,bg_Palette); //for loading the palette in bg 0

PA_LoadSimpleBg(0,3,BG4_Tiles,BG4_Map,BG_256X256,0,1); // Load BG4 in bg 3
PA_LoadSimpleBg(0,2,BG3_Tiles,BG3_Map,BG_256X256,0,1); // Load BG3 in bg 2
PA_LoadSimpleBg(0,1,BG2_Tiles,BG2_Map,BG_256X256,0,1); // Load BG2 in bg 1
PA_LoadSimpleBg(0,0,BG1_Tiles,BG1_Map,BG_256X256,0,1); // Load BG1 in bg 0

while(1){

PA_WaitForVBL();
}
return 0;
}

这段代码实现了在下屏幕上装载4个背景图。

方块

使用PAlib,仅仅用一些方块你就能创建整个地形。我将演示如何创建一个对话泡泡。(译:漫画里面的人物说话的时候,一般都会有个泡泡,泡泡里面是人物说的话,这个泡泡就是对话泡泡)

假设你有一个背景,8×8方块。编号如下(我以后会加入一个图片)。。。

*
0 = blank,空
*
1 = top,上
*
2 = left,左
*
3 = top-left,左上
*
4 = white square (middle),白色方块(中)

装载它请使用PA_LoadSimpleBg(), 但是需要一点小技巧。

我们回顾一下这个函数的用法:PA_LoadSimpleBg(screen,bg_select,bg_tiles,bg_map,bg_size,wraparound,color_mode)

PA_LoadSimpleBg(1,1,tile_speech_Tiles,Blank,BG_256X256,0,1)

你可能已经注意到了我们没有使用用Blank替代了tile_speech_Map。Blank是个所有索引都为0的图。这样的话,如果你第一个方块是空,那么就不会显示任何东西。

注意:我们使用了1号背景,原因是我们希望能够在0号背景上显示我们的文本,这样组合起来,看上去就像一个对话泡泡了。

现在,使用下面的方法来装载你漂漂的方块。。。

PA_SetMapTileEx(screen, bg_select, x, y, tile_number, hflip, vflip, palette_number)

但是有一件事情你要注意,对于title_number,你不能直接把方块编号放进去。比如放在5号位置的方块可能是3号方块。我们可以通过一个数组来转化位置号和方块编号的对应关系。

tile_speech_Map[index]

这是因为PAGfx对方块坐了优化,这就是你必须使用图的原因,图能够把编号和顺序对应起来。

对于调色板编号赋值为0。hflip和vflip 参数是决定是否翻转图片。

这里是一段可以显示对话泡泡的例子(如果你发现Bug,自己修正吧)

void displaySpeechBubble(bool screen,u8 bg,s16 x1,s16 y1,s16 x2,s16 y2)
{
//load the tiles
PA_LoadSimpleBg(screen,bg,tile_speech_Tiles,Blank,BG_256X256,0,1);

//Load the palette
PA_LoadBgPal(screen,bg,tile_speech_Pal);

//load the corners
PA_SetMapTileEx(screen,bg,x1,y1,tile_speech_Map[3],0,0,0);//top left
PA_SetMapTileEx(screen,bg,x2,y1,tile_speech_Map[3],1,0,0);//top right
PA_SetMapTileEx(screen,bg,x1,y2,tile_speech_Map[3],0,1,0);//bottom left
PA_SetMapTileEx(screen,bg,x2,y2,tile_speech_Map[3],1,1,0);//bottom right

u8 height, length;

//load left and right side
for(height = y1+1; height < y2; height++)
{
PA_SetMapTileEx(screen,bg,x1,height,tile_speech_Map[2],0,0,0);//left
PA_SetMapTileEx(screen,bg,x2,height,tile_speech_Map[2],1,0,0);//right
}

//load top, down, and middle
for(length = x1+1; length < x2; length++)
{
PA_SetMapTileEx(screen,bg,length,y1,tile_speech_Map[1],0,0,0);//top
PA_SetMapTileEx(screen,bg,length,y2,tile_speech_Map[1],0,1,0);//bottom

//load middle
for(height = y1+1; height < y2; height++)
{
PA_SetMapTileEx(screen,bg,length,height,tile_speech_Map[4],0,0,0);//middle
}
}
}

(译:翻译得结巴得很。说实话,自己理解了,但是不知道读者能不能看懂。这个例子对我正好有用。我想做大家来找X,显示结果的时候要在界面上画出方块。真犯愁这个方块如何画呢。补充,花了一点时间,把SpeechBubble的例子做了出来。需要的朋友可以发邮件问我要。)