Como encaixar a posição de um objeto de jogo em uma grade?

9

Estou criando um jogo que envolve elementos de jogabilidade "em queda". O problema é que não tenho certeza de como fazê-lo, de modo que os blocos se ajustem a algum tipo de grade; em outras palavras, não tenho certeza de como ele selecionará a célula mais próxima de sua posição.

Os blocos não estão encaixando continuamente em uma grade (ou seja, estão sujeitos à gravidade). Alguma dica?

JesseTG
fonte

Respostas:

13

Você pode fazer algo assim

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;

Isso basicamente arredonda as posições X e Y para o múltiplo mais próximo das dimensões do cubo. Em seguida, dimensione-o pelas dimensões do cubo para obter a posição uniforme.

Austin Brunkhorst
fonte
2
Eu acho que Math.round faz mais sentido. por exemplo, imagine cubeWidth / height = 3. então ax = 4 deve mapear para 3, mas x = 5 deve mapear para 6. #
numan
0

Na minha pesquisa rápida, quando você está encaixando alguma geometria em uma grade:

  • Desde que todos os vértices do seu polígono (em sua posição final) coincidam com os vértices da grade (em outras palavras, se o que você está tentando ajustar se encaixa perfeitamente na grade), então

  • Você pode ajustar qualquer um dos vértices do polígono ao vértice da grade mais próximo e aplicar a mesma conversão a todos os outros. Você sempre terminará com a mesma posição resultante.

Isso significa que você pode simplesmente escolher um vértice e arredondar suas coordenadas ou, se estiver usando uma grade com lado maior que uma unidade, use a expressão de Austin:

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

Marcos Pereira
fonte
-4

Math.ceil dá a sensação certa de encaixar os blocos nas grades corretas

user2767178
fonte
5
Você pode explicar o que você quer dizer com "a sensação certa"? E por que a função de teto faz isso?
Michaelhouse