掌叔
2008-06-06 15:30:21
摘自:[url]http://chenyi1976.spaces.live.com[/url]
翻译:陈轶
移动
下面将介绍精灵最重要的部分。。。移动他们!我们将看到两种不同的方法,第一种是使用铁笔,第二种是你一直使用的通用方法。。。
PA_MoveSprite
好了,首先,在PAExamples/Sprites目录下打开MoveSprites例子。因为和之前我们看过的大同小异,这次我们不再粘贴所有的代码。
[code=c]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[/code]
好的,现在,为什么在CreateSprite前面有个for语句?简单来说是因为我们想要创建16个相同的精灵(测试而已)。。。就像你看到的那样,精灵的编号是i!这意味着我们将以编号0到15来创建精灵。最后,你看到X和Y坐标分别是(i<<4)和(i<<3)。简单来说,他们就是i*16和i*8,在数学部分会有一个关于这个的教程。为什么是i*16?因为第一个精灵将会在0,第二个将会在16,依此类推。。。然后我们就会有满屏幕的精灵了,太酷了!(译:作者真是罗嗦啊。)
下面,在主循环中,你需要关注的最重要的代码是:
[code=c]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();
}[/code]
这是基本的主循环,只有一个函数在里面:PA_MoveSprite。。。现在,这个方法不能再简单了:它检查在下屏幕上的每个精灵是否在触控笔的触控之下。。。如果是的话,就把精灵绑定到触控笔上,然后他们就连接起来了。只要你保持触控笔不离开屏幕,精灵就会一直跟随移动。那么为什么要加入循环呢? 因为我们想测试所有的精灵!嗯,好简单。。。
你现在可以编译代码并在你的DS上测试了,因为在DS模拟器DualisR12上跑不起来。。。你将看到简单的代码也能产生非常棒的效果,而且不费力。
PA_SetSpriteXY
PA_SetSpriteXY
下面介绍的可能是精灵相关函数中最重要的一个!!设置精灵的函数。用起来简单而基础:
[code=c]PA_SetSpriteXY(screen, sprite, x, y);[/code]
还能更容易理解吗?你只要给出那个精灵需要移动(屏幕编号和精灵编号)以及新的位置的坐标,然后精灵就会移动到对应地点。只有一件事情是你必须知道的:位置的坐标对应于精灵的左上角。如果你的精灵是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中的代码。。。
我只粘贴出重要的代码:
[code=c]s32 x = 0; s32 y = 0; // sprite position...[/code]
这里有2个变量(我们可以使用结构,如果你知道如何使用的话)将保存精灵的位置。。。
[code=c]x += Pad.Held.Right - Pad.Held.Left;
y += Pad.Held.Down - Pad.Held.Up;[/code]
这是什么?我知道看上去似乎和精灵的移动没有什么关系。最简单的方法应该是象下面这样的:
[code=c]if (Pad.Held.Right) x = x + 1;[/code]
(移动精灵一个象素点)
这里,如果你按了向右按键将会发生什么?Pad.Held.Right的值为1,而且Pad.Held.Left为0,所以
[code=c]x += Pad.Held.Right - Pad.Held.Left; -> x += 1 - 0;[/code]
因此移动了X坐标一个象素点,就像if那一句做的一样。而且还可以处理向左的情况。如果使用if语句的话,那就麻烦很多了!
向上向下的情况也是一样。
现在,让我们看代码的最后一部分:
[code=c]PA_SetSpriteXY(0, // screen
0, // sprite
x, // x position
y); // y...[/code]
就像上面解释的那样,XY坐标已经根据按键进行了更新,我们把精灵移向新的位置。
现在去编译你的代码测试一下吧(甚至在DS模拟器上都可以正常工作...)
希望更深入一点的人可以思考一下如何改变移动的速度?你只要把移动2个象素点而不是1个就可以了。。。
。。。。
时间到!正确答案是:
[code=c]x += (Pad.Held.Right - Pad.Held.Left) * speed;
y += (Pad.Held.Down - Pad.Held.Up) * speed;[/code]
(速度可以是任何值,如果是2的话速度就是2)如果你不相信我,那么测试一下把,把speed变量替换为象素值,你就可以看到移动的更快了。(译:作者真是无微不至到罗嗦啊)
触控笔
检查一下MoveSpriteWithStylus例子,你将会发现更容易理解前面一个例子!基本的,只有一行重要代码(剩下的是精灵装载和显示触控笔的位置)
[code=c]PA_SetSpriteXY(0,0,Stylus.X,Stylus.Y);[/code]
它将编号为0的精灵放到触控笔的位置。。。。我想不出还有什么可说的。
懂得这些以后,我已经有了足够的知识开始我自己的编程。如果你只是开始你的DS开发,那么我建议你跳到下一教程(背景)学习。否则的话,你就继续看如何选择和移动的部分吧。如果你是有经验的程序员,那么欢迎一直阅读到结尾。。。
触控笔
PAlib提供了一个或两个函数来判断一个精灵是否被触控笔接触到。这常用于在游戏或应用中激活某些功能。记住,不管怎样,自己来做这个事情会更快一点,而且更适用于你的游戏,虽然PALib提供的函数更通用。。。
PALib中提供的例子是SpriteTouched。
[code=c]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();
}[/code]
头两行代码是在不同的位置创建精灵。。。和移动精灵的例子一摸一样,不废话了。。。
但是在死循环中有有趣的代码:PA_SpriteTouched(sprite).这个简单的函数在精灵未被点击时返回0,如果被点击了返回1。。。每次检查一个精灵的话这个函数已经足够了,但是我们需要处理8个精灵。因此我加了for循环,以检测编号为0-7的精灵,并显示出被点中的精灵。你可以使用一些其他的代码来替换掉文本输出的那一段,比如spritetouched = i,这将保存住被点中的精灵的编号。。。
没什么可说的了,很简单很基本。希望各位能够看懂。(译:也希望自己的翻译能够被人看懂)
(译:计算了一下,7000多字了,有点成就感了,不过。。。。无人喝彩。)
niubi123
2009-04-17 18:35:18
厉害ialiha
...........................................
t236846681
2009-07-27 17:17:04
铁笔是什么