2

「bikes」リストの1つのオブジェクトにブール値のisBoostingが含まれている場合、drawLine()をより高速にしようとしています。リストに2台の自転車が含まれていて、その結果、片方の自転車だけが「isBoosting」の場合、両方の自転車がスピードアップしているように見えます。誰かがその理由について考えを持っていますか?オブジェクトにisBoostingのtrueの値が含まれていない場合、スレッドの「移動」を遅くするべきではありませんか?

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());

}
4

2 に答える 2

5

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

まず、単一のスレッドであるため、一定期間スリープすると、スレッドのスケジュールが解除されます。レンダリングは行われません(この場合、「ブーストされた」自転車も他の自転車も描画されません)。実際に描かれる線は、常にb.locationからb.getNextLocation()に移動します。これは、ブーストされたバイクとブーストされていないバイクの両方で同じです(私は推測します)。

第二に、あなたはレンダリングコードとロジックを混ぜ合わせています...

実際には、自転車をある種のモデルとして実装し、モデル内の自転車の速度とレンダリングを区別して、レンダリングコードから除外する必要があります。

理想的には、そのモデルには各自転車の速度ベクトルが含まれ(レンダリングサイクルとは関係なく、ティックカウントで加速度ベクトルによって変更されます)、レンダリングで行われるのは適切な線を引くことだけです。

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

于 2012-04-15T00:35:30.243 に答える
0

AとBの2台の自転車があるとします(ブーストではありません)。いくつかのサイクルを見てみましょう。

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

Aの再描画間の時間=Bの再描画間の時間=GAME_SPEED*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

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

これは、あなたが観察していることが起こる理由を示しています。各自転車は、自分の自転車だけでなく、全員の遅延を待ちます。

これを回避する唯一の方法は、「画面の更新」を1回遅らせ、時間遅延ではなく、オブジェクトの移動距離を変更して速度を制御することです。

于 2012-04-15T00:39:29.727 に答える