首页 > 未分类 > NDS开发Wifi翻译:第四天:精灵(5)

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插件自动生成

分类: 未分类 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.