NDS开发Wiki翻译:第六天:设备相关的运算(2)



掌叔
2008-06-06 16:07:02

摘自:chenyi1976.spaces.live.com
翻译:陈轶

使用重力(实现跳跃等效果)

请务必已经读过定点数教学部分。。。代码很简单,你可以用于任何类型的游戏。。。你必须懂得一些定点数的运算,否则可能看不懂下面的东东。

"重力"的代码非常不错,因为它可以用在很多的游戏中,特别是类似于超级马里奥那种。。。它有一个基本原则:你的精灵(或马里奥或玩家或任何东西)有垂直速度的时候,"重力"代码能够给予这个速度以加速度。下面有3件事情:

* 每次转身,速度根据它的加速度进行变化
* 每次转身,精灵的位置根据它的速度而变化
* 任何时候,如果你的精灵碰到地面(或在地面以下),它应该放到地面上来,并且速度应该归零。。。。

因为速度和加速度有很多值,我们也不希望给它们增加限制,我们将使用定点数。。。这就是你为什么要使用移位操作的原因(«8和»8这种操作 )。这个例子是演示一个小飞船上升,下降。你能够改变重力和启动力(相当于跳跃)来看看飞船的不同效果。

#define FLOOR (160<<8) // Floor y level

int main(void){

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

PA_InitText(1, 0);

PA_OutputText(1, 2, 4, "Press A to take off !");
PA_OutputText(1, 2, 5, "Gravity change : Left/Right");
PA_OutputText(1, 2, 7, "Takeoff Speed change : Up/Down");

PA_LoadSpritePal(0, 0, (void*)sprite0_Pal)

PA_CreateSprite(0, 0, (void*)vaisseau_Sprite, OBJ_SIZE_32X32, 1, 0, 50, 50);


s32 gravity = 32; // change the gravity and check the result :)
s32 velocity_y = 0;
s32 spritey = FLOOR; // at the bottom
s32 takeoffspeed = 1000; // Takeoff speed...

while(1) // Infinite loops
{

takeoffspeed += (Pad.Held.Up - Pad.Held.Down)*8; // Change takeoff speed...
gravity += (Pad.Held.Right - Pad.Held.Left)*2; // Change gravity speed...

PA_OutputText(1, 4, 8, "Takeoff speed : %d ", takeoffspeed);
PA_OutputText(1, 4, 6, "Gravity : %d ", gravity);

if((spritey <= FLOOR) && Pad.Newpress.A) { // You can jump if not in the air...
velocity_y = -takeoffspeed; // Change the base speed to see the result...
}

// Moves all the time...
velocity_y += gravity; // Gravity...
spritey += velocity_y; // Speed...

if(spritey >= FLOOR) // Gets to the floor !
{
velocity_y = 0;
spritey = FLOOR;
}

PA_OutputText(1, 0, 0, "Y : %d
VY : %d ", spritey, velocity_y);

if (spritey>>8 > -32) PA_SetSpriteY(0, 0, spritey>>8); // show if on screen
else PA_SetSpriteY(0, 0, 192);

PA_WaitForVBL();
}

return 0;
}

下面解释一下:

* #define FLOOR (160«8)


lichaoyiren
2010-01-13 11:44:44

我说解释呢