Finden Sie heraus, auf welcher Kachel ein Mausklick gelandet ist


9

Ich arbeite an einem auf einem isometrischen Gitter basierenden Spiel und habe ein Problem beim Versuch, einen Mausklick vom Benutzer mit einer Kachel zu verknüpfen. Ich konnte das Problem in zwei Teile aufteilen:

  • Ein Rechteck finden, das eine Kachel umgibt (was ich konnte)
  • Herauszufinden aus dem Rechteck, in dem der Klick gelandet ist (hat mich verblüfft)

Hier ist ein Beispiel für ein Rechteck mit Kacheln auf der Innenseite:

Rechteck mit Fliesen

Das Rechteck ist 70px lang und 30px hoch. Wenn ich also eine Eingabe von beispielsweise 30x (oben) / 20y (links) verwende, wie würde ich dann bestimmen, in welche Kachel dies fällt?



Was ist mit einer Koordinatenänderung und einer Überprüfung? Wenn Ihre Kachel Ringscheiben enthält, würden Sie sicherlich ein Polarkoordinatensystem verwenden.
FxIII

Antworten:


8

Für jeden Schritt, den Sie in x-Richtung ausführen, bewegen Sie sich 35 Pixel nach links und -15 Pixel nach oben auf Ihre Leinwand.

Für jeden Schritt, den Sie in y-Richtung ausführen, bewegen Sie sich -35px nach links und -15px nach oben auf Ihre Leinwand.

Fliese zu kartesisch

Dies bedeutet, dass Sie Ihr Kachelkoordinatensystem einfach in Pixel konvertieren können:

(x, y) => (35 · x, -15 · x) + (-35 · y, -15 · y) = (35 · x - 35 · y, -15 · x - 15 · y) = ( Xpx, Ypx)

Sie müssen das inverse Problem lösen, das Sie mit Xpx und Ypx kennen, und Sie möchten x und y (in Kachelkoordinaten) kennen.

Xpx = 35 · x - 35 · y;

Ypx = -15 · x - 15 · y;

Kannst du das lösen? Es sollte sein:

x = 1/70 · Xpx - 1/30 · Ypx

y = -1 / 70 · Xpx - 1/30 · Ypx

Offensichtlich haben Sie im Allgemeinen nicht ganzzahlige Werte: Wenn Sie die Obergrenze von x und y nehmen, erhalten Sie die Koordinate der gesamten Kachel.


Das Rechteck ist 70px lang, dann ist der Schritt 35px und nicht 30px (horizontal)
CeeJay
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.