Erheblich einfacher wird das ganze, wenn du deine Kacheln als Polygone ansiehst. Dann hast du ja schon das Offset deiner Welt zur Anzeige, und die angeklickten Koordinaten der Anzeige hast du auch. Folglich ist der angeklickte Punkt in Weltkoordinaten
ScreenOffset + GeklickteKoordinate, und mit diesen kannst du dann einfach einen Point-In-Poly Test machen (gibts einige Threads in der
DP zu).
Damit du nun aber nicht alle Teile deiner (größtenteils nicht sichtbaren) Welt abtesten musst, kannst du den Bereich vorher eingrenzen. Es reicht schon vorher zu testen, ob ein Rechteck im sichtbaren lieget. Das sind pro Kachel ein bis vier Vergleiche die noch dazu kommen, aber in den meisten fällen den aufwendigeren Polygontest umschiffen, nämlich dann, wenn die Kachel eh nicht sichtbar ist. *)
Das Verfahren hat den Vorteil, dass du frei bist was die Kachelform angeht, wenn du z.B. mal auf Sechsecke umstellen/erweitern willst.
Paul Bourkes Seiten sind immer meine Anlaufstelle Nr.1 wenn es um Geometrie geht, und auf der verlinkten sind gleich eine Reihe von sehr einfachen C Snippets für den Test. Ob sich der für Rauten nochmal optimieren lässt, habe ich noch nicht geschaut. Aber der Aufwand hält sich so schon in Grenzen denke ich.
*) Die Vorauswahl setzt voraus, dass du zu jeder Kachel die 4 Eckpunkte kennst. Ich nenne sie mal T(op), B(ottom), L(eft) und R(right), dann könnte ein Pseudocode etwa so aussehen:
Delphi-Quellcode:
for i := 0 to AnzahlKacheln-1 do
begin
if (Kachel[i].R > 0) and (Kachel[i].B > 0) then
if (Kachel[i].L < Screen.Width) and (Kachel[i].T < Screen.Height) then
if PointInPoly(Kachel[i], ClickedPoint) then Kachel[i].Selected := true; // oder was auch immer dann passieren soll
end;
Die if-Abfrage funktioniert genauso gut wenn sie am Stück geschrieben steht, so fand ich nur übersichtlicher.
Bei der Vorauswahl musst du zwangläufig die Anzeigekoodinaten der Kacheln nehmen, beim Polygon-Test geht prinzipiell beides. Du musst dich nur auf eines festlegen, und jeweils den Punkt oder die Kachel um dein Offset vorm Test verschieben.
Da du aber eh schon die Anzeigekoords berechnen musstest (Kachel um Offset verschoben), empfiehlt es sich diese nochmals zu nehmen, zumal man dann für den geklickten Punkt die vom OnClick gelieferten Koordinaten 1:1 benutzen kann.
Kommt komplett ohne Trigonometrie aus, also auch ohne Float-Arithmetik. Dürfte vom Speed her okay sein.
Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel