Sergiy Krutykov

Anzeige

In den oberen Abbildungen sieht man, dass der Tresor eine Platte mit 8-Puzzle auf sich hat, das zu lösen ist, wenn man den Tresor zu sich nimmt. Dabei können die Plättchen mit den Nummern mit einem Finger verschoben werden. Das Interessante ist, dass diese Plättchen gar nicht existieren, sondern dass das ganze Puzzle eine Textur ist, die über ein Quadrat gezogen ist. Als Ausgang für dieses Puzzle dient ein einziges Bild, das in der folgenden Abbildung zu sehen ist:

Man sieht sogar ein Dummy-Plättchen, welches so im Spiel gar nicht auftaucht. Also ist dieses Verschieben von Plättchen in OpenGL so implementiert, dass aus einer Textur eine andere generiert wird, die etwas andere Ordnung der Fragmente der ersten Textur aufweist, wie in der folgenden Abbildung dargestellt ist:

Bei diesem Vorgehen wird die Methode benutzt, die Render-to-Texture heißt, bei welcher ein gerendertes Bild direkt in eine Textur geschrieben wird.

Zum Umordnen von Plättchen wird ein unsichtbarer Framebuffer genommen (so wie im Unterabschnitt Interaktionen mit OpenGL-Objekten), der allerdings so definiert ist, dass sein Inhalt direkt in eine Textur geschrieben wird. In diesem Buffer wird sein Viewport auf seine volle Größe gelegt und auf ihm 8 gleich große (entsprechend jeweils genau ein Drittel von der Höhe und ein Drittel von der Breite des Viewports) Quadrate gezeichnet, die den ganzen Viewport ausfüllen, wobei jedes Quadrat die Ausgangstextur von oben bindet, allerdings jedes Mal in dem Fragment Shader auf eine andere Stelle von dieser zugreift. Wenn man die Quadrate an entsprechenden Stellen zeichnet, dann bekommt man automatisch am Ende des Vorgangs eine Textur mit neuem Zustand des Puzzles. Danach reicht es einfach die so generierte Textur wieder zu binden und beim Rendern von der Platte auf dem Tresor zu benutzen. Der graue Hintergrund an der Stelle in dem Puzzle von kein Plättchen vorhanden ist, entsteht dadurch, dass man glClearColor mit der grauen Farbe (vor dem Zeichnen der Plättchen) auf dem Framebuffer aufruft.

Interaktion mit dem Benutzer

Das Reagieren auf das Tippen oder das Ziehen mit dem Finger über den Touchscreen, wenn er das Puzzle löst, geschieht nach dem in Interaktionen mit OpenGL-Objekten beschriebenen Prinzip. Hier müssen offensichtlich die Plättchen auf einem unsichtbaren Framebuffer unterschiedlich gefärbt werden. Aber da diese Plättchen, wie oben bereits erklärt wurde, nicht existieren, muss hier eine etwas andere Methode angewandt werden. Analog zu der Darstellung des Puzzles selbst wird über die gleiche Platte des Puzzles eine Textur gezogen, die in neun gleich große Bereiche mit jeweils unterschiedlicher Farbe unterteilt ist. Die folgende Abbildung zeigt wieder den Tresor in normaler und "einfarbiger" Variante:

Außerdem ist die Klinke des Tresor auch gefärbt, damit der Benutzer beim Tippen darauf den Tresor öffnen könnte. Man sieht gleich den Vorteil dieser Methode: Man kann auf einem Tresor auch dann spielen, wenn er nicht exakt auf den Benutzer gerichtet ist. Allerdings sieht man auch, dass die Quadrate der Textur doch nicht ganz einfarbig sind, weil OpenGL diese interpoliert. Allerdings ist dies bei so kleiner Anzahl von Quadraten kein Problem, denn man kann die Farben so weit von einander liegend wählen, dass sie sich auch bei großer Ungenauigkeit, trotzdem nicht "überschneiden". Wenn aber eine große Genauigkeit gewünscht wird, kann man alternativ die Platte nicht texturieren sondern mit einem Gradient färben, welcher zum Beispiel von der linken oberen Ecke anfängt und nach rechts immer "roter" (also läuft die rote Komponente von 0 bis 255) wird und nach unten immer "grüner" (auch von 0 bis 255) wird. Damit könnte man die Koordinaten auf der Platte an der Stelle des Tippens gut erkennen. Wenn man zum Beispiel weiß, dass die Farbe (R,G,B) = (127, 127, 0) von glReadPixels zurückgeliefert wird, dann weiß man dass in der Mitte der Platte getippt wurde.


Page last modified on March 21, 2011, at 11:20 PM