Archive for the ‘Skripten’ Category

React To Streams

Donnerstag, 21. August 2008

Hier kann das Custom Code-Object „ReactToStreams“ herunter geladen werden: Download-Seite

Es ist dafür gedacht, Ströme zu simulieren, die Gegenstände sowie Spielfiguren mit sich mitführen können. Also z. B. Laufbänder, Rolltreppen, Treibsand, Flüsse/Bäche oder Lava. Das Code-Object wurde aus der Notwendigkeit heraus geschrieben und könnte sicher um einiges verbessert und erweitert werden. Tatkräftige Verbesserungen sehe ich daher sehr gerne. Da ich keiner Programmiersprache wirklich mächtig bin, bin ich trotzdem ziemlich stolz auf meine Leistung.

Das Zip-Archiv enthält die Demo-Datei für das SGDK2, sowie ein PDF das in englisch die Anwendung und Modifizierung des Code-Objects erklärt. Ich habe mir große Mühe gegeben, alles Schritt für Schritt und bebildert zu erklären. Sollten trotzdem Fragen auftauchen, können sie hier als Kommentar, oder auch im Forum gestellt werden.

(Thunder)clouds

Mittwoch, 12. März 2008

Jetzt gibt es auch Wolken. Darunter sind auch Gewitterwolken, die gefährliche Blitze in alle Richtungen schleudern. In welche, das weiß man erst hinterher. Hier als Schneeflockenfelder dargestellt, sind jetzt auch „Frostfelder“ eingebaut. Wenn das Schiff hindurchfährt und dabei schon vorher von einer Wolke nass ist, dann gefriert das Wasser zu einem Eispanzer. Es funktioniert auch alles tadellos.

Zu den Blitzen gehört natürlich auch, dass sie das Schiff beschädigen. Wenn das Schiff getroffen wurde blinkt es drei Mal rot auf und die „Gesundheit“ reduziert sich um 1. Natürlich sind das alles vorläufige Anzeigemethoden und Werte, aber es klappt.

Thank you for the music

Freitag, 7. März 2008

Ich habe einen kleinen Fehler ausgebessert, der mir noch gar nicht weiter aufgefallen war. Wenn der Schneesturm einsetzt, wird die Hintergrundmusik ausgeblendet und das Blasen des Sturms lauter gedreht. Nach einer Weile dreht sich das um, der Sturm verschwindet und die Musik kommt wieder.

Allerdings wird die Lautstärke bis zu ihrem Maximalwert aufgedreht. Sehr störend falls man das Spiel eher leise gedreht hatte. Aber durch ein verzwicktes Konstrukt mit vier Map Flags ist es jetzt so geregelt, dass die ursprüngliche Lautstärke der Musik gespeichert wird und später auch wieder nur bis dahin aufgedreht wird. Puh.

Freeze!

Mittwoch, 5. März 2008

Leichter als erwartet fiel es mir, zwei zusätzliche Zustände für den Spieler zu implementieren. Wenn er durch eine Wolke fliegt, wird er nass. In diesem Zustand ist er schwerer, und sofern er nicht entgegensteuert, sinkt er langsam nach unten. Nach einer Weile wird er dann wieder trocken.

Wenn er aber im nassen Zustand durch ein ›Frostfeld‹ fliegt, dann gefriert das Wasser und das Schiff vereist. In diesem Zustand ist er noch etwas schwerer.

Nach einer Weile schmilzt das Eis und das Schiff ist wieder nass, und danach auch bald wieder trocken, solange es nicht durch weitere Wolken oder Frostfelder fliegt.

Es ging wirklich recht flott zu scripten, und ich muss eigentlich nur noch die finalen Grafiken für Schiff und Wetterphänomene erstellen.

Rotation Issues

Montag, 3. März 2008

So. Endlich hatte ich Zeit die Bewegungsdarstellung des Spielers zu Ende zu schreiben. Sie arbeitete schon ziemlich gut, aber noch nicht gut genug. Manchmal funktionierte die Animation der Drehungen nicht genau. Es kam vor, dass der Spieler nach rechts flog, aber das Zeppelin in einem Frame verharrte wo das Schiff seitlich gedreht war. So als ob es seitwärts flöge. Da waren nur ein paar minimale Anpassungen nötig.

Echt krass worauf man bei Scripten alles achten muss. Jede kleinste Möglichkeit muss durchdacht und beschrieben sein, sonst tritt halt sowas auf. Ich hatte nicht daran gedacht, dass man beim Spielen manchmal bloß kurz auf einer Taste bleibt, so dass eine Drehung nur halb ausgeführt wird. In meinem Skript fehlte lediglich die kleine Regel, dass wenn der Spieler nach links fliegt, und seine Figur auch nach links ausgerichtet ist, aber nicht Frame 0 gezeigt wird, wieder zu Frame 0 zurück-animiert wird. Den entgegen gesetzten Fall hatte ich berücksichtigt.

Solidity Definitions

Dienstag, 29. Januar 2008

Zur Erklärung: Tile Shapes beschreiben die Form von soliden Dingen im Spiel, die keine Spielfiguren sind. Obwohl ein Level nur aus Hintergrundgrafiken aufgebaut ist, können die Spielfiguren mit ihnen interagieren. Das erste was man in dieser Form kennenlernt, ist der Erdboden, auf dem der Spieler steht. Tiles, die Boden symbolisieren, sind gewöhnlich vollkommen undurchlässig, das heißt solide. Wenn man sich das mal in Farben vorstellt, wäre das Boden-Tile vollkommen schwarz, während ein durchlässiges Tile wie z.B. der Himmel weiß wäre.

Tiles sind immer viereckige Grafiken, aber meistens sind zur Interaktion auch andere Formen gewünscht, wie Hügel zum Beispiel. Einen einfachen Hügel kann man hinaufgehen, darauf stehen und auch wieder hinuntergehen. Das macht zwei weitere Formen: die linke und die rechte Seite des Hügels. Ich gehe in meinen Beispielen davon aus, dass der Spieler von links nach rechts durch den Level läuft. Wenn er auf den Hügel hinauf will, muss er (diagonal) nach oben laufen können. Stellt euch eine Linie vor, die von der unteren linken Ecke des Tiles in die obere rechte Ecke läuft. Die entstandene untere Hälfte des Tiles wird mit Schwarz gefüllt, weil es ja Hügelerde ist, die obere Hälfte ist weiß. Beim Abstieg ist es umgekehrt: Die Diagonale verläuft von links oben nach rechts unten, die untere Hälfte ist schwarz.

Nun kommt es manchmal vor, dass im Spiel auch Höhlen existieren. Der Spieler läuft durch einen Gang, während über und unter ihm Erde ist. Wir haben noch kein Tile kennen gelernt, dass eine an- und absteigenden Höhlendecke darstellen kann. Von der Art her brauchen wir die selbe Form wie beim Hügel: zwei Tiles die diagonal geteilt sind. Aber diesmal werden die oberen Hälften mit Schwarz gefüllt.

Früher oder später musste ich mich auch mit dem Thema Tile Shapes beschäftigen. Die mitgelieferten sind für den Anfang gut geeignet, aber in jedem komplexeren Spiel tauchen Sonderformen auf. Vor allem da ich gleich mal angefangen habe Felsen-Tiles zu malen, die nur zur Hälfte solide sind (der Neunerblock). Egal ob man hierfür nun angibt, dass das Tile ganz durchlässig oder ganz solide sein soll, glücklich wird man damit nicht. Extrem seltsam sieht es aus, wenn man solide wählt, dann kann der Spieler die Felsen nie berühren sondern läuft in der Luft herum.

Für diesen Fall müssen neue Tile Shapes erstellt werden, und SGDK2 unterstützt dies hervorragend. Mit Absicht werden anstatt eines Schwarz-Weiß-Bildes zur Definition mathematische Formeln benutzt. Das macht es für jemand mit nicht so guten Mathekenntnissen schwerer, die Vorteile allerdings sind groß: Die Berechnung verläuft viel schneller wenn die Position des Spielers mit der errechneten Form des Tiles verglichen werden, als wenn das Spiel Pixel-Berührungen auslesen muss. Außerdem können mit Funktionen auch alle erdenklichen Formen bereitgestellt werden, z.B. Kreise und Kurven aller Art, es ist also keine Einschränkung.

Mistraal Scripten 6Ich habe also angefangen, bin aber noch nicht damit fertig. SGDK2 braucht für die Berechnung einer Tile Shape vier Funktionen: für jeden Eckpunkt der soliden Form eine. Es wirkt zwar einfach, wenn man z.B. für einen Punkt in der Bildmitte ›Höhe durch 2‹ angibt, aber es existieren dabei Feinheiten, die ich noch nicht ganz verinnerlicht habe.

Coordinating Life

Montag, 28. Januar 2008

Beim Koordinieren der verschiedenen Events (Samen-Berührung, Moos-Erscheinen, Pflanzenwachstum) hatte ich einige Schwierigkeiten. Am einfachsten hätte ich es gefunden, wenn ein Sprite Eigenschaften und Parameter eines anderen Sprites abfragen könnte. Leider geht das nicht wirklich, zumindest nicht in dem Rahmen in dem ich es bräuchte.

Mistraal Scripten 1Ich hatte sehr viele Ansätze ausprobiert. Mit meinem Latein war ich schon lange am Ende (es war ja schon länger klar, dass beim erfolgreichen Abwurf zusätzliche Events ausgelöst werden müssen, unabhängig von der Grafik). Bis ein Hinweis aus dem Forum kam, es doch mal mit Map Flags zu versuchen.

Das Ganze läuft nun folgerndermaßen: Jede Quelle hat eine ID, und jede Pflanze ebenfalls. Diese beiden Zahlen muss ich für jedes Sprite per Hand eintragen. Wird nun eine Quelle von einem Samen berührt, wird eine bestimmte Flag aktiviert. Die Pflanzen ihrerseits fragen die ganze Zeit ab, ob ihre spezifische Flag aktiv ist. Wenn ja, wird die Animation ausgelöst und die Flag inaktiv gesetzt.

Mistraal Scripten 5Es ist eine recht einfache Lösung, warum habe ich das nicht von Anfang an so gemacht? Die Methode ist zwar einfach, der große Nachteil an der gesamten Sache ist jedoch, dass ich jedem Sprite seine ID per Hand eintragen muss. Und das können im gesamten Spiel dann doch schnell mal hunderte werden. Hinzu kommt dass ich dann höllisch aufpassen muss, keine Pflanze zu einer anderen Quelle zu verschieben, weil sie da vielleicht besser aussieht und ich an der ersten schon genug habe. Wenn ein Sprite mit einer falschen ID irgendwo sitzt, wird es reagieren, wenn seine Flag aktiv wird. Und dann steht da eine Pflanze wo der Spieler vielleicht noch nicht einmal war.

Title Screen

Montag, 28. Januar 2008

Mistraal Start ScreenAls vorerst letzten Schritt erstelle ich einen Startbildschirm. Ich brauche ihn aus verschiedenen Gründen. Einmal will ich mit einer Grafik die Stimmung des Spiels transportieren, und gleichzeitig das Logo des Spiels zeigen. Dann brauche ich ihn um eine längere Wartezeit am Anfang zu kaschieren, während die Grafiken geladen werden. Und dann hat man noch vor Spielbeginn die nützliche Möglichkeit, die Musik lauter oder leiser zu stellen. Wer sich ob des als Ziersymbol verwendeten chinesischen Zeichens wundert, das habe auch genommen damit das Spiel international besser verständlich ist. Wem ein Mistral nichts sagt, der kann mit dem Zeichen für Wind doch schon mehr anfangen. Um den gehts ja auch im Spiel.

Mistraal Scripten 7Zuerst habe ich noch keinen Plan davon wie ich mit den Mitteln von SGDK2 ein Menü erstellen soll. Zum Glück ist ein Sample Game dabei, mit einem umfangreichen Menü das ich studieren kann. Ich brauche aber noch zusätzliche Hilfe aus dem Forum, bevor ich dem ausgeklügelten Konzept auf die Schliche komme. Um z.B. die Pfeile darzustellen, mit denen man unterschiedliche Punkte anwählen kann, sind Mapped Tiles verwendet worden. Ein Counter reagiert auf die Pfeiltasten-Eingaben des Users, und von diesem Counter ist dann abhängig, welcher Frame eines Tiles gezeigt wird. Das Tile muss z.B. transparent sein, wenn der Pfeil gerade an einem anderen Menüpunkt ist, es muss den Pfeil selber darstellen, und eventuell noch eine andersfarbige Version des Pfeils.

Mistraal Start Screen VolumeMit diesem Wissen fällt es mir relativ leicht, ein eigenes Menü zu erstellen, das auf andere Art, doch mit der gleichen Technik funktioniert.

Finally good Zeppelin movements

Dienstag, 22. Januar 2008

Zeppelin-AnimationKurz vor Schluss schreibe ich noch mal das gesamte Bewegungs-Skript für das Zeppelin um. Der geneigte Leser erinnert sich eventuell, dass das Luftschiff bei einer Richtungsänderung langsam umschwenkt. Wenn es nach oben oder unten fährt, neigt sich der gesamte Flugkörper. Während des gesamten Projektes habe ich immer und immer wieder an diesem Skript gearbeitet, und es doch nie zum 100%-igen Funktionieren gebracht. Fünfmal ineinander verschachtelte If- und Else-Schleifen habe ich zwar in anderen Skripten gesehen, konnte aber doch nie das Mysterium entschlüsseln.

Mistraal Scripten 8Die ganze Zeit über fehlte auch noch ein wichtiges Element: Das Schiff war nicht in der Lage, sich zu drehen, während es sich gerade in Schräglage befand. Natürlich bewegte es sich so, wie es der Spieler wollte, aber die Bilder passten nicht ganz überein. Ich hatte dutzende verschiedene Ansätze, wie ich es auf diese oder jene Weise umgehen oder doch vielleicht lösen konnte, aber nichts klappte.

Mistraal Scripten 4Dann, fast am Ende der Zeit, habe ich das Gefühl die Monate des Trial-and-Error-Skriptens haben meine Programmier-Fähigkeiten unterbewusst verbessert. Nach Wochen packe ich ein altes Skript noch mal an, das nicht laufen wollte, und siehe da! Es funktioniert.

Ganz genau so wie hier. Ich skizziere eine andere Struktur, vereinfache, probiere aus – und es klappt. Halleluja.

Freezing Rocks

Dienstag, 15. Januar 2008

Felsen-Tileset frozenNachdem das Felsen-Tileset steht und auch der Schneesturm funktioniert, ist der nächste logische Schritt, alles zu vereisen. Es war nicht mal sonderlich aufwändig, was mich sehr freut.

Wie das ganze technisch umzusetzen ist, hat mich schon länger beschäftigt. Meine erste Idee war, per Skript das verwendete Tileset auszutauschen. D.h. ich würde meine gesamte Karte ganz normal bauen, und nach dem Schneesturm würde das Spiel von einer Grafikdatei zur nächsten wechseln, von den normalen Felsen zu den gefrorenen. SGDK2 unterstützt das leider nicht. Aber ich fand im Forum eine andere Lösung, die ich zuerst wegen des hohen Aufwands verwarf, später dann aber doch darauf zurückkam.

Ich musste für jedes einzelne Felsen-Tile eine Mini-Animation (Mapped Tile) erstellen. Zu diesem Zeitpunkt hatte ich 35 normale Tiles und 12 für die schwebenden Felsen. Da ich nur in der vordersten Ebene Glanzpunkte und Schattendetails habe, verdoppelte sich die Gesamtzahl der zu erstellenden Animationen auf 94.

Die Arbeit bestand darin, jedes Tile anzuwählen, daraus ein Mapped Tile zu machen, ihm einen Counter zuzuweisen und dann in der endlosen Liste nach dem passenden vereisten Gegenstück zu suchen. Dieses wurde als zweites Frame der Animation eingefügt. Das Programm reagierte aufgrund der hohen Anzahl der Tiles in der Liste und ihrer Größe (128×128 Pixel) schon ziemlich lahm.

Den zugewiesenen Counter brauchte ich hierfür: Sobald der Schneesturm ungefähr bei der Hälfte seiner Lebensdauer ist (da ist er am dichtesten und der Spieler kriegt nichts mit), wird der Counter von 0 auf 1 umgeschaltet. Da die Animation mit dem Counter verknüpft ist, springt sie von Frame 0 (normaler Fels) zu Frame 1 (vereist). Das war es auch schon.