2012-04-01 6 views
3

私は2d側のスクロールを作っています。私の人生のために、私は仕事に飛びつくことができません。これは私が左右に動いてやっている方法です:ゲームでジャンプする

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

その後、私は

positionX = oldPositionX + newVelocityX行う私のプレーヤーの位置を更新します。

これはうまく動作します。変数 "time"には、最後に関数を実行してからの経過時間があります。摩擦はすごくうまくいき、X方向にはいいですね。これは私がY方向に持っているものです:

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

オブジェクトは重力のためうまく落ちます。ユーザーが上向き矢印を押したときに負の加速を設定すると、プレーヤーをジャンプさせることさえできますが、高速コンピュータでは非常に高くジャンプし、古いコンピュータでは非常に低くジャンプします。私はこれをどのように修正するのか分からない、私はすでに私がしたようにそれを貧しいループに入れて、これを説明していると思った。

+0

古いタイマーの期限切れと新しいタイマーの開始との間にかなりの間隔があるかのように聞こえます。もちろん、遅いコンピュータでは、このような間隔は長くなります。しかし、これは単なる考えです:無関係なら無視してください。がんばろう。 – thb

+1

さらにコードを見ることができますか?メインゲームのループなど? –

答えて

4

コードを正しく変更するには、いくつかのことを行う必要があります。あなたが投稿したコードには多数のバグ/パフォーマンスヒットがあります。

ここに、ゲームの基本を行うためのコードがあります。ジャンプのための

サンプルコード:

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; 
} 

横に移動するためのサンプルコード:

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

コードのいくつかのコメント:速度および位置変数はその値を維持する必要があります

フレームの間に(私はあなたがそれを把握していると仮定しています)。

gravityAccelerationYとfrictionXは、重力または摩擦が変化しない限り、一定の値です。

ここではforループを* timeに置き換えましたが、1回の乗算を使用する方がループよりも高速です。唯一の違いは、フレームレートが低い場合、または加速度が高いスピードである場合に、加速度がそのスピードよりも速くなるように見える場合です。あなたはそれに問題はないはずです。

+0

perfecto、thanks :) – Macmee

関連する問題