Hallo und Willkommen zu meiner kleinen Projekteinführung zu Simple-2D-Engine.
Um was für ein Projekt handelt es sich?:
Grob gesagt ist es ein 2D Game Maker. Es gibt einen eigenen GameEditor (MapEditor, DatabaseEditor), sowie einen Game Launcher, der aus verschiedenen Gründen nun bald zum 3. mal komplett neu Aufgesetzt wird. Hierbei setze ich voll und ganz auf Qt, welches das Framework sowohl für den Editor, als auch für den Game Launcher, ist. Alle Game relevanten Daten werden als XML Dateien gespeichert, und zu beginn des Spiels komplett in den Speicher geladen. Bisher unterstütze ich noch kein Streaming (auch nicht bei Maps), was aber auch den Grund hat, das es bisher noch nicht nötig ist.
Sprache, Framework und Sonstiges:
Das komplette Projekt ist in C++ geschrieben und nutzt QT 5.1.0, sowie boost 1.53.0. Zum Programmieren wird VisualStudio 2012 Professional genutzt.
Was ich erreichen möchte:
An erster Stelle ist das Ganze ein Lernprojekt, allerdings möchte ich hier auch etwas mit erreichen. Ich möchte den Leuten, die meine Engine als Grundlage für ihre Spiele nutzen, ein möglichst mächtiges und verständliches Tool mit an die Hand geben. Das oberste Ziel im Moment ist die Fertigstellung des Game Editors, bzw die Fertigstellung der ersten Version. Das hier im späteren Verlauf noch weitere Änderungen und Erweiterungen auftauchen ist sicher!
Unterschiede zum Maker:
Es wird kein RPG Maker Klon! Mein Ziel ist es eine eigenständige OpenSource Plattform zu erstellen. In den ersten Versionen wird es auch keine ScriptEngine geben, da diese:
1. sehr viel Zeit benötigt
2. vom logischen Ablauf eher ganz nach hinten gehört
3. keine Priorität besitzt.
Vor allem gibt es in meiner Engine kein "Event" Denken. Der Maker sieht alles, was erstellt wird, als Events. D.h. sind diese auf der Map platziert, werden sie auch dort näher beschrieben (mit Event Code; Call Befehle lasse ich hier mal außen vor). Hier sind Dinge, die auf der Map platziert werden, bereits fertig definiert, und lediglich eine Kopie ihrer Schablone. Die Schablone wird über die Database angepasst. Änderungen betreffen JEDE dieser Kopien. Wer schon einmal Object Orientiert programmiert hat, wird sich etwas darunter vorstellen können, und es auch zu schätzen wissen!
Es muss nicht für jedes Event die Variabeln angepasst werden, nein, das Object besitzt seine eigenen Variabeln!
Das ist z.B. einer der Gründe, warum es anfangs keine ScriptEngine geben wird, da es noch nicht komplett absehbar ist, welche Änderungen mir bis dahin noch einfallen
Der 2. große Unterschied ist das Mapping allgemein. Es gibt keine Chipsets, sodass man zu jeder Zeit die komplette Auswahl aus seinen bereits importierten Tiles hat.
Bisher erreichtes:
Ich erreiche bald mit dem Game Editor meine erste Alpha und kann folgende Features nennen:
MapEditor:
Das Mappen
Gemappt wird mit der Maus. Hierbei gibt es 2 verschiedene Methoden Tiles zu platzieren. Einmal den normalen Stift (mapt 1 Tile) oder den Filler. Der Filler ist das äquivalent zum Paint Farbeimer. Man hat ebenso die Möglichkeit sich auf beide Maustasten unterschiedliche Tiles zu legen. Gemappt wird auf bis zu 100 Ebenen (wobei ich das ganze nicht empfehlen würde, so viele Ebenen zu verwenden), sodass man mit transparenten Tiles mehr als genug Möglichkeiten hat.
Zusätzlich gibt es AutoTiles. Hierbei zitiere ich mich mal selbst aus meinem Wiki:
Zitat
Platzieren von Objecten
Der 2. Mapping Modus sind die Objecte, die man auf der Map platziert. Hierbei lässt sich natürlich die Richtung und Position bestimmen. Ob ich dem Ganzen noch einen Collision Detector spendiere (sodass keine 2 BoundingRects von Objecten sich überschneiden können) oder ob ich es sein lasse, dazu mache ich mir im späteren Verlauf noch Gedanken. Ich tendiere allerdings dazu, den User nicht allzu sehr zu beschneiden, und das solche Überlappungen durchaus möglich sein sollten.
ScriptPoints (noch nicht implementiert)
ScriptPoints sind Bereiche auf der Map, die bei Kollision ausgelöst werden. Dabei wird sich bestimmen lassen, ob nur durch einen Spieler oder NPC. ScriptPoints werden vor allem für Teleports zwischen den einzelnen Maps genutzt. Allerdings wird es auch die Möglichkeit geben, den ScriptPoints eigene Scripts zu geben, die dann ausgeführt werden.
DatabaseEditor:
TileDatabase
Über die TileDatabase lassen sich die Tiles, welche man zum Mappen verwendet bearbeiten. Man hat die Möglichkeit eine transparente Farbe und die Passierbarkeit festzulegen. Passierbarkeit kann man in 4 Richtungen bestimmen.
AutoTileDatabase
Mit der AutoTileDatabase lassen sich, aus bereits erstellten Tiles, AutoTile-Sets zusammen klicken, welche man ebenso zum Mappen verwenden kann, und die sich beim Mappen selbst anpassen.
SpriteDatabase
Die SpriteDatabase ist nicht sonderlich spektakulär. Man importiert, wie bei den Tiles auch, seine Grafiken und vergibt eine transparente Farbe. Sprites werden für Animationen benötigt.
AnimationDatabase
Jedes WorldObject benötigt mindestens 4 Animationen, eine für jede Richtung. Hierbei ist es egal, ob die Animation aus einem Frame oder 100 besteht. In Animationen kann man Sprites verschieben, rotieren und vergrößern/verkleinern. Dabei hat man bei jedem Frame die Kontrolle darüber, wie lange er dauert. Für die Interessierten, hier mal ein kleines Video, das im Grunde das zeigt, was man machen kann (natürlich nicht alles).
Animation Video
WorldObjectDatabase
WorldObjects sind praktisch statische Objecte, die auf der Map herum stehen. Sie werden von jeglichen Move- und Scriptupdates ausgeschlossen, haben also keine Möglichkeit selbst etwas zu tun. Ein typisches WorldObject ist eine Truhe, die erst etwas tut, wenn jemand mit ihr interagiert. Jedoch wird ein WorldObject durchaus sein eigenes Script besitzen können.
DynamicObjectDatabase (noch in Arbeit)
Das sind praktisch NPCs und alles was auf der Map von selbst etwas machen soll. Typisches Beispiel sind hier Gegner, die sich dem Helden in den Weg stellen.
Schlusswort:
Wer sich den Code mal anschauen möchte, den findet ihr hier. Ansonsten gibt es einen, in unregelmäßigen Abständen aktualisierten, Blog, und seit neustem auch ein kleines Wiki, welches ich fleißig am Befüllen bin
mfg
edit:
hier mal noch 2 screenshots, wie der MapEditor momentan aussieht
PS: Sollte sich jemand dazu berufen fühlen, an dem Projekt mitarbeiten zu wollen, so möge er sich mit mir in Verbindung setzen![]()