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



掌叔
2008-06-06 15:33:44

摘自:[url]http://chenyi1976.spaces.live.com[/url]
作者:陈轶



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

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

[attach]29[/attach]

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

[code=c]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();
}[/code]

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

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

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

动画

简单动画

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


[attach]30[/attach]

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

[code=c]// 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...[/code]

为什么要装载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%是挺大的开销了。


看看我们例子的代码!

[code=c]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();
}[/code]

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

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

[code=c]if(Pad.Newpress.Right) {
PA_StartSpriteAnim(0, 0, 4, 7, 6);

PA_SetSpriteHflip(0, 0, 0);
}[/code]

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

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

赶快编译一下试试看吧。

(译:待续)