存档

文章标签 ‘palib’

NDS开发Wifi翻译:第四天:精灵(5)

2006年6月19日 没有评论




帧是什么?帧能帮助你使一个精灵以复杂的方式动起来,获得生命!我很快将会谈到精灵动画,因为帧非常容易使用,但也非常灵活。。。掌握他们需要一点时间。

第一件事情:如果你想要使用帧,你必须在转化的时候把所有的帧放到一个单张图片中,并且每张图都是头顶着脚放置。就象这个图。

http://www.palib.info/wiki/lib/exe/fetch.php?cache=cache&media=http%3A%2F%2Fwww.palib.info%2FScreens%2Fframes.png

这就是动画的秘密。。。这个例子不会显示任何动画,但是会显示更通用的做法:根据用户的按键来更新图片。。。。在这个例子中,精灵会往你按键的方向看,就象他们获得了生命一样!

PA_CreateSprite(0, 0,(void*)frames_Sprite, OBJ_SIZE_16X32,1, 0, 128-16, 64);

while(1)

{

if (Pad.Held.Up) PA_SetSpriteAnim(0, 0, 0); // screen, sprite, frame

if (Pad.Held.Down) PA_SetSpriteAnim(0, 0, 2); // screen, sprite, frame

if (Pad.Held.Left) PA_SetSpriteAnim(0, 0, 3); // screen, sprite, frame

if (Pad.Held.Right) PA_SetSpriteAnim(0, 0, 1); // screen, sprite, frame

PA_WaitForVBL();

}

如你所见,精灵的创建和普通精灵一样!很酷。。。。然后,看看使帧变化的代码吧,PA_SetSpriteAnim(screen, sprite, frame number);.就是这个函数!在此代码中,帧根据按键来变化,以使精灵看上去总是朝向你按键的方向。。。

没有什么要说的了,让我们去看看精灵的动画!

Oh,继续之前有件事你必须知道。。。改变精灵的帧意味着将一张新图片拷贝覆盖了旧图片。这意味着需要时间来更新它。如果你同时有很多帧需要更新,那么游戏就会拖慢。。。

动画


简单动画

简单的动画变得非常容易。。。现在,你只需要装载一个精灵,告诉PAlib让它动起来,从一个帧到另一个帧,他会自动地循环。就像帧的处理一样,你也需要把动画所有的图片全部放到一个精灵文件中,头顶着脚。下面就是例子里使用的图像:

http://www.palib.info/wiki/lib/exe/fetch.php?cache=cache&media=http%3A%2F%2Fwww.palib.info%2FScreens%2Fexplosion.png

我将贴出代码中有趣的部分:

// Load the sprite palette,

PA_LoadSpritePal(0, // Screen

0, // Palette number

(void*)explosion_Pal); // Palette name

// Here, we’ll load a few similar sprites sprite to animate… at different speed

PA_CreateSprite(0, 0,(void*)explosion_Sprite, OBJ_SIZE_64X64,1, 0, 0, 64);

PA_CreateSprite(0, 1,(void*)explosion_Sprite, OBJ_SIZE_64X64,1, 0, 64, 64);

PA_CreateSprite(0, 2,(void*)explosion_Sprite, OBJ_SIZE_64X64,1, 0, 128, 64);

PA_CreateSprite(0, 3,(void*)explosion_Sprite, OBJ_SIZE_64X64,1, 0, 196, 64);

// Start the animation. Once started, it works on its own !

PA_StartSpriteAnim(0, // screen

0, // sprite number

0, // first frame is 0

6, // last frame is 6, since we have 7 frames…

5); // Speed, set to 5 frames per second

PA_StartSpriteAnim(0, 1, 0, 6, 15); // for the second one, speed of 15 fps…

PA_StartSpriteAnim(0, 2, 0, 6, 30); // for the third one, speed of 30 fps…

PA_StartSpriteAnim(0, 3, 0, 6, 60); // for the last one, speed of 60 fps…

为什么要装载4个精灵?因为我想演示4种不同的动画速度。。。。就如你看到的一样,装载精灵和以前并没有不同。。。下面是PA_StartSpriteAnim(screen, sprite, first frame, last frame (included !), speed (in fps)) 函数。一旦装载,它将会使精灵以你要求的方式动起来,按照你给定的速度。你可以使用PA_StopSpriteAnim(screen, sprite) to stop it, or PA_PauseSpriteAnim(screen, sprite, pause (1 to pause, 0 to unpause)) 来暂停/继续动画。。。

编译并在DS上华丽地测试吧!

复杂的动画


第二个动画例子和教程并不比第一个使用更多的函数,只是展示一下如何让他们看起来更好。。。欢迎SpriteAnim2例子。。。

图像和第一个例子很相象,但是拥有更多的帧,能够移动!请看一下例子的source/gfx 目录。你会看到精灵有一些上下左右的动画。。。等等,没有左!为什么?因为向左的动作只要用向右的动作翻转一下就可以了。。。直接用向右的图片来达到向左的效果,可以节省空间。。。25%。。。考虑到主要是图像占用DS的内存,25%是挺大的开销了。

http://www.palib.info/wiki/lib/exe/fetch.php?cache=cache&media=http%3A%2F%2Fwww.palib.info%2FScreens%2Fsom.png

看看我们例子的代码!

while(1)

{

// Animation code…

if(Pad.Newpress.Up) PA_StartSpriteAnim(0, 0, 0, 3, 6);

if(Pad.Newpress.Down) PA_StartSpriteAnim(0, 0, 8, 11, 6);

if(Pad.Newpress.Right) {

PA_StartSpriteAnim(0, 0, 4, 7, 6); PA_SetSpriteHflip(0, 0, 0);

}

if(Pad.Newpress.Left) {

PA_StartSpriteAnim(0, 0, 4, 7, 6);

PA_SetSpriteHflip(0, 0, 1);

}

if(!((Pad.Held.Left)||(Pad.Held.Up)||(Pad.Held.Down)||(Pad.Held.Right))) PA_SpriteAnimPause(0, 0, 1);

// Moving Code

y += Pad.Held.Down – Pad.Held.Up;

x += Pad.Held.Right – Pad.Held.Left;

PA_SetSpriteXY(0, 0, x, y);

PA_WaitForVBL();

}

精灵的装载和普通精灵一样,我就不废话了。(译:难得)

if(Pad.Newpress.Up) PA_StartSpriteAnim(0, 0, 0, 3, 6); 这句话是说当向上键按下时从第0帧到第3帧播放动画。。。FPS真的好低:每秒6帧!为什么?因为动画只有很少的帧,所以如果以高FPS播放的话动画很快就结束了。代码还不完美,所以如果你同时按住几个方向键,那么它还不能正确地显示,这里只是为了简单起见。。。如果你看不惯,你可以试着自己搞搞

if(Pad.Newpress.Right) {

PA_StartSpriteAnim(0, 0, 4, 7, 6);

PA_SetSpriteHflip(0, 0, 0);

}

这部分和上下键的处理不一样,因为它需要检查左右键以决定是否需要翻转图片(记住,这是节省DS空间必须付出的小小代价)。

我不在详细解释精灵移动的代码,我们之前在移动精灵的教程中已经就此废话过了。

赶快编译一下试试看吧。

(译:待续)

原创的话痨如需转载请注明来源:http://blog.chenyi.me/blog/9241;转载的文章我会力所能及地注明来源如有疏漏请留言指正。

文章的脚注信息由WordPress的wp-posturl插件自动生成

分类: 未分类 标签: ,

NDS开发Wifi翻译:第四天:精灵(4)

2006年6月18日 没有评论

旋转和缩放


接下来的是另一个重要的教程,旋转和缩放(旋缩)!就像我以前说过的那样,精灵可以任意选择缩放,但是有一个小小的限制:尽管所有的精灵都可以旋转,但是同一屏幕上同时只允许32种方式。。。那么在只有32种方式的情况下,精灵们是如何旋转的呢?因为精灵的最大允许个数大于旋缩的的允许个数,那么有一些精灵将不得不有着同样的旋缩方式。想象你有一个宇宙飞船,能够在空中盘旋,并由多个部分组成(假设2个精灵作为飞船的翅膀,一个作为飞船的身体,一个作为驾驶舱,一个作为武器。。。),他们需要一起旋转和放大,否则就会看上去散架了。这种情况就是多个精灵共享一种旋缩方式。

在PALIB例子里面有3个关于旋缩的例子:旋转,缩放,旋缩,他们使用了不同的函数,一个仅用了旋转,一个仅用了缩放,最后一个既使用了旋转又使用了缩放。。。

旋转

我们以旋转的例子开始学习。。。例子名称是Sprite_Rotation,我把有趣的部分粘贴到下面:

// Activate rotations for that sprite

PA_SetSpriteRotEnable(0,// screen

0,// sprite number

0);// rotset number. You have 32 rotsets (0-31) per screen. 2 sprites with*

// *the same rotset will be zoomed/rotated the same way…

u16 angle = 0; // Rotation angle…

while(1)

{

++angle; // change the angle

angle &= 511; // limit the range to 0-511. works only with 1, 3, 7, 15, 31, etc… (2^n – 1)

// Fast function for rotations without zoom…

PA_SetRotsetNoZoom(0, //screen

0, // rotset

angle); // angle, from 0 to 511

PA_WaitForVBL(); // Synch

}

(译:无人喝彩,我失去热情了,那我就挑自己感兴趣的人译吧,这里跳过一大段)

精灵翻转


精灵翻转在DS上非常简单,尽管看上去它应该是一个小型项目,我将显示这做起来多么简单。。。我将在下一版本中加入一个例子(Sprite/Flips)

有2个翻转精灵的函数:

  • PA_SetSpriteHflip(screen, sprite, 1/0 for yes/no), 水平翻转 (left/right)
  • PA_SetSpriteVflip(screen, sprite, 1/0 for yes/no), 垂直翻转(up/down)

这对你来说就非常简单了!1设置翻转,0去掉翻转,就这么简单。你能做到水平翻转,垂直翻转,或两者结合。

那么,什么时候我们要用到翻转?假设你在编一个格斗游戏。。。。比如双截龙那样的游戏。你要实现一个小人向左看,向右看。那么你有两种方法来实现:

  • 做两个图像,一个是向左,一个向右,然后在代码里面换来换去,好辛苦,而且难以扩展新功能。。。
  • 使用翻转功能,简单而快速。

哪个是简单的解决方案?

马赛克效果


马赛克效果很容易使用,但我并不很喜欢。举个例子,它在超级马里奥中被使用过,它通过用一个正方形替换一个象素点的方式来改变了精灵的样子。有什么好处呢?它能用于精灵的过渡效果,一种模糊效果,等等。。。但就像我说的一样,我不喜欢它也从不用它。

请关注下一版本中将会退出的马赛克精灵的例子。

不管怎样,DS和PAlib已经提供了非常简单的函数用来生成马赛克效果:PA_SetSpriteMosaic(Screen, Sprite, Mosaic on/off (1/0));.

(译:跳过一段)

透明效果


透明,或称之为Alpha混合,是非常棒的游戏效果。看上去很棒,专业,实际上又不费事。

PAlib使用DS的硬件来做到这一点,但是有一个重要的限制:尽管你可以设置任何精灵的透明效果,但是所有精灵的透明度都必须是一样的。。。所以你无法让一个精灵半透明,同时让另一个精灵完全透明。。。他们只能拥有一样的透明度。。。

代码很容易理解,你可以找到AlphaBlending例子:

PA_SetSpriteMode(0, // Screen

0, // Sprite

1); // Alphablending

s16 alpha = 7; // Transparency level

// Enable the alpha-blending

PA_EnableSpecialFx(0, // Screen

SFX_ALPHA, // Alpha blending mode

0, // Nothing

SFX_BG0 | SFX_BG1 | SFX_BG2 | SFX_BG3 | SFX_BD); // Everything normal

while(1) // Infinite loops

{

alpha += Pad.Newpress.Up – Pad.Newpress.Down;

PA_SetSFXAlpha(0, // Screen

alpha, // Alpha level, 0-15

15); // Leave this to 15

PA_WaitForVBL();

}

精灵和任何普通精灵一样被创建,但它的透明特性通过PA_SetSpriteMode(screen, sprite, mode)函数已经激活,如果你看一下帮助文档,可以发现其实有很多种模式,但是现在只要记住0就是没有透明,而1就是透明。。。

光激活精灵的透明特性还不够。你首先需要激活DS的特效系统,设置它为透明模式。。。PA_EnableSpecialFx(Screen, SFX_ALPHA (Alpha blending mode), 0 (leave to 0 for now), SFX_BG0 | SFX_BG1 | SFX_BG2 | SFX_BG3 | SFX_BD)。。。长长的列表包含了除了精灵以外所有的东西,不要担心,有一天你会理解这些参数的含义的。。。

PA_SetSFXAlpha(screen, alpha level (0-15), normal level (leave to 15)); 是最后一个重要的函数(例子里面可以通过上下键来调整透明度),这个函数是用来设置透明度的。。。编译这个例子,然后看看按上下键会对精灵的透明度产生什么样的效果吧。。。
(译:待续,感觉翻译是个不错的看书的习惯,我小时候看书留下的怀习惯导致我看书的跳跃性非常强,应该很容易漏掉一些东西,翻译工作强迫我自己一字一句地看过去。非常好。)

原创的话痨如需转载请注明来源:http://blog.chenyi.me/blog/9238;转载的文章我会力所能及地注明来源如有疏漏请留言指正。

文章的脚注信息由WordPress的wp-posturl插件自动生成

分类: 未分类 标签: ,

NDS开发Wifi翻译:第四天:精灵(3)

2006年6月18日 没有评论

移动


下面将介绍精灵最重要的部分。。。移动他们!我们将看到两种不同的方法,第一种是使用铁笔,第二种是你一直使用的通用方法。。。

PA_MoveSprite

好了,首先,在PAExamples/Sprites目录下打开MoveSprites例子。因为和之前我们看过的大同小异,这次我们不再粘贴所有的代码。

for (i = 0; i < 16; i++) PA_CreateSprite(0, i,(void*)vaisseau_Bitmap, OBJ_SIZE_32X32,1, 0, i << 4, i << 3);
// This loads sprites a bit everywhere

好的,现在,为什么在CreateSprite前面有个for语句?简单来说是因为我们想要创建16个相同的精灵(测试而已)。。。就像你看到的那样,精灵的编号是i!这意味着我们将以编号0到15来创建精灵。最后,你看到X和Y坐标分别是(i<<4)和(i<<3)。简单来说,他们就是i*16和i*8,在数学部分会有一个关于这个的教程。为什么是i*16?因为第一个精灵将会在0,第二个将会在16,依此类推。。。然后我们就会有满屏幕的精灵了,太酷了!(译:作者真是罗嗦啊。)

下面,在主循环中,你需要关注的最重要的代码是:

while(1)
{

// Use the MoveSprite function on all sprites…
for (i = 0; i < 16; i++) PA_MoveSprite(i);
// The MoveSprite function checks if you are touching a sprite, and moves it around if*
// *you are… Pretty nice if you have multiple sprites around

PA_WaitForVBL();
}

这是基本的主循环,只有一个函数在里面:PA_MoveSprite。。。现在,这个方法不能再简单了:它检查在下屏幕上的每个精灵是否在触控笔的触控之下。。。如果是的话,就把精灵绑定到触控笔上,然后他们就连接起来了。只要你保持触控笔不离开屏幕,精灵就会一直跟随移动。那么为什么要加入循环呢? 因为我们想测试所有的精灵!嗯,好简单。。。

你现在可以编译代码并在你的DS上测试了,因为在DS模拟器DualisR12上跑不起来。。。你将看到简单的代码也能产生非常棒的效果,而且不费力。

PA_SetSpriteXY

PA_SetSpriteXY

下面介绍的可能是精灵相关函数中最重要的一个!!设置精灵的函数。用起来简单而基础:

PA_SetSpriteXY(screen, sprite, x, y);

还能更容易理解吗?你只要给出那个精灵需要移动(屏幕编号和精灵编号)以及新的位置的坐标,然后精灵就会移动到对应地点。只有一件事情是你必须知道的:位置的坐标对应于精灵的左上角。如果你的精灵是32×32大小,你需要设置你的坐标为(x-16,y-16)以使它居中于(x,y)坐标点。

另外一点,你也可以使用PA_SetSpriteX和PA_SetSpriteY,如果你仅仅希望纵向或横向移动。更快。。。

X和Y坐标的限制

可以使用这两个函数PA_GetSpriteX(screen, sprite)和PA_GetSpriteY(screen, sprite) 来获得精灵的坐标。。。你将会注意到X的范围始终在0-511,而Y的范围则是0-255,这是硬件的限制。。。因为这个原因,如果你移动精灵时,设置的坐标超过这一范围,那么精灵将被卷屏回来。一个处于X=512位置的精灵实际的位置是在X=0,Y轴也一样,只是范围更小。

按键

现在,你知道如何使用这些函数了,下面看到的第一件事情是如何使用DS的十字键移动精灵!现在,让我们检查PAExamples/Sprites/MoveSpritewithKeys中的代码。。。

我只粘贴出重要的代码:

s32 x = 0; s32 y = 0; // sprite position…

这里有2个变量(我们可以使用结构,如果你知道如何使用的话)将保存精灵的位置。。。

x += Pad.Held.Right – Pad.Held.Left;
y += Pad.Held.Down – Pad.Held.Up;

这是什么?我知道看上去似乎和精灵的移动没有什么关系。最简单的方法应该是象下面这样的:

if (Pad.Held.Right) x = x + 1;

(移动精灵一个象素点)

这里,如果你按了向右按键将会发生什么?Pad.Held.Right的值为1,而且Pad.Held.Left为0,所以

x += Pad.Held.Right – Pad.Held.Left; -> x += 10;

因此移动了X坐标一个象素点,就像if那一句做的一样。而且还可以处理向左的情况。如果使用if语句的话,那就麻烦很多了!

向上向下的情况也是一样。

现在,让我们看代码的最后一部分:

PA_SetSpriteXY(0, // screen
0, // sprite
x, // x position
y); // y…

就像上面解释的那样,XY坐标已经根据按键进行了更新,我们把精灵移向新的位置。

现在去编译你的代码测试一下吧(甚至在DS模拟器上都可以正常工作…)

希望更深入一点的人可以思考一下如何改变移动的速度?你只要把移动2个象素点而不是1个就可以了。。。

。。。。

时间到!正确答案是:

x += (Pad.Held.Right – Pad.Held.Left) * speed;
y += (Pad.Held.Down – Pad.Held.Up) * speed;

(速度可以是任何值,如果是2的话速度就是2)如果你不相信我,那么测试一下把,把speed变量替换为象素值,你就可以看到移动的更快了。(译:作者真是无微不至到罗嗦啊)

触控笔


检查一下MoveSpriteWithStylus例子,你将会发现更容易理解前面一个例子!基本的,只有一行重要代码(剩下的是精灵装载和显示触控笔的位置)

PA_SetSpriteXY(0,0,Stylus.X,Stylus.Y);

它将编号为0的精灵放到触控笔的位置。。。。我想不出还有什么可说的。

懂得这些以后,我已经有了足够的知识开始我自己的编程。如果你只是开始你的DS开发,那么我建议你跳到下一教程(背景)学习。否则的话,你就继续看如何选择和移动的部分吧。如果你是有经验的程序员,那么欢迎一直阅读到结尾。。。

触控笔


PAlib提供了一个或两个函数来判断一个精灵是否被触控笔接触到。这常用于在游戏或应用中激活某些功能。记住,不管怎样,自己来做这个事情会更快一点,而且更适用于你的游戏,虽然PALib提供的函数更通用。。。

PALib中提供的例子是SpriteTouched。

u8 i = 0;
for (i = 0; i < 8; i++) PA_CreateSprite(0, i,(void*)mollusk_Sprite, OBJ_SIZE_32X32,1, 0, i << 5, i << 4);

PA_OutputSimpleText(1, 0, 10, "Please touch a sprite");

while(1)
{
// Now we’ll test every sprite to see if we touch it…
for (i = 0; i < 8; i++) {
if (PA_SpriteTouched(i)) PA_OutputText(1, 0, 15, "Sprite %d ", i);
// If we touch the sprite, returns 1…
}

PA_WaitForVBL();
}

头两行代码是在不同的位置创建精灵。。。和移动精灵的例子一摸一样,不废话了。。。

但是在死循环中有有趣的代码:PA_SpriteTouched(sprite).这个简单的函数在精灵未被点击时返回0,如果被点击了返回1。。。每次检查一个精灵的话这个函数已经足够了,但是我们需要处理8个精灵。因此我加了for循环,以检测编号为0-7的精灵,并显示出被点中的精灵。你可以使用一些其他的代码来替换掉文本输出的那一段,比如spritetouched = i,这将保存住被点中的精灵的编号。。。

没什么可说的了,很简单很基本。希望各位能够看懂。(译:也希望自己的翻译能够被人看懂)

(译:计算了一下,7000多字了,有点成就感了,不过。。。。无人喝彩。)

原创的话痨如需转载请注明来源:http://blog.chenyi.me/blog/9237;转载的文章我会力所能及地注明来源如有疏漏请留言指正。

文章的脚注信息由WordPress的wp-posturl插件自动生成

分类: 未分类 标签: ,

NDS开发Wifi翻译:第四天:精灵(2)

2006年6月17日 没有评论

使用PAGfx转化


想知道Cool一点的消息吗?如果精灵能被直接使用到DS上,而不用任何修改。。。抱歉让你失望了,停止白日梦吧。这就是我要介绍的,你将看到如何转化一个精灵到DS的格式,并不是很复杂。。。

我们将要使用的使用的是PAGfx,由Mollusk和Kleevah创建的转换工具,用起来再简单不过了。有2种方法使用它,一种给初学者通过GUI界面使用,另一种给高级用户的,只有一个PAGfx.ini文件。两种用法的结果是一样的,不用担心。

PAGfx的GUI界面


第一件事情,进入PAlib/Tools目录,可以看到PAGfx目录。里面有4个文件。

  • PAGfx.txt,一个使用说明和更新日志,既然你在看我的指南,因此你压根用不上这个。
  • PAGfx.ini,转化用的ini文件,我将在第二部分进行分析。
  • PAGfx.exe,根据ini文件转化你的精灵,你稍后将看到如何操作。
  • PAGC Frontend.exe,工具的GUI界面,请马上打开它。

如果出现了出错提示,那是因为你没有安装.net框架,请下载
现在,打开GUI工具,看到界面如下:

http://www.palib.info/wiki/lib/exe/fetch.php?w=&h=&cache=cache&media=http%3A%2F%2Fwww.palib.info%2FScreens%2FPAGC1.png

下面就是设置背景色,添加精灵文件,然后转化。(译:使用过程中可能出现异常,我换几个bmp文件试试,结果又好了)

你可以看到转化后产生如下文件:

  • SpriteName.c是包含全部精灵信息的文件,将被用于将精灵调入内存。
  • SpriteName.pal.c包含着调色板,有它你就能使用正确的颜色将精灵调入内存。
  • all_gfx.c是个很酷的文件。它实际上是链接了所有的精灵,背景,调色板。
  • all_gfx.h包含了精灵的数据,后面会提到

PAGfx.ini


对那些好奇的人们,你现在可以检查一下由GUI工具创建的PAGfx.ini。。。如果你只想用GUI工具,那么请跳过此节

(译:因为我只想用GUI工具,因此我跳过,见谅。)

PAlib精灵


我们深入浅出地学习,先试试把基本的精灵显示到屏幕上来看看。后面的教程会继续教你如何旋转和放大精灵,设置透明度和动画。保持耐心。

显示


我们最终真正使用DS硬件的时机来啦!嘎嘎嘎!我好邪恶!下面欢迎显示精灵教程登场。。。

下面的例子是重PAlib 0.72a版本中提取,因为我在这个版本中更新了精灵。。。请在开始之前确保安装了这个或更高的版本,否则就玩不转了。

打开PAlibExamples/Sprites/Sprite目录,并看一下main.c的代码:

#include <PA9.h>
// PAGfxConverter Include
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"
int main(void){

        PA_Init(); //PAlib inits
        PA_InitVBL();

        PA_LoadSpritePal(0, // Screen
0, // Palette number
(void*)sprite0_Pal);        // Palette name

        PA_CreateSprite(0, // Screen
0, // Sprite number
(void*)vaisseau_Sprite, // Sprite name
                        OBJ_SIZE_32X32, // Sprite size
1, // 256 color mode
0, // Sprite palette number
50, 50); // X and Y position on the screen
while(1) // Infinite loops
{
                PA_WaitForVBL();
        }
return 0;
}

入你所见,看看注释就明白了!我也不想重新介绍第一天已经介绍的东西(请复习模板编码的部分),因此假设你已经明白了。

// PAGfxConverter Include
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"

这一部分include你已经转化完成的图像,没什么可说的了(你可以看看这个gfx/目录里面都有些什么)

PA_LoadSpritePal(0, // Screen
0, // Palette number
(void*)sprite0_Pal);        // Palette name

这部分很重要:它装载了精灵!它把精灵调色板加载到0号屏幕(下屏幕)的0号调色板上。。。不要管在调色板名称前的(void*)字样,它仅仅用于指定调色板的位置。。。如果你的精灵显示不出来,那么首先就要看看是不是忘了调色板!而且,请注意调色板号不要搞错了(要知道一共有16个调色板呢)

PA_CreateSprite(0, // Screen
0, // Sprite number
(void*)vaisseau_Sprite, // Sprite name
                OBJ_SIZE_32X32, // Sprite size
1, // 256 color mode
0, // Sprite palette number
50, 50); // X and Y position on the screen

这个例子真是非常简单,让我一项一项解释一下。

  • 第一个参数是0号屏幕(下屏幕)。。。如果你试图在上屏幕装载精灵,它不会被显示出来,为什么呢?因为调色板是装载在下屏幕的!
  • 第二个参数是精灵编号,就象前文所说,DS在一个屏幕上可以显示128个精灵,编号从0到127。每个你创造的精灵,你都可以制定它的编号,有了编号,我们就能找到对应的精灵从而对它进行各种处理。编号的作用不止如此,它还决定了精灵之间的前后关系(0号精灵将遮住其他所有精灵,1号精灵能遮住0号以外的其他所有精灵,依次类推),越小的编号越在前。
  • 下面是对象大小,它由长和宽组成,用起来有点复杂,因此PALib定义了一些宏来方便使用(以OBJ_SIZE开头)。。。如果不清楚有哪些尺寸可用,请翻到这个教程的开头。。。
  • 下面是颜色模式。只有2个值可选:0为16色,1为256色。实际上只用256色。
  • 下面是调色板编号。例子里面是0。。。如果你选择了错误的调色板编号,那么你会看到你的精灵的颜色是多么地漂亮(使用了其他的调色板)或者压根看不到精灵(选中了没有加载的调色板)。使用的时候请多注意。
  • 下面是X坐标,Y坐标。精灵的左上角的坐标。

基本上所有的东西都已经理解了吧!那么让我们运行build.bat,并打开DS或DS模拟器。。。。因为你的死循环 (while(1)…) 里面没有任何代码(除了VBL以外),你的精灵将会呆在那里动也不动。

在进行下一步之前,你可以试试修改一下例子,让精灵出现在上屏幕,然后出现在上下双屏幕上。。。

(译:待续。。。)

原创的话痨如需转载请注明来源:http://blog.chenyi.me/blog/9235;转载的文章我会力所能及地注明来源如有疏漏请留言指正。

文章的脚注信息由WordPress的wp-posturl插件自动生成

分类: 编程 标签: ,

NDS开发Wifi翻译:第四天:精灵(1)

2006年6月16日 没有评论

这里将介绍如何使用PALib显示精灵(译者注:精灵指把画面可以移动的物品,把画面分割成多个精灵有利于设置互动)

DS精灵说明


在开始使用精灵之前,让我们看看DS适合做什么事情。。。他能在一屏上显示128个不同的精灵,上下屏加一起就是256个!每个精灵可以被水平或垂直翻转,能够被到处移动,能动画化(通过更换精灵的图片来做到),能半透明,甚至能够变成mosaic(译:不懂)!在以上的基础上,精灵们还可以被旋转或缩放!但是,有点小小的限制。。。。你不能对每个精灵单独指定旋转和缩放参数,在同一屏幕上只允许定义32种旋转和缩放(以下简称旋缩)参数。那么每个精灵可以旋转、缩放、或者边旋转边缩放,但是同时只能有32种不同的方式。几个精灵可以分享有个旋缩方式,这不是问题,他们将以同样的方式进行选择和缩放。

DS屏幕尺寸


这里有一个bennnyboo做的不错的小图,蛮有用的。。。不管是对精灵而言,对背景和其他一切都有用。

http://www.palib.info/wiki/lib/exe/fetch.php?w=&h=&cache=cache&media=http%3A%2F%2Fwww.palib.info%2FScreens%2FDS%2Fds_screen.jpg

既然要讲精灵,就需要知道屏幕的尺寸。。。256象素快,192象素高。注意第一个点的编号不是1而是0,屏幕实际为1-255和0-191。。。就像图上显示的那样。

提一句,精灵的位置被限制在一定的值以内。X坐标范围为0-511,而Y坐标范围为0-255。这意味着如果精灵的X坐标为512,那么等同于把把这精灵放到X坐标为0的地方。这就是所谓的卷屏。当坐标到到最大值时,它就跑到另一边了,反之亦然。

颜色模式


现在,关注一下颜色问题。。。精灵能够有3种不同的颜色模式

  • 16色调色板,每屏幕可显示16种调色板。(译:实际可显示的颜色为16×16=256色)
  • 256色(不错,但需要使用双倍的内存),每屏幕可显示16种调色板。(译:实际可显示的颜色为256×16色),这是最常用的模式。。。。
  • 16位色的精灵,没有调色板!而且这些精灵不能使用太多,因为它们占用了太多的内存了。

总结一下,最好的方式就是256色,虽然看起来有点少,实际上效果还不赖。

精灵的尺寸


DS能处理不同尺寸的精灵,但是实际支持的精灵尺寸是并不能随心所欲。尺寸允许的宽度和高度为8,16,32,64。某些特定的尺寸还不支持,具体看下面的表格。(横里面是宽度,竖里面是高度)

8 16 32 64
8 8×8 16×8 32×8
16 8×16 16×16 32×16
32 8×32 16×32 32×32 64×32
64 32×64 64×64

那么,如果用了不允许的尺寸会发生什么呢?你会看到丑到不能看的精灵。。。有个简单的方法可以规避这些限制。加入你希望使用48×48的精灵,那你就把它的尺寸设为64×64好了。

透明色


我想你不会希望精灵的背景色也被显示出来。。。如果你有一个圆圆的精灵,好像飞盘,你肯定不会希望把方方的边框一起显示出来。为了把背景去掉,就要用到背景色了。最好的背景色是洋红色(红: 255, 绿 : 0,蓝 : 255),因为你很少会用到这种颜色,有人喜欢用黑色,但是我经常在做一些黑色的精灵,我还没有找到比洋红色更好的选择呢。。。

(译:待续。。。。)

原创的话痨如需转载请注明来源:http://blog.chenyi.me/blog/9234;转载的文章我会力所能及地注明来源如有疏漏请留言指正。

文章的脚注信息由WordPress的wp-posturl插件自动生成

分类: 编程 标签: ,