Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.07.2012, 20:41

Simple-2D-Engine


(Link)


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 (MapEdito, 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.3.0, sowie boost 1.55.0. Zum Programmieren wird VisualStudio 2013 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!

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

Auto Tiles sind spezielle Tiles, die sich selbst anpassen und das Mappen von Terrain erheblich erleichtern. Möchte man einen verwinkelten Weg (mit vielen Kurven, Kreuzungen, Verzweigungen, etc) mappen, benötigt man dafür 46 unterschiedliche Tiles, um jede Eventualität zu berücksichtigen. AutoTiles bieten die Möglichkeit das ganze mit 10 zu machen. Aus diesen 10 Tiles werden die restlichen 36 generiert und passend zusammen gebaut. Beim Mappen wird dann automatisch das richtige Tile gesetzt.


(Link)


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.

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 ;)

Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von »anti-freak« (06.07.2014, 04:16)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.07.2012, 21:36

Ich will zwar nicht an der Entwicklung teilnehmen, aber mir sind beim kurzen Anschauen schon einige Äußerlichkeiten aufgefallen, die mich persönlich davon abhalten würden diese Engine zu benutzen.
Hauptsächlich sind es Schreibfehler ...

- Es heißt "Collision", nicht "Collission"
- "Resource" statt "Ressource" (das ist deutsch)
- "Confirm" statt "Confirme"
- "Frequency" statt "Frequence"
- "Buffer" statt "Puffer"
- "Coord" statt "Koord"
- "Click" statt "Klick"
- "Children" statt "Childs"
- englische Abkürzung für "Nr." ist "No."
(wahrscheinlich noch mehr)

Die Methodennamen sind auch nicht einheitlich.
Manche fangen mit kleinen Buchstaben an, manche mit großen.

3

16.07.2012, 21:53

Da gebe ich dir auch vollkommen recht. Auch hier bin ich in letzter Zeit am Umbenennen und Verbessern. Ich hab mich mitlerweile auch für eine Schreibweise entschieden, und die versuche ich jetzt durchzuhalten.
Was die rechtschreibfehler angeht, werde ich nochmal überprüfen. Danke für die Hinweise.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

16.07.2012, 21:57

Kleiner Tipp für solche Arbeiten: Benutz ein Refactoring Tool, wie z.B. VAX. Gibt auch kostenlose Alternativen, aber kannst es ja mal testen, wenn du gerade viel zu refactoren hast. Da macht das Umbennen plötzlich sogar Spass. ;)

5

16.07.2012, 22:00

naja, mit ner guten IDE ist umbennen eigentlich nicht sonderlich schwierig/aufwendig. Wüsste nicht, wofür ich ein externes tool bräuchte.

6

16.07.2012, 22:05

naja, mit ner guten IDE ist umbennen eigentlich nicht sonderlich schwierig/aufwendig. Wüsste nicht, wofür ich ein externes tool bräuchte.

made my day :love:

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

16.07.2012, 22:12

Refaktoring bedeutet viel mehr als nur das ändern von Bezeichnern ;)
Es gibt ganze Bücher darüber und es lohnt sich gerade für Anfänger, eins davon zu lesen.

VAX ermöglicht es z.B. ein paar Zeilen einer Methode zu selektieren und daraus eine neue Methode zu machen. Benutzte temporäre Variablen werden dabei automatisch als Parameter übergeben.
Du kannst z.B. auch eine Basisklasse im Klassenkopf mit der rechten Maustaste anklicken und alle virtuellen Methoden definieren lassen. :thumbsup:
Das spart natürlich viel Zeit und Arbeit, was wiederrum bewirkt, dass man öfter refaktorisiert, was zu noch besserem Code führt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

8

16.07.2012, 22:13

Zitat

made my day :love:

wie gesagt, ICH wüsste es nicht, also klär mich auf, wenn es in deinen augen ratsam ist das dafür zu nutzen.
gib mir ein paar gründe, statt zu lachen :P

EDIT: @NachoMan
Danke, klingt aber irgendwie so, als könnte man sich auch wieder vieles kaputt machen...

9

16.07.2012, 22:19

nein ich lache nicht über dich. ich weiß nicht welche IDE du benutzt, aber für mich hörte es sich danach an, als wenn du nicht Visual C++ benutzt. Und da ich schon länger zumindest für die Anerkennung von anderen IDEs in dieser Community kämpfe, hat mich diese Aussage erheitert. Schließlich ist IMO VAX ein Tool um Visual C++ überhaupt erst zu einer "guten IDE" zu machen.

edit: zu früh gefreut ;) ich habe eben mal in deinen code angeschaut und die sln datei entdeckt. naja, da hab ich deine aussage wohl falsch interpretiert. wenn du mal nicht mit directx arbeitest, kannst du ja mal netbeans probieren...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chromanoid« (16.07.2012, 22:26)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

16.07.2012, 22:27

naja, mit ner guten IDE ist umbennen eigentlich nicht sonderlich schwierig/aufwendig. Wüsste nicht, wofür ich ein externes tool bräuchte.

Naja. Das wirst du spätestens merken, wenn du z.B einen Bezeichner hast, der in einem anderen enthalten ist. Oder du einen Funktionsnamen umbenennen musst, welcher in 20 anderen Dateien benutzt wird. Bei einer Engine nicht sonderlich ungewöhnlich. Das kostet dich dann mit einem externen Tool ein paar Sekunden. Von Hand bist du da ein Weilchen dran. Man kann mit dem Tool noch sehr viel mehr machen und es erweitert Intellisense auch um einiges, aber alleine wegen der Umbenennung lohnt sich das Tool imo schon.

Werbeanzeige