如何使进度条根据累积的时间以特定的速度更改值

时间:2012-03-04 04:58:20

标签: actionscript-3

我有一个进度条作为游戏中的健康栏。健康棒现在可以再生10毫秒,因为我喜欢光滑度。但如果延迟增加,重新生成将需要更长的时间。

是否有任何公式来计算某种因素?所以救生竿无论如何都会在一个恒定的时间内再生。如果延迟是2秒,它只会使再生更不稳定,如果延迟是1毫秒,它只会更新更多。

1 个答案:

答案 0 :(得分:1)

你面临的问题有两种可能的解决方案,值得关注,虽然第一种解决方案实际上并不是你的问题,但我觉得使用它对于大多数简单的游戏循环来说已经足够了。

第一个想法依赖于一个目标帧速率(游戏操作的速率,但在某些帧上执行某些操作(假设一次为4帧,一次为2帧,依此类推)。解决方案的代码看起来像这样:

var updates:Number = 0;
var t:Timer = new Timer(20, 50); // 50 FPS
t.addEventListener(TimerEvent.TIMER, _onTimer);
t.start();

function _onTimer(event:TimerEvent):void
{
    var count = t.currentCount;
    if (count % 5 == 0) // replace 5 with any delay parameter here
    {
        updates++;
        trace(updates);
    }
}

如果您运行上面的示例,您会看到我们只执行10次更新,但在50 FPS上运行一秒钟。这是因为获取计时器事件的计数并查看事件是否已经触发了第5,10,15等等。您可以将因子从5更改为您想要的任何内容 - 可以在每10或20或第2帧执行代码,甚至可以在一个帧间隔执行一些代码,在另一个帧上执行另一个代码,但是另外检查(如果计数) %3 == 0)。


现在,转到您要求的解决方案,代码将是这样的:

// rate in which health regenerates (points per second)
var regenRate:Number = 10;

// starting health
var health:Number = 20;

function _onTimer(event:TimerEvent):void
{
    // get timer delay (between timer events)
    var timerDelay:Number = t.delay;
    // calculate how much health to regenerate based on regen rate
    // ((delay / 1 second) * regeneration rate per second)
    var regenAmount:Number = timerDelay / 1000 * regenRate;
    // add that to health and set it to 100 if more than that
    health += regenAmount;
    if (health >= 100)
        health = 100;
}

// takes 8 seconds to complete, no matter what delay
var t:Timer = new Timer(20);
t.addEventListener(TimerEvent.TIMER, _onTimer);
t.start();

在计算Math.round(expression)时,您可能想要使用uint(expression)regenAmount进行舍入,因为如果不进行舍入则会产生一些非常难看的数字(就像浮点数所预期的那样)。