Wie kann ich die Position eines Spielobjekts in einem Raster einrasten lassen?


8

Ich mache ein Spiel, das "fallende Block" -Spielelemente beinhaltet. Das Problem ist, ich bin nicht ganz sicher, wie ich es machen soll, damit die Blöcke an einer Art Gitter einrasten, mit anderen Worten, ich bin nicht sicher, wie es die Zelle auswählt, die seiner Position am nächsten liegt.

Die Blöcke rasten nicht kontinuierlich an einem Gitter ein (dh sie sind der Schwerkraft ausgesetzt). Irgendwelche Tipps?

Antworten:


12

Sie können so etwas tun

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;

Dies rundet die X- und Y-Positionen grundsätzlich auf das nächste Vielfache der Würfelabmessungen. Skaliert es dann um die Würfelabmessungen, um die einheitliche Position zu erhalten.


2
Ich denke, Math.round macht mehr Sinn. Stellen Sie sich z. B. cubeWidth / height = 3 vor. Dann sollte ax = 4 auf 3
abgebildet werden,

0

In meiner schnellen Recherche, wenn Sie eine Geometrie auf ein Gitter schnappen:

  • Solange alle Scheitelpunkte Ihres Polygons (an seiner endgültigen Position) mit den Scheitelpunkten des Gitters übereinstimmen (mit anderen Worten, wenn das, was Sie fangen möchten, gut in das Gitter passt), dann

  • Sie können jeden Scheitelpunkt Ihres Polygons am nächsten Rasterscheitelpunkt ausrichten und dieselbe Übersetzung auf alle anderen anwenden. Sie werden immer die gleiche resultierende Position haben.

Dies bedeutet, dass Sie einfach einen Scheitelpunkt auswählen und seine Koordinaten runden können. Wenn Sie ein Raster mit einer Seite verwenden, die größer als eine Einheit ist, verwenden Sie den Ausdruck von Austin:

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


-4

Math.ceil gibt das richtige Gefühl, um die Blöcke an den richtigen Gittern zu befestigen


5
Können Sie erklären, was Sie unter "dem richtigen Gefühl" verstehen? Und warum macht die Deckenfunktion das?
MichaelHouse
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.