Archiv für Juli 2009

Tank Wars

Sonntag, 26. Juli 2009

Freund Münninger hat sich einen neuen Läppi gezogen und er bat mich darum, das bisher allergeilste Spiel Tank Wars hochzuladen, so dass er es sich herunterladen und auf seinem neuen Gerät zocken kann! Das mache ich natürlich gerne! Hier ist es, Münninger: Tank Wars.

Tank Wars habe ich vor einiger Zeit programmiert. Das geschah damals noch alles unter DOS, daher ist die Grafik auch so “geil”. Aber es bockt ohne Ende, das können alle bestätigen. Ein paar Bekannte erzählten mir mal, dass sie sich wunderten, dass der Rundenzähler nach einiger Zeit wieder bei 0 anfängt zu zählen. Die hatten tatsächlich 256 (und mehr) Partien am Stück gezockt. Wahnsinn! Falls ihr es nicht zum Laufen bekommt, versucht es vielleicht mit DOSBox. (Dafür empfehle ich aber direkt die grafische Benutzeroberfläche D-Fend Reloaded zu benutzen, da ist DOSBox inklusive.) Sound gibt es übrigens keinen. Das ist aber nicht schlimm, denn wenn man mit ein paar Leuten und einer Kiste Bier den Abend damit verbringt, Tank Wars zu zocken, sollte sowieso viel besser etwas Musik im Hintergrund laufen.

Cyber lernt laufen

Freitag, 24. Juli 2009

Juhu, heute gibt es ein neues Video plus einen neuen Download. Denn Cyber hat endlich laufen gelernt. Das bedeutet, dass ich nun ein Animationssystem für die 3D-Modelle gebaut habe. Zum Testen habe ich mich an einer kleinen Animation von Cyber versucht, wie er läuft — und zwar sehr easy und entspannt und überaus cool, wie alle finden. Diese Animation basiert komplett auf ganzrationalen sowie trigonometrischen Funktionen. Üblicherweise werden solche Animationen zwar durch Key-Frames realisiert: Das konkrete Aussehen des 3D-Modells wird für bestimmte Zeitpunkte der Animation durch Drehen und Verschieben der einzelnen Joints (Gelenke des “Skeletts” im 3D-Modell) modelliert. Das Aussehen der dazwischen liegenden Zeitpunkte wird dann per Interpolation berechnet. Diesen Key-Frame-basierten Ansatz wird mein Animationssystem später vielleicht auch noch unterstützen. Aber bislang werden die Rotationen und Verschiebungen der Joints durch Funktionen abgebildet (Stichwort Forward Kinematics). Die Resultate sehen so nämlich zumindest zum Teil viel schöner aus als die einer (linearen) Interpolation. Zieht euch die erste Testanimation rein:

Get the Flash Player to see the wordTube Media Player.

Cyber ist jawohl die coolste Sau, oder?

Als nächstes werde ich wohl kleinere “Baustellen” der Engine ausbessern und noch eine auf Ernie-Script-basierende Debugging-Konsole  einbauen, wie man sie sonst eher von Ego-Shootern kennt. (Der Begriff Engine gefällt mir ja eigentlich nicht. Aber wie will man das sonst nennen? Framework? Ist doch auch kacke, zumal es ja mehr als “nur” ein Framework ist. Naja, egal.) Aber so eine Konsole ist überaus nützlich. Sie enthält zum Beispiel auch sämtliche Einträge, die in die Log-Datei geschrieben werden. Wie dem auch sei — dann ist der allgemeine Teil auch hoffentlich bald abgeschlossen, so dass ich mit den ersten “Cyber-spezifischen Features” anfangen kann. Bor, da liegt aber auch noch ein ordentlicher Batzen vor mir, sage ich euch! Schubidu.

Ernie-Script (II/II)

Dienstag, 07. Juli 2009

Heute gibt es wieder einen Download. Dabei handelt es sich um eine Testanwendung zum Ausprobieren der neu entwickelten Skriptsprache Ernie-Script: Hier bin ich! Yeah, Baby! Ernie-Script vereint mehrere Eigenschaften verschiedener Sprachen. Im Allgemeinen folgt die Sprache der C++-Syntax. Zuweisungen ähneln aber eher denen, wie sie mit dem :=-Operator in Pascal zu finden sind. Die Konkatenation von Strings über zwei Punkte (..) mag der ein oder andere von Lua kennen. Um nur ein paar Aspekte zu nennen.

Beim Start der Anwendung öffnet sich ein Windows-Konsolen-Fenster mit etwas Text und einer Eingabeaufforderung. Wenn man jetzt zum Beispiel who; eintippt, wird der gesamte Inhalt des globalen Namensraums ausgegeben:

Allriggedy Right und Tiggedy Tight! Da sind ja bereits zwei Objekte std und math vom Typ Table. Bei denen handelt es sich um vordefinierte Funktionsbibliotheken (auf C++-Basis). Die Anweisung std.out( "Hello World!" ); ruft nun zum Beispiel die Funktion out der Bibliothek std auf. Bei dieser Anweisung handelt es sich dann auch schon um ein vollwertiges Hello-World-Skript. Neben der soeben angesprochenen Funktion beinhaltet jene “Standardbibliothek” bislang keine weiteren Features von Bedeutung. Die bisherigen Funktionen der Mathebibliothek sind die folgenden:

abs ceil floor exp log
log10 fmod sin cos tan
sinh cosh tanh asin acos
atan atan2 sqrt pow

Es besteht natürlich auch die Möglichkeit, eigene, auf Ernie-Script basierende Funktionen zu definieren. Im folgenden Beispiel wird eine Funktion zur Berechnung der Quadratwurzel definiert, dessen entscheidenden Code wir bereits bei der Vorstellung des Syntaxbaums und des Builders kennen gelernt haben:

Das Skript zur Definition von my_sqrt erstreckt sich über mehrere Zeilen. Hierfür mussten am Zeilenende jeweils drei Punkte eingefügt werden, sofern das Skriptende noch nicht erreicht war. Das ist nicht Ernie-Script-spezifisch sondern ein Feature der Testanwendung, bei der es sich schließlich nur um eine einfache Konsolenanwendung und nicht um eine volle IDE mit komfortablem Texteditor handelt. (Aus Sicht von Ernie-Script existieren Zeilenumbrüche oder Sachen dieser Art sowieso nicht.) Ein kleiner Test der Funktion my_sqrt zeigt ihr korrektes Verhalten (zumindest für die Zahl 2, hahaha).

Da die vordefinierten Bibliotheken nix weiter als normale Ernie-Script-Objekte vom Typ Table sind, können sie auch nachträglich noch geändert werden. So wird im folgenden Beispiel der Mathebibliothek eine weitere Funktion round hinzugefügt:

Geil, wie Ernie-Script nun mal ist, sind rekursive Funktionsaufrufe natürlich auch kein Problem. Als Beispiel bietet sich hierfür natürlich die Fibonacci-Funktion an, die auch direkt getestet wird. Geil:

Die Skriptsprache hat an einigen Stellen noch ein paar Macken. Insbesondere sind einige Fehlermeldungen noch nicht intuitiv genug auf entsprechende Fehler (Ernies) abgestimmt. Ferner ist der Sprachumfang noch deutlich erweiterbar. Wie ich bereits angesprochen hatte, gibt es noch keine Möglichkeit zur expliziten Deklaration von lokalen bzw. globalen Variablen — Bitoperationen sind ebenfalls noch nicht möglich. Über eine Erweiterung der möglichen Typen (bislang Void, Float, Integer, Boolean, Character, String, Table, Function und Reference) habe ich natürlich auch schon nachgedacht.

Bis die Tage!