我想知道如何将 "a-(a%b) " 转换为 "a&(~b)"(捕捉网格公式)
I want to know how transformed "a-(a%b) " to "a&(~b)" (snapping grid formula)
当我搜索捕捉网格功能时。其实就是Tile Collide。(你可能知道我学GMS2是因为tags..)
这对我的问题不重要。
切入正题,我了解了这个公式。
pos.x - (pos.x % gridwidth) <- this is number calculation.
我想要的效果很好。我发现了不同的公式。
此公式适用于对象和图块的碰撞。
(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));
只有当 gridwidth
是 2 的偶次方时,这两个公式才等价,例如 128、256、2048 等。
在任何一种情况下,pos.x - (pos.x % gridwidth)
都会 floor
回到 gridwidth
的偶数倍,"snapping" 到该网格单元格的开始,其中网格由宽度为 gridwidth
.
的单元格组成
如果您可以假设 gridwidth
是 2 的偶数次方,那么 (pos.x)&~(gridwidth-1)
就是做同样的事情。基本上,在这个假设下,一个网格单元中的每个值只会在其低阶位上有所不同...... gridwidth
位以下的位。此代码只是清除这些位,从而将结果计算为 gridwidth
的偶数倍,这将是该网格单元格中的第一个位置。
当我搜索捕捉网格功能时。其实就是Tile Collide。(你可能知道我学GMS2是因为tags..)
这对我的问题不重要。
切入正题,我了解了这个公式。
pos.x - (pos.x % gridwidth) <- this is number calculation.
我想要的效果很好。我发现了不同的公式。
此公式适用于对象和图块的碰撞。
(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));
只有当 gridwidth
是 2 的偶次方时,这两个公式才等价,例如 128、256、2048 等。
在任何一种情况下,pos.x - (pos.x % gridwidth)
都会 floor
回到 gridwidth
的偶数倍,"snapping" 到该网格单元格的开始,其中网格由宽度为 gridwidth
.
如果您可以假设 gridwidth
是 2 的偶数次方,那么 (pos.x)&~(gridwidth-1)
就是做同样的事情。基本上,在这个假设下,一个网格单元中的每个值只会在其低阶位上有所不同...... gridwidth
位以下的位。此代码只是清除这些位,从而将结果计算为 gridwidth
的偶数倍,这将是该网格单元格中的第一个位置。