Когда я ищу функцию сетки привязки. На самом деле это Tile Collide. (Возможно, вы знаете, что я изучаю GMS2 из-за тегов..)
Для моего вопроса это не важно.
Перейдем к делу, я узнал об этой формуле.
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));
GML — это скриптовый язык для GameMaker Studio2. Я думал, что GML основан на Python… просто мое предположение. Извините, если вы запутались в этом. И я удаляю тег С# из-за путаницы.
Должна ли ширина сетки быть четной степенью числа 2? Только так я вижу смысл во второй формуле. - если это так, то оба они «привязываются» к кратному четной степени двойки, причем эта четная степень двойки равна gridwidth
.
предоставить потенциальные значения для pos.x и ширины сетки? потому что эти две формулы совсем не эквивалентны. например, с 10 и 3 x - (x % gridwidth) #9
и (x)&~(gridwidth-1) #8
О, я вижу .. Я добавил пример того, что я сделал для этого.
Прохладный. Итак, мой ответ объясняет, что происходит, достаточно хорошо, чтобы вы это поняли?
Да!! Моя проблема решена, спасибо за вас.
Эти две формулы эквивалентны только в том случае, если gridwidth
является четной степенью двойки, например 128, 256, 2048 и т. д.
В любом случае pos.x - (pos.x % gridwidth)
выполняет floor
возврат к четному кратному gridwidth
, «привязываясь» к началу этой ячейки сетки, где сетка состоит из ячеек шириной gridwidth
.
Если вы можете предположить, что gridwidth
является четной степенью числа 2, то (pos.x)&~(gridwidth-1)
делает то же самое. По сути, с учетом этого предположения, каждое значение в одной ячейке сетки будет отличаться только младшими битами... битами ниже бита gridwidth
. Этот код просто очищает эти биты, тем самым вычисляя результат как кратный gridwidth
, который будет первой позицией в этой ячейке сетки.
Спасибо за Ваш ответ. Как вы сказали, вторая формула работает так же, как и первая формула, когда gridwidth
имеет четное число.
Однако не просто любое четное число ... только четная степень 2. Это не будет работать для ширины сетки 10 или 1000. - Я полагаю, что вы это имели в виду. Всего лишь уточняю.
почему теги python и C# одновременно? Что это за язык?