Pixelgenaue Auswahl von Objekten

Dieses Tutorial beschäftigt sich mit einer Methode, 3 oder 2 -dimensionale Objekte pixelgenau mit der Maus anzuwählen. So lassen sich z.B. Schalter in Spielen leicht realisieren.
Im Anhang findest du eine Grundgerüst-Datei, mit der du dieses Tutorial bearbeiten kannst.
Theorie:

Der Kern dieser Methode besteht darin, sogenannte "Hitboxes" in einem zweiten View zu zeichnen. Im anderen wird ganz normal das Level dargestellt.
Jede Hitbox bekommt ihre eigene Farbe, damit sie dem jeweiligen Objekt zugeordnet werden kann.
Nun wird jeden Step überprüft, ob der Mittelpunkt des Bildschirms die Farbe der jeweiligen Hitbox hat.
(vorrausgesetzt das Spiel ist ein FPS. Andererseits wären es die Mauskoordinaten)
Wenn ja, ist das Objekt angewählt.

Vorbereitungen:
Bevor wir nun zum Wesentlichen kommen, müssen einige Vorbereitungen getroffen werden.
Da wir nun mehrere Views benutzen, müssen diese zuerst aktiviert werden.
View[0] wird der View sein, in dem die Hitboxes nacher gezeichnet werden, in view[1] das eigentliche Level.
Diese Anordnung sorgt dafür, dass die Hitboxes für den Spieler nicht sichtbar sind, da view[0] vom anderen verdeckt wird.
Desweiteren müssen wir darauf achten, dass unser Level ausschließlich in view[1] gezeichnet wird und unsere Hitboxes nur in view[0].
Daher prüfen wir immer bevor wir etwas zeichnen, ob wir uns im richtigen View befinden:
Achten wir nicht darauf, könnten Objekte die Hitboxes überdecken, sodass falsche Farbwerte übermittelt werden.
Praxis:
Zuerst erstellen wir ein Objekt "obj_color".
Dieses wird nun jeden Step den Farbwert des Bildschirm-Mittelpunkts ermitteln.
Wir deklarieren also eine Variable "mCol" und stellen den depth-Wert auf -10, damit wir sicher gehen können, dass bereits alle Hitboxes gezeichnet wurden, wenn wir die Farbe ermitteln.
Im Drawevent passen wir mCol entsprechend an:
Jetzt folgen noch zwei Scripte, die sich um die Farbgebung und das Vergleichen der Farben kümmern:
d3d_selection_request()
Als Rückgabewert wird eine Farbe aus den Werten rot, grün und blau gebildet.
Grün und blau sind in diesem Fall statisch. Der Rot-Wert wird jedoch durch die Zählervariable "xCol" bestimmt.
Die Funktion kann daher 255 mal aufgerufen werden (Maximalwert).
255 auswählbare Objekte sollten normalerweise mehr als ausreichend sein, wenn nicht kannst du die grün und blau Werte auch variabel machen.
Dieses Script kommt ins Create-Event eines auswählbaren Objekts.
Da die Farbe der künftigen Hitbox als Wert zurückgegeben wird, speichern wir sie in einer Variable, ich benutze dafür "sCol" (Selection Color).
Ein "request" sähe also wie folgt aus:
Nachdem ich nun die ganze Zeit von Hitboxes geredet habe, zeig ich mal ein kleines Beispiel:
Angenommen, wir zeichnen in view[1] folgenden Würfel,
wäre die passende Hitbox dazu:
Wichtig: Hitboxes dürfen keine Texturen haben, da sie nur die zugewiesene Farbe haben dürfen.
Schreibt also einfach anstelle einer Textur "-1".
Auch die Benutzung von Lichtern oder Fog (Nebel) kann die Farben und somit das Ergebnis beeinflussen - stellt sie also vorher ab, und danach wieder ein.
Die Funktion "d3d_selection_get()" überprüft lediglich, ob "sCol" der Farbe mCol entspricht.
Zur Erinnerung:
sCol = Farbe der Hitbox, die durch ein "request" erhalten wird.
mCol = Farbe des Bildschirm-Mittelpunkts (befindet sich in "obj_color")
d3d_selection_get()
Wenn der Rückgabewert true ist, ist das Objekt angewählt, bei false nicht.
Nun sind alle Grundlagen vorhanden, und wir können uns jetzt allerlei Objekte basteln.
Zum Abschluss noch ein kleines Beispielobjekt.
Das Objekt soll eine einfache Kugel sein, die hell wird wenn wir sie mit der Maus berühren.
Create-Event:
Step-Event:
Draw-Event
GML-Quellcode
Bei mir sieht das Ganze dann so aus:

Das war's auch schon wieder. Im Anhang findet ihr wie immer eine ausführliche und auskommentierte Beispieldatei mit Anwendungsbeispielen, außerdem noch die Grundlagen-Datei, auf deren Basis ihr mit dem Tutorial arbeiten könnt.
Viel Spaß beim ausprobieren und Danke für's Lesen, hier noch ein paar Screenshots aus der Beispieldatei:
Die Technik wird hier benutzt um ...

... ein Produkt auszuwählen und die Dose aus dem Auffangbehälter zu nehmen

... die Blöcke auszuwählen und wegzuklicken (Ja, ganz offensichtlich an Minecraft angelehnt)

... den Schalter umzulegen, der wiederrum die Lampe anstellt