2

我正在尝试构建一个有点像命运之轮的游戏,实际上它已经完成了,但似乎有一个我无法弄清楚的奇怪问题。

这是轮子本身,您可以看到这些值是均匀分布的,每个值都有一个 15° 的切片。

在此处输入图像描述

要旋转轮子,我会生成一个随机数,它是以度为单位的旋转量,我为轮子设置动画,一切都很好,但是当旋转停止时,我必须从轮子中获取值,该轮子停止在顶部中心位置,所以我虽然这会解决它:

wheelValues = [
    1000, 3250, 1800, 1000, 1200, 3750, 5000, 1000, 3000, 1600, 1000, 3500,
    1000, 2000, 1000, 2750, 1000, 4000,   -1, 1000, 2500, 1400, 1000, 2250
];

if (toAngle > 360)
{
    toAngle = toAngle - (Math.floor(toAngle / 360) * 360);
}
arrIndex = Math.floor(toAngle / 15) + 1;
result = wheelValues[arrIndex];

我生成的随机自旋在哪里toAngle,可以在 370 到 1440 之间。

这种方法在 10 次中大约有 8/9 次有效,我实际上可以获得车轮停止的正确值,但我无法真正理解为什么有时该值关闭(有时真的关闭,甚至不接近正确值) .

4

3 回答 3

3

您出于某种原因将 1 添加到数组索引中。

数组索引从 0 开始。

于 2012-06-01T06:33:32.797 回答
1

我可以看到两个问题;

首先,这一行:

 if (toAngle > 360)

如果 toAngle == 360,我相信这会产生错误,因为您将跳过“模数”部分,toAngle 最终将是 24(大于您的数据集)

第二:

arrIndex = Math.floor(toAngle / 15) + 1;

无需为此 +1,因为您永远不会获得第一个值,并且有时您会超出数组范围。

另外,至于为什么会得到奇数,您是否尝试过编写一些简单的代码来调试您的假设?编写一个循环,从 370 迭代到 1440(您声明的输入边界),然后查看每个值的计算结果。将其打印到文件或屏幕上,您可以快速扫描以查看问题可能出在哪里。

于 2012-06-01T06:45:54.680 回答
1

顺便说一句,如果你首先让你的随机数成为 15 度的偶数倍数可能是最好的,那么你就不需要所有的舍入和地板,例如

function randDeg() {
  var epoch = 360; // minimum value
  var max = 1440;  // maximum value to return
  var step = 15;   // even multiple to return
  var t = Math.random() * (max - epoch) | 0;
  t -= t % 15;
  return  t + epoch;
}

将返回一个数字 n,其中 epoch <= n <= max 且 n%15 = 0。

于 2012-06-01T07:01:36.383 回答