2012-04-01 116 views
3

我正在製作一個2D側卷軸,對於我的生活我無法跳上班。這就是我正在做的左右移動:在遊戲中跳躍

for(var i = 0; i < time; i++) 
    newVelocityX = (oldVelocityX + accelerationX) * frictionX; 

然後更新我的球員位置我做

位X = oldPositionX + newVelocityX;

這個效果很好,變量「time」只有ms自從我上次運行該函數以來的數量。摩擦效果很好,我很高興它在X方向都很好。這是我在Y方向上的:

for(var i = 0; i < time; i++) { 
    accelerationY += gravityAccelerationY; 
    newVelocityY = oldVelocityY + accelerationY; 
} 

由於重力的緣故,物體掉下來就好了。如果我在用戶點擊向上箭頭時設置了負向加速度Y,那麼我甚至可以讓玩家跳躍,但是在快速計算機上他們跳得很高,而在舊計算機上他們跳得很低。我不知道如何解決這個問題,我認爲我已經通過像我這樣把它放在首字母循環中來解決這個問題。

+0

聽起來好像舊計時器的到期時間和新計時器開始之間存在顯着的時間間隔。當然,在慢速計算機上,這種間隔時間會更長。但這只是一個想法:如果不相關,請不要理會。祝你好運。 – thb 2012-04-01 00:46:22

+1

我們可以看到更多的代碼嗎?比如主遊戲循環? – 2012-04-01 00:54:40

回答

4

您需要做幾件事才能更改您的代碼才能正常工作。您發佈的代碼中有許多錯誤/性能命中。

下面是一些代碼來完成遊戲的基礎知識。對於跳躍

示例代碼:對代碼

velocityX += accelerationX * time; 
velocityX *= Math.pow(frictionX, time); 
positionX += velocityX * time; 

一些評論:

的速度和位置的變量需要保持其值是橫向移動

if (jump) { 
    velocityY = -jumpHeightSquared; // assuming positive Y is downward, and you are jumping upward 
} 
velocityY += gravityAccelerationY * time; 
positionY += velocityY * time; 
if (positionY > 0) { 
    positionY = 0; // assuming the ground is at height 0 
    velocityY = 0; 
} 

示例代碼在幀之間(我假設你已經明白了)。

重力加速度Y和摩擦力X是恆定值,除非重力或摩擦力發生變化。

我在哪裏用* time代替了你的for循環,使用單個乘法會比循環更快。唯一的區別是在低幀率下,或高加速率,加速度似乎應該從原來的「加速」。儘管如此,你不應該有問題。

+0

perfecto,謝謝:) – Macmee 2012-04-01 04:03:59