Neues Optikboom-Shirt bestellbar

16. September 2009

Hallo Freunde! Ab sofort könnt ihr euch das neue Optikboom-Shirt mit folgendem Motiv bestellen. Dabei handelt es sich um einen Scherz, den ich mir erlaubt habe, indem ich Cyber teilweise als Wireframe-Modell dargestellt habe. Das Motiv trägt daher den Namen C-1000 mit Anlehnung an den Terminator T-1000, weil der teilweise ja “ähnlich” aussieht. Jedoch mit C für Cyber. Aber schaut selbst:

Yeah, das ist geil! Folgt hierfür folgendem Link:

cyber-e-razor.spreadshirt.de.

Es besteht auch die Möglichkeit, auf Anfrage individuelle Kombinationen aus T-Shirt-Typ und Motiv zusammenstellen zu lassen. Diese Kreationen tauchen dann unter der Kategorie “Individualshirts” auf. Einfach nachfragen.

Projektstatistik 08/2009

31. August 2009

Es tut mir leid, dass ihr solange nix mehr von mir gehört habt. Aber ich war in den letzten Wochen viel unterwegs, sowohl privat als auch beruflich. Seit Cyber laufen gelernt hat, habe ich mich bisher leider nicht wieder um die Weiterentwicklung kümmern können. Daher gab es im Juli auch keine Projektstatistik, weil sich ohnehin nix getan hat. Das soll sich natürlich jetzt im September wieder ändern, ganz klar.

Hier ist die aktuelle Tabelle, die sich zur vorigen Tabelle nicht nennenswert geändert hat:

Zeilen gesamt Nur Code Nur Kommentare Code mit Kommentaren Leerzeilen Nicht-Leerzeilen
118.334 50.993 36.838 3.132 27.371 90.963
100 % 43 % 31 % 3 % 23 % 77 %

(Zur vorigen Tabelle geht es hier.)

Für September habe ich mir vorgenommen, die bereits angesprochene Debugging-Konsole umzusetzen und bereits mit ein paar Spiel-spezifischeren Features zu beginnen. Dazu gehört vor allem ein Manager zur Verwaltung von Ingame-Objekten. Bis es soweit ist, ziehen wir uns halt nochmal Cyber rein, wie geil er läuft. Hihihihi.

Tank Wars

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

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)

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!

Projektstatistik 06/2009

30. Juni 2009

Wie ich bereits im vorigen Beitrag erzählt habe, war das Scripting-System hauptsächlicher Gegenstand meiner Entwicklung in den letzten Wochen. Hierfür sind knapp 2.000 Zeilen hinzugekommen (reiner Code). Mehr soll an dieser Stelle auch gar nicht dazu gesagt werden. Hier ist die aktuelle Tabelle:

Zeilen gesamt Nur Code Nur Kommentare Code mit Kommentaren Leerzeilen Nicht-Leerzeilen
116.323 50.157 36.157 3.086 26.923 89.400
100 % 43 % 31 % 3 % 23 % 77 %

(Zur vorigen Tabelle geht es hier.)

Das Scripting-System werde ich noch ein wenig überarbeiten und ein paar Bugs aufspüren, die sich womöglich noch darin versteckt halten. Danach werde ich mich an einem Animationssystem versuchen. Dann sollte es vielleicht wieder etwas interessanter werden. Mit Videos und Screenshots und so. Aber das dürfte noch etwas dauern. Bis dahin gibt es sicherlich noch einen Eintrag mit der dann aktuellen Projektstatistik. Tschau Kakao!

Ernie-Script (I/II)

29. Juni 2009

In der letzten Zeit habe ich mich darum bemüht, das Scripting-System mehr oder weniger fertigzustellen. Es funktioniert auch schon ganz hervorragend und die Sprache trägt den Namen Ernie-Script. Hahaha! Und zwar bekommt der Skriptschreiber keine Errors und Warnings an den Kopf geballert, sondern Ernies und Warnies, wenn er es nicht rafft, korrekt zu coden. Wie findet ihr das? Ich find’s geil! Ein ganz dicker Dank geht da an meinen Kollegen Milan “Marek” Karow, der die ausschlaggebende Idee hatte.

Die Sprache umfasst einige bekannte Schlüsselwörter mit vermutlich erwartungskonformer Bedeutung:

break continue do else elseif
false for function if repeat
return true until void while

Dann gibt es noch einige zusätzliche schlüsselwortartige Features wie zum Beispiel typeof, cast oder who. Was jedoch noch fehlt, ist die Möglichkeit, in einem Block lokale Variablen anzulegen, ohne globale Variablen zu überschreiben. Oder entsprechendes Gegenstück: Wenn auf globale Variablen zugegriffen werden soll, müssen diese entsprechend deklariert werden. Der Grund dafür, dass ich das noch nicht eingebaut habe, ist nämlich eben der, dass ich mich bislang noch nicht entscheiden konnte, welche dieser beiden Alternativen die geilere ist.

Neben den Schlüsselwörtern gibt es noch einige Operatoren, die ihr folgender Tabelle entnehmen könnt (nach Prioritäten sortiert):

Symbol Name Beispiel
. table entry selection obj.member
[] table entry selection obj[ expr ]
() function call foo( bar )

! not !expr
- unary minus -expr
+ unary plus +expr
& address of &obj
* dereference *ref

* multiply expr * expr
/ divide expr / expr
% modulo expr % expr

+ add expr + expr
- subtract expr – expr

< less than expr < expr
<= less than or equal expr <= expr
> greater than expr > expr
>= greater than or equal expr >= expr

== equal expr == expr
!= not equal expr != expr

&& logical and expr && expr

|| logical inclusive or expr || expr

^ logical exclusive or expr ^ expr

:= single assignment lvalue := expr

Habe ich was vergessen? Ich weiß es nicht. Achso: Bitweise and-, or- und xor-Operatoren werden bislang noch nicht unterstützt.

Für die meisten ist das jetzt vielleicht relativ uninteressant, aber in den näxten Tagen werde ich einen Download bereitstellen. Dann könnt ihr euch eine Testanwendung runterladen und selbst etwas mit Ernie-Script herumspielen.

Bis die Tage.

Shader- und Rendering-System (II/II)

19. Juni 2009

Na endlich, es ist soweit: Der zweite Teil über Shader- und Rendering-System ist fertig. Das hat nun aber wirklich lange auf sich warten lassen. Das lag vor allem daran, dass ich noch ein paar Probleme mit dem finalen Comic-Shader hatte. Zum Einen wollte ich zusätzlich zur Beleuchtung noch Schatteneffekte einbauen, aber das sieht bisher nicht wirklich toll aus. Insofern habe ich es jetzt doch erstmal rausgelassen. Zum Anderen werden beim Mischen der verschiedenen Material- und Beleuchtungsfarben auch die Alphawerte entsprechend gemischt. Das führte dazu, dass unter bestimmten Umständen der Alphawert gewisse Pixel transparent erscheinen ließ. Ein solches Resultat könnt ihr im folgenden Screenshot sehen:

Fehler in Shader

Um dem Problem entgegenzuwirken, muss entweder das “Alpha-Blending” komplett abgeschalten werden. Das führt jedoch dazu, dass keine transparenten Gegenstände mehr angezeigt werden können, bzw. solche Gegenstände würden halt einfach nicht transparent sondern komplett opak dargestellt (opak ist das Gegenteil von transparent). Oder aber im Shader wird der Fall abgefangen, dass sich die gemischten Farbinformationen auf die Alphawerte auswirken. Das kann jedoch — je nach Hardware — enorme Leistungseinbußen bedeuten. Dennoch ist die zweite Alternative die “bessere”, erlaubt sie schließlich weiterhin den Einsatz von transparenten Gegenständen.

Ein entsprechendes korrektes Resultat sieht dann ungefähr so aus:

Comic-Style-Shader

Ist doch schon recht hübsch, oder? Damit ihr euch ein noch besseres Bild machen könnt, gibt es noch eine kleine Anwendung zum Runterladen, bei der ihr euch das Cyber-Modell und den Comic-Style-Shader auf eurem eigenen Rechner reinziehen könnt. Falls es Probleme bei der Darstellung geben sollte, sagt mir bitte Bescheid. Aber ihr solltet die Minimalvoraussetzungen bezüglich Hard- und Software beachten:

  • 3D-beschleunigte Grafikkarte mit Shader-Modell 2.0
  • DirectX 9.0c

Aber entsprechende Fehlermeldungen bei Nichtvorhandensein der Voraussetzungen sollten in jenem Fall in der Log-Datei “logger.html” zu finden sein, die beim Starten der Anwendung erzeugt wird.

Tja, so viele Worte habe ich jetzt ja eigentlich gar nicht zu den technischen Aspekten von Shader- und Rendering-System verloren. Aber Screenshots und Downloads sollten für die meisten von euch ohnehin viel interessanter sein, denke ich. Darüber hinaus habe ich im ersten Teil ja bereits den technischen Aufbau erläutert. Hinzugekommen ist jetzt hauptsächlich noch der Szenegraph, der die komplette darzustellende Szene in kleine “Knoten” zerlegt, um diese Knoten nach Geometrie- und Materialeigenschaften sortieren zu können. Dadurch werden die einzelnen 3D-Modelle größtenteils zerpflückt. Das macht aber nix, denn im fertigen Bild ist das nicht zu sehen. Aber durch das Zerpflücken der 3D-Modelle und Sortieren der so erzeugten Knoten nach ihren Geometrie- und Materialeigenschaften werden Zustandswechsel der Grafikhardware minimiert. Diese Zustandswechsel sind nämlich maßgeblich von eben diesen Eigenschaften abhängig. Dieser durchaus gängige Ansatz  der Minimierung von Zustandswechsel der Grafikhardware bringt dann derbste Leistungsvorteile mit sich.

Projektstatistik 05/2009

31. Mai 2009

Oh Mann, ich bin immer noch nicht dazu gekommen, den zweiten Teil über Shader- und Rendering-System zu verfassen. So ein Mist! Aber es ist nicht so, dass ich diesen Monat nix geschafft hätte. Da gibt es ja jetzt diese T-Shirts, die man online bestellen kann. Das Scripting-System habe ich auch weiterentwickelt und nahezu fertiggestellt. Da könnt ihr euch bald eine kleine Testanwendung herunterladen, bei der man über die Windows-Konsole Skripte ausführen kann. Aber erst will ich dann doch den zweiten Teil über Shader- und Rendering-System veröffentlichen. Mal sehen, wann ich dazu komme. Näxte Woche bin ich ja auch schon wieder nicht da.

Aber es ist schon erstaunlich, wie sich so kleinere Programmiersessions zwischendurch im Monat aufsummieren. Im Mai habe ich trotz Umzug und allgemein wenig Zeit 1.500 Zeilen reinen Code verfasst:

Zeilen gesamt Nur Code Nur Kommentare Code mit Kommentaren Leerzeilen Nicht-Leerzeilen
111.766 48.059 34.860 2.963 25.884 85.882
100 % 43 % 31 % 3 % 23 % 77 %

(Zur vorigen Tabelle geht es hier.)

Die hinzugekommenen Code-Zeilen sind fast ausschließlich in das Scripting-System eingeflossen. Was das Scripting-System bisher noch nicht unterstützt — aber unterstützen wird, wenn es fertig ist —, sind Objekte in Form von Strukturen oder Arrays und selbstdefinierte Funktionen, die ihrerseits wieder Skript-Code enthalten. (“Externe” C++-Funktionen können bereits eingebunden werden.)

Ich brauche übrigens noch einen geilen Namen für die Sprache des Scripting-Systems, in der die Skripte verfasst sind. So sehr viele Gedanken habe ich mir darüber noch nicht gemacht, aber ich dachte vielleicht an “Tamer” oder “Flinsch” — vielleicht auch sowas wie “GoaScript”.

Merchandizing-Shop endlich online

18. Mai 2009

Na endlich! Ab sofort könnt ihr euch extrem geile T-Shirts mit Cyber-E-Razor-Motiven online bestellen. Der Verdienst fließt direkt in die Entwicklung des Jump-and-Run-Games ein. Weil Tamer nämlich sagt, das erzeugt Druck! Es gibt drei Kategorien: In der Basic-Line werden die schon sehr oft gesehenen T-Shirts mit eingescannten Cyber- und Elsa-Posen zu finden sein. Die zweite Kategorie — Bug-Shirts — beinhaltet Shirts mit coolen Motiven, die durch Bugs zufällig entstanden. Die dritte Kategorie ist einfach Optikboom. Sau geil!