我有一个进度条作为游戏中的健康栏。健康棒现在可以再生10毫秒,因为我喜欢光滑度。但如果延迟增加,重新生成将需要更长的时间。
是否有任何公式来计算某种因素?所以救生竿无论如何都会在一个恒定的时间内再生。如果延迟是2秒,它只会使再生更不稳定,如果延迟是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
进行舍入,因为如果不进行舍入则会产生一些非常难看的数字(就像浮点数所预期的那样)。