3

当我搜索捕捉网格功能时。实际上是Tile Collide。(你可能知道我因为标签而学习GMS2 ..)

这对我的问题并不重要。

切入正题,我了解了这个公式。

pos.x - (pos.x % gridwidth)  <- this is number calculation.

我想要的效果很好。我发现了不同的公式。

该公式适用于 obj 和瓷砖的碰撞。

(pos.x)&~(gridwidth-1)    <- this is binary calculation.

它有同样的工作。发生什么事??我无法理解这些公式是如何转换的..

其实我知道'&'与减法有同样的作用。但我不理解其他人。

例如

var f1,f2;
var pos_x = 102;
var gridwidth = 64; // It must be even power of 2.
f1 = pos_x - (pos_x % gridwidth);
f2 = (pos_x)&(~(gridwidth-1));

4

1 回答 1

2

这两个公式仅当gridwidth是 2 的偶数幂时才等价,例如 128、256、2048 等。

在任何一种情况下,pos.x - (pos.x % gridwidth)都会floor返回 的偶数倍gridwidth,“捕捉”到该网格单元的开头,其中网格由宽度的单元组成gridwidth

如果您可以假设gridwidth是 2 的偶数幂,那么(pos.x)&~(gridwidth-1)您正在做同样的事情。基本上,给定这个假设,一个网格单元中的每个值只会在其低阶位上有所不同......该位下面的gridwidth位。此代码只是清除这些位,从而将结果计算为 的偶数倍gridwidth,这将是网格中该单元格中的第一个位置。

于 2019-04-07T17:28:02.470 回答