¿Cómo puedo ajustar la posición de un objeto de juego a una cuadrícula?


9

Estoy haciendo un juego que involucra elementos de juego de "bloques que caen". El problema es que no estoy muy seguro de cómo hacerlo para que los bloques encajen en algún tipo de cuadrícula, en otras palabras, no estoy seguro de cómo seleccionará la celda más cercana a su posición.

Los bloques no se ajustan continuamente a una cuadrícula (es decir, están sujetos a la gravedad). ¿Algun consejo?

Respuestas:


13

Puedes hacer algo como esto

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;

Básicamente, esto redondea las posiciones X e Y al múltiplo más cercano de las dimensiones del cubo. Luego lo escala por las dimensiones del cubo para obtener la posición uniforme.


2
Creo que Math.round tiene más sentido. por ejemplo, imagina cubeWidth / height = 3. luego ax = 4 debería mapearse a 3 pero x = 5 debería
mapearse

0

En mi investigación rápida, cuando está ajustando algo de geometría en una cuadrícula:

  • Siempre y cuando todos los vértices de su polígono (en su posición final) coincidan con los vértices de la cuadrícula (en otras palabras, si lo que está tratando de ajustar encaja bien en la cuadrícula), entonces

  • Puede ajustar cualquiera de los vértices de su polígono a su vértice de cuadrícula más cercano y aplicar la misma traducción a todos los demás. Siempre terminará con la misma posición resultante.

Esto significa que simplemente puede elegir un vértice y redondear sus coordenadas, o, si está usando una cuadrícula con un lado más grande que una unidad, use la expresión de Austin:

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


-4

Math.ceil da la sensación correcta de ajustar los bloques a las cuadrículas correctas


55
¿Puedes explicar qué quieres decir con "la sensación correcta"? ¿Y por qué la función de techo hace eso?
MichaelHouse
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.