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


9

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

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

Ответы:


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 дает правильное чувство, чтобы привязать блоки к правильным сеткам


5
Можете ли вы объяснить, что вы подразумеваете под «правильным чувством»? И почему функция потолка это делает?
MichaelHouse
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.