【问题标题】:Incrementing a counter with variable speed以可变速度递增计数器
【发布时间】:2017-08-07 20:05:04
【问题描述】:

我正在用 JavaScript 创建一个增量游戏(比如 CookieClicker,如果你玩过的话)。

以 CookieClicker 为例,您每秒生成一定数量的 cookie。如果您每秒制作 700 个 cookie,则计数器每秒增加 1 个 cookie 700 次(或看起来如此)。

目前在我的游戏中,如果你每秒制作 700 个“cookie”,计数器将每秒增加 700 个“cookie”,而不是平稳地增加一个固定数量。

我不知道如何做到这一点。我创建了一个函数来计算您每秒制作的“cookie”数量,我尝试使用该数字将window.setInterval() 的时间参数设为变量,但我什至不确定这是否可能更不用说实用了.

我很确定这不是正确的方法,但我还是会发布相关代码:

function getManaPerSecond(){
    manaPerSecond = earthEssence + (windEssence * 5) + (waterEssence * 10) + 
    (fireEssence * 150);
};

window.setInterval(function(){
    getManaPerSecond();
}, 1000);

window.setInterval(function(){
    if(manaPerSecond>0){
        incrementalMana++;
     document.getElementById('incrementalMana').innerHTML = incrementalMana;
 }
 }, (1000/manaPerSecond));

【问题讨论】:

  • 我以前做过类似的事情,我决定平均每秒应该有 60 帧,所以我每秒更新计数器 60 次。这并不是 100% 正确的,但它会给人一种“流畅”的印象。您可能必须使用双精度数字才能获得所需的结果。根据经验,每秒 60 次大约是每 17 毫秒一次(16.66666...)。你当然必须做var incrementBy = manaPerSecond / 60; manascore += incrementBy。您不应该添加 1,就像您在这里所做的那样,而是添加 X,即所需的数量。
  • 您可以查看requestAnimationFrame 以获得更流畅的动画css-tricks.com/using-requestanimationframe

标签: javascript increment


【解决方案1】:

每当频率发生变化,就需要停止旧的区间函数,重新开始。

var manaCounter;
var oldManaPerSecond = 0;
function restartManaCounter(manaPerSecond) {
    if (manaPerSecond != oldManaPerSecond) {
        clearInterval(manaCounter);
        oldManaPerSecond = manaPerSecond;
        if (manaPerSecond > 0) {
            manaCounter = setInterval(function() {
                incrementalMana++;
                document.getElementById('incrementalMana').innerHTML = incrementalMana;
            }, 1000/manaPerSecond);
        }
    }
}

function getManaPerSecond(){
    var manaPerSecond = earthEssence + (windEssence * 5) + (waterEssence * 10) +  (fireEssence * 150);
    return manaPerSecond;
};

window.setInterval(function() {
    restartManaCounter(getManaPerSecond());
}, 1000);

【讨论】:

  • 嗯,这有点不对劲。每当我重新开始游戏并购买单个建筑物(每秒产生 1 点魔法值)时,计数器会从 1 变为 3、变为 6、变为 10 等(换句话说,+1、+2、+3、+ 4, +5) 而不是以动态速度增加 1。
  • 对不起,调用setInterval的代码应该在第一个if内。
猜你喜欢
  • 2019-04-05
  • 2023-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多