使用不同的Thread.sleep()持续时间来控制播放器的速度?

Ian*_*ugh 2 .net c# multithreading drawing

如果"自行车"列表中的一个对象包含布尔isBoosting,我试图更快地绘制线().当列表包含两辆自行车时,结果是当两辆自行车中只有一辆"isBoosting"时,两辆自行车似乎都加速了.有没有人知道为什么?如果对象不包含isBoosting的值,那么线程是否应该"移动"更慢?

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

}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ard 5

这有几个问题.

首先,由于它是一个单独的线程,当你睡眠一段时间后,线程被取消安排 - 不会进行渲染(在你的情况下,这意味着既不会"提升"自行车也不会绘制其他自行车).实际绘制的线将始终从b.location变为b.getNextLocation(),对于增强和未增强的自行车,它们(我假设)是相等的.

其次,你将逻辑与渲染代码混合在一起......

实际上你应该将自行车作为某种模型来实现,并区分模型中的自行车速度和渲染,从而将其保持在渲染代码之外.

理想情况下,该模型将包含每个自行车的速度矢量(由刻度计上的加速度矢量修改,与渲染周期无关),并且所有渲染都将绘制相应的线.

因此,基本上将您的增强代码放入b.getNextLocation()而不是Draw()中,并从绘图代码中删除条件语句.