【问题标题】:I want to know how transformed "a-(a%b) " to "a&(~b)" (snapping grid formula)我想知道如何将“a-(a%b)”转换为“a&(~b)”(捕捉网格公式)
【发布时间】:2019-08-28 21:42:22
【问题描述】:

当我搜索对齐网格功能时。实际上是 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));

【问题讨论】:

  • 为什么python和c#标签同时出现?这是什么语言?
  • GML 是 GameMaker Studio2 的脚本语言,我认为 GML 基于 Python ......只是我的猜测。如果你对此感到困惑,我很抱歉。我删除了 C# 标签,因为它很混乱。
  • 网格宽度必须是 2 的偶数幂吗?这是我认为第二个公式有意义的唯一方法。 - 如果是这样,那么这两个都“捕捉”到二的偶数幂的倍数,二的偶数幂是gridwidth
  • 为 pos.x 和 gridwidth 提供潜在值?因为这两个公式根本不等价。例如,10 和 3 x - (x % gridwidth) #9(x)&amp;~(gridwidth-1) #8
  • 哦,我明白了。我添加了一个示例。

标签: gml game-maker-language game-maker-studio-2


【解决方案1】:

这两个公式只有在 gridwidth 是 2 的偶数次方时才等价,例如 128、256、2048 等。

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

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

【讨论】:

  • 感谢您的回答。如您所说,当gridwidth 为偶数时,第二个公式与第一个公式相同。
  • 虽然不是任何偶数...只是 2 的偶数幂。这不适用于 10 或 1000 的网格宽度。 - 我想这就是你的意思。只是确保。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2013-07-02
  • 2012-11-12
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多