【问题标题】:Best way to randomly spawn stuff indepentently of the users fps独立于用户 fps 随机生成东西的最佳方法
【发布时间】:2014-11-19 18:17:53
【问题描述】:

我想在我的游戏中随机生成每个平均 2 秒的东西,独立于用户的 fps,那么这是否正确,如果不是,问题是什么:

function update(delta) {
  var interval = 2; // in seconds
  if (Math.floor(Math.random() * (1 / delta) * interval) == 0) spawn();

  ...

  obj.x += obj.vx * delta
}

这会以 2 秒的平均间隔随机生成东西吗?

还有,有没有更好的办法?

【问题讨论】:

  • 是什么阻止你自己测试它?
  • @Cobra_Fast 没什么,只是想知道什么是随机法则
  • delta 应该建模什么?如果生成率与 delta 无关,那么为什么 delta 会出现在您的函数中?
  • @madshogo 抱歉,我不是那个意思,我的意思是与用户计算机的速度无关。
  • @Murplyx 好的。但同样,delta 的目的是什么?你希望它的效果是什么?

标签: javascript random


【解决方案1】:

使用setTimeoutsetInterval 应该是确保在一定时间后重复调用函数的好方法。

如果您不想使用它,那么让您的 spawner 对象的 update 函数使用当前世界时间,而不仅仅是当前帧的 delta。另外,让对象记录它最后一次产生的东西。这样,您只需:

// maybe it should be 2000, in milliseconds, idk
if (currentTime - this.lastTimeSomethingSpawned >= 2) {
    spawn();
    this.lastTimeSomethingSpawned = currentTime;
}

如果您想随机化间隔而不是恒定的 2 秒,只需每次重新计算一个新的随机间隔:

// maybe it should be 2000, in milliseconds, idk
if (currentTime - this.lastTimeSomethingSpawned >= this.spawningInterval) {
    spawn();
    this.lastTimeSomethingSpawned = currentTime;
    this.spawningInterval = 2 + (2*Math.random()-1)*this.intervalDeviation;
}

其中this.intervalDeviation 类似于0.5。这样,this.spawningInterval 将在每次生成时介于 1.5 和 2.5 之间。

最后,这个问题更适合Gamedev Stackexchange

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多