2012-04-15 4 views
2

"自転車"リスト内のオブジェクトの1つがboolean isBoostingを含む場合、drawLine()を高速に実行しようとしています。リストに2つの自転車が含まれていて、その結果、いずれかの自転車がisBoostingのときに両方の自転車がスピードアップするように見える場合。なぜ誰かが考えを持っていますか?オブジェクトにisBoostingの値trueが含まれていない場合、スレッドの「移動」は遅くしてはいけませんか?異なるThread.sleep()の時間を使用してPlayerの速度を制御しますか?

foreach (LightBike b in bikes) //draw bikes 
{ 

    if (b.isBoosting && b.boostCounter > 0) //player is boosting 
    { 
     Thread.Sleep(GAME_SPEED - 5); 
     b.boostCounter--; 
     if (b.boostCounter == 0) 
     { 
      b.isBoosting = false; 
      b.boostCounter = 20; 
     } 
    } 
    else 
    { 
     Thread.Sleep(GAME_SPEED); 
    } 

    canvas.DrawLine(new Pen(b.color, BIKE_SIZE) { EndCap = System.Drawing.Drawing2D.LineCap.Square }, b.location, b.getNextLocation()); 

} 
+1

*遅延を制御しないでください:これは近似値であり、他の要因によって支配され、すべてに影響を与える可能性があります。 *各時間デルタ*の移動量を制御します(正確に一定ではなく、時間デルタが正しく処理されると変更できます)。この単純な形式の「タイム・デルタ移動」は、基本的なゲーム・チュートリアルに含まれています。 –

+1

また、更新ロジックは描画ロジックとは別にする必要があります。描画は世界のオブジェクトの視覚的表現であり、ほとんどの場合独立している必要があります。 –

答えて

5

これにはいくつかの問題があります。

第1に、それは1つのスレッドなので、ある期間スリープすると、スレッドはスケジュール解除されます。レンダリングは行われません(あなたのケースでは、 "ブースト"されたバイクもその他のバイクも描画されません)。実際に描かれている線は常にb.locationからb.getNextLocation()に移動します。これはブーストされたバイクとブーストされていないバイクの両方で(私が仮定した)等しいです。

第二に、あなたは本当にあなたがモデルのいくつかの並べ替えとしてバイクを実装し、レンダリングの外にそれを保ち、モデルやレンダリングに自転車スピードを区別しなければならない...コードをレンダリングすると、ロジックに

を混合していますコード。

モデルには、各自転車の速度ベクトル(レンダリングサイクルとは無関係に、ティックカウントで加速度ベクトルによって修正される)が含まれ、レンダリングはすべて適切な線を描画するのが理想的です。

基本的には、ブースティングコードをDraw()ではなくb.getNextLocation()に置き、描画コードから条件文を削除します。

0

2つの自転車AとBがあるとします(ブースティングはしていません)。のは、サイクルのカップル見ていきましょう:

A -- wait GAME_SPEED 
Redraw A 
B -- wait GAME_SPEED 
Redraw B 
A -- wait GAME_SPEED 
Redraw A 
B -- wait GAME_SPEED 
Redraw B 

時間B = GAME_SPEEDの再描画の間にA =時間の再描画の間* 2。

は今、Bが後押しされたとします

A -- wait GAME_SPEED 
Redraw A 
B -- wait GAME_SPEED - 5 
Redraw B 
A -- wait GAME_SPEED 
Redraw A 
B -- wait GAME_SPEED - 5 
Redraw B 

A = GAME_SPEED * 2の再描画の間でB =時間の再描画までの時間 - 5.

これはちょうど起こるあなたが観察している理由何を示しています:各自転車は、自分のものだけでなく、みんなの遅れを待つ。

これを回避する唯一の方法は、1回の「画面のリフレッシュ」遅延を設定し、時間の遅れではなくオブジェクトの移動距離を変更することで速度を制御することです。

関連する問題