使用不同的 Thread.sleep() 持续时间来控制玩家速度

本文关键字:持续时间 控制 速度 玩家 sleep Thread | 更新日期: 2023-09-27 18:31:04

如果"bikes"列表中的一个对象包含布尔值isBoosting,我正在尝试更快地绘制Line()。当列表包含两辆自行车时,结果是当只有一辆自行车"正在加速"时,两辆自行车似乎都在加速。有人知道为什么吗?如果对象不包含 isBoost 的值 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());
}

使用不同的 Thread.sleep() 持续时间来控制玩家速度

这有几个问题。

首先,由于它是单个线程,因此当您睡眠一段时间时,线程将被取消调度 - 不会进行渲染(在您的情况下,这意味着不会绘制"增强"自行车或其他自行车)。实际绘制的线将始终从 b.location 到 b.getNextLocation(),它们(我假设)对于增强型和非增强型自行车都是相等的。

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

实际上,您应该将自行车实现为某种模型,并在模型中区分自行车速度和渲染,将其排除在渲染代码之外。

理想情况下,该模型将包含每辆自行车的速度矢量(由刻度计数的加速度矢量修改,与渲染周期无关),渲染所做的只是绘制适当的线。

所以基本上把你的提升代码放在b.getNextLocation()而不是Draw()中,并从绘图代码中删除条件语句。

假设有两辆自行车,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
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。

这只是告诉你为什么你正在观察的事情会发生:每辆自行车都在等待每个人的延迟,而不仅仅是他们自己的延迟。

解决这个问题的唯一方法是有一个"屏幕刷新"延迟,并通过改变物体移动的距离而不是时间延迟来控制速度。