Как я могу привязать положение игрового объекта к сетке?

9

Я делаю игру, которая включает в себя элементы геймплея "падающий блок". Проблема в том, что я не совсем уверен, как сделать так, чтобы блоки привязывались к какой-то сетке, другими словами, я не уверен, как он выберет ближайшую ячейку к своей позиции.

Блоки не привязываются непрерывно к сетке (т.е. они подвержены гравитации). Какие-нибудь советы?

JesseTG
источник

Ответы:

13

Вы можете сделать что-то вроде этого

int gridCubeWidth = 16, gridCubeHeight = 16;

cube.Position.X = Math.round(cube.Position.X / gridCubeWidth) * gridCubeWidth;
cube.Position.Y = Math.round(cube.Position.Y / gridCubeHeight) * gridCubeHeight;

Это в основном округляет позиции X и Y до ближайшего кратного измерения куба. Затем масштабируйте его по размерам куба, чтобы получить равномерную позицию.

Остин Брунхорст
источник
2
я думаю, что Math.round имеет больше смысла. например, представьте, что cubeWidth / height = 3. тогда ax = 4 должен отображаться на 3, а x = 5 должен отображаться на 6.
numan
0

В моем быстром исследовании, когда вы привязываете некоторую геометрию к сетке:

  • Пока все вершины вашего многоугольника (в его конечной позиции) совпадают с вершинами сетки (другими словами, если то, что вы пытаетесь привязать, хорошо вписывается в сетку), то

  • Вы можете привязать любую из вершин полигона к ближайшей вершине сетки и применить тот же перевод ко всем остальным. Вы всегда будете в конечном итоге с той же позиции в результате.

Это означает, что вы можете просто выбрать вершину и округлить ее координаты, или, если вы используете сетку со стороной, превышающей одну единицу, используйте выражение Остина:

cube.Position.XorYorZ = Math.round(cube.Position.XorYorZ / gridCubeWidth) * gridCubeWidth;

Маркос Перейра
источник
-4

Math.ceil дает правильное чувство, чтобы привязать блоки к правильным сеткам

user2767178
источник
5
Можете ли вы объяснить, что вы подразумеваете под «правильным чувством»? И почему функция потолка это делает?
MichaelHouse