计算小数点后数字返回数字的步长

我怎样才能从小数点后返回数字的计算得到舍入数字? 而所有的数字将是从中分出的数字。

说明:

我目前正在使用精灵animation制作基于JavaScript tile-based的游戏。

一些步行/奔跑的精灵是less或多。

比方说,我有3步行精灵走路。

1:向下看

2:walkanimation精灵

3:walkanimation精灵

每个瓦片之间的距离,比方说,是16个像素。

16个像素除以3个子画面为5.33333。

所以,如果玩家走下来,每个animation预览将向下移动5.3333个像素。 这将导致玩家在步行animation完成时的15.999像素。

如果玩家走了很多次,那就不好了。

所以我想要dynamic地获得以分割数为结尾的步长。

在这个例子中:

16/3

将返回:

1/3:6

1/3:5

1/3:5

总计:16像素走

这听起来像是你之后的Bresenham线画图algorithm的一个版本:实际上,你正在绘制一条线,例如,3个“sprixels”(即,精灵像素)在一个方向上,在另一个16像素,你需要知道什么跨度的像素对应于哪个sprixel。

如果你不关心均匀分布“长”和“短”的步骤,那么有一个非常简单的朴素的algorithm:

int spriteSteps[spriteCount]; int minSteps = totalSteps/spriteCount; int extraSteps = totalSteps % spriteCount; for ( i = 0; i < spriteCount; i++ ) { if ( i >= extraSteps ) spriteSteps[i] = minSteps; else spriteSteps[i] = minSteps+1; } 

这将为每个sprite填充spriteSteps []数组。

如果你希望尽可能均匀地分布整个精灵集合中的长短步骤,那么你应该看看上面提到的Bresenhamalgorithm,特别是跨度版本; 这并不比我刚刚给的复杂得多。 实际上,使用累积误差来确定何时从一个跨度翻转到下一个跨度。

请注意,这两种algorithm都有一个主要的优点:它们都只使用整数算术。 一般来说,没有理由去浮动这样的algorithm,并有很多很好的理由来避免它。

我不确定你在问什么,但是分区和模数有什么问题? 模数(JavaScript中的“%”)返回除法的其余部分。

  16 % 3 = 1 26 % 3 = 2 33 % 3 = 0. 

对不起,添加代码作为另一个答案,但我更习惯vbulletin主板及其标记代码比这个降价系统。

jsFiddle Code,以及下面

 <script> numofSprites = 8; stepLength = []; function doit(pixelLength){ var remainder = pixelLength % numofSprites; for (i = 0; i < 3; i++){ var extraStep = 0; if (remainder != 0) { extraStep = 1 remainder--; } stepLength[i] = (Math.floor(pixelLength/numofSprites) + extraStep); alert(' pixelLength = ' + pixelLength + ' step'+i+ ' =' + stepLength[i]) } } doit(15) </script>