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

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

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