掌叔
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
我说解释呢