Archiv verlassen und diese Seite im Standarddesign anzeigen : Simple-2D-Engine
http://s2d-engine.bplaced.net/pictures/Logo.png
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:
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.
http://wiki.s2d-engine.bplaced.net/images/f/f6/AutoTiles-Beispiel.png
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 ('http://www.youtube.com/watch?feature=player_embedded&v=J4aixov04Fw')
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 ('https://github.com/anti-freak/Simple2D-Engine'). Ansonsten gibt es einen, in unregelmäßigen Abständen aktualisierten, Blog ('http://antis-proggerground.blogspot.de/'), und seit neustem auch ein kleines Wiki ('http://wiki.s2d-engine.bplaced.net/index.php?title=Hauptseite'), welches ich fleißig am Befüllen bin ;)
GameEditor (http://share.cherrytree.at/showfile-10443/simple2d_gameeditor.rar)
Um den Editor starten zu können, benötigt ihr zusätzlich dieses Paket (http://download.microsoft.com/download/A/3/7/A371A2C7-B787-4AD9-B56D-8319CE7B40CA/VSU3/vcredist_x86.exe) (von Microsoft).
mfg
edit:
hier mal noch 2 screenshots, wie der MapEditor momentan aussieht ;)
http://share.cherrytree.at/showfile-10120/mapeditortiles.png
http://share.cherrytree.at/showfile-10118/mapeditorobjects.png
Das Widget, das über der Map liegt, ist nur aktiv, wenn man sich über der Object Liste (links) befindet.
PS: Sollte sich jemand dazu berufen fühlen, an dem Projekt mitarbeiten zu wollen, so möge er sich mit mir in Verbindung setzen ;)
Ich habe jetzt mal eine kleine Preview-Map erstellt, um mal zu zeigen, was man so alles machen kann.
http://share.cherrytree.at/showfile-10147/preview_map.png
Die einzeln stehenden und die umgefallenen Bäume sind hierbei Objecte (pixelgenaue platzierung).
Die Boden Tiles (Gras, hohes Gras (AutoTile, und hat einen transparenten Rand), Steine und die Waldtextur) wurden im "background" platziert, der wiederum in 3 Unterlayer unterteilt ist.
Die "Baumkronen" sind ein AutoTile und wurden im "foreground" platziert, welcher hier ebenso aus 3 Unterlayern besteht.
Wie im 1. Post bereits beschrieben, können die beiden Hauptlayer (background und foreground) aus bis zu 100 Layern bestehen. Die Anzahl ist von Map zu Map variabel einstellbar.
Die Map wurde über die Programm eigene "Map Screenshot" Funktion erstellt (natürlich kann man das Gitter der Map auch ausblenden) ;)
Sieht schonmal interessant aus. Vorallem, dass es mit 100 Layern je Ebene eine hinreichende Menge an Layern gibt dieses Mal, was ja beim VX/Ace vernachlässigt wurde.
Wie sieht es mit dem Eventing aus und was für ein KS wird es geben?
Wie im 1. Post beschrieben, wird es kein "Eventing" in diesem Sinne geben. Man kann Scriptnamen vergeben (an Maps und Objecte). Die Scripte werden per C++ geschrieben, und ähnlich dem DynSDK per .dll geladen. Damit hat man das Maximum an Möglichkeiten, ohne den eigentlichen Launcher verändern zu müssen. Ähnlich wird es auch mit dem KS laufen. Das KS wird ebenso aus einer DLL geladen, und über bestimmte Callbacks angesprochen (combat start, combat end, etc).
Wie es später mit einer Point&Click Script Engine aussieht, kann ich jetzt noch nicht genau sagen, geplant ist es aber.
EDIT: Die 100 Layer sind das Maximum, das ich zulassen möchte, ich denke aber, das niemand so viele Layer benötigt. Außerdem benötigt das ganze noch ein paar Benchmark Tests, damit ich das einordnen kann, wie das mit der Performance aussieht. Ich denke, dem Großteil werden 3 Layer reichen.
Ich finde es schade das sich kaum jemand für dieses Projekt zu interessieren scheint. Ich gebe zu, ich habe allein auf der ersten Seite, in diesem Unterforum, 2 solcher Projekte gesehen, deswegen kann ich in gewisser Weise die Zurückhaltung verstehen. Trotzdem fände ich ein paar Meinungen/Kommentare nett (nicht weil ich hören will, wie toll ich doch bin, sondern weil ich ganz gerne ein paar Meinungen hätte, mit denen ich arbeiten kann ;) )
Zum Thema "Alpha Release des Editors" muss ich leider noch ein wenig vertrößten, da ich vorhabe "Tilesets" zu implementieren, um das Mapping ein bisschen zu erleichtern. Hier mal eine kurze Beschreibung:
Tilesets sind keine festen Bilder, wie man vielleicht vermuten mag, sind sind dynamische Rechtecke, die aus Tiles bestehen. Diese Tilesets kann man, wie die AutoTiles, zusammen basteln. Sie sollen beim Mapping helfen. Wie man bei der Map 3 Posts höher ganz gut sehen kann, gibt es bestimmte Texturen, die immer zusammen gehören (in diesem Fall die Bäume, also nicht die Freistehenden (das sind Objecte), sondern die "Umrandung" des Waldes). Diese Bäume bestehen aus 2 Tiles, eins für oben und eins unten. Es ist natürlich immer mühselig, beide Tiles nach einander zu setzen. Hier kommen dann die Tilesets ins Spiel. Hier kann man sich solche Gebilde (Rechteckig) zusammen basteln, und kann mit einem Klick direkt alle platzieren. Das hat Ähnlichkeiten mit dem Rubber Band des Makers (mit dem man mehrere Tiles auswählen kann), ist aber deutlich flexiebler einsetzbar (ist ja nicht immer garantiert, das die Tiles in der Auswahl direkt passend angeordnet sind).
Irgendwelche Anregungen dazu?
mfg
Ich finde das Projekt ziemlich interessant, mich würde aber interessieren, in welche Richtung das später gehen soll, dh. wie viel du vorschreibst und wie viel du dem Ersteller überlässt. Diese Frage bezieht sich in erster Linie auf den bereich Scripting und was du dafür so geplant hast. Wird das so eine mühselige Zusammenklicksprache wie beim RPG-Maker, oder hast du vor, das ganze etwas freier zu gestalten, indem du dem Ersteller einen Zugriff auf "tiefere Programmebenen" gewährst?
Ich hätte bspw. die Idee, die Möglichkeit einzubauen, dynamische Datenbanken aufzuziehen und diese per Script anzusteuern. So könnte man dann sehr frei über Dinge wie ein Kampfsystem entscheiden.
OK, ich plauder mal ein wenig aus dem Nähkästchen, wie ich mir das später vorstelle.
Es wird verschiedene Schnittstellen geben, über die die Entwickler ihre eigenen C++ Scripte einladen können. Ähnlich wie beim DynRPG. Für alle anderen wird es wohl eine Point&Click Engine geben (es ist geplant, ob ich das allerdings umsetzen möchte, steht in den Sternen, weil das doch ein extremer Haufen Arbeit ist), mit der man sich in guter alter Maker Manier seine Scripte zusammen klicken kann.
Jetzt kommen wir zu einer Besonderheit. Wie ich bereits vorher schon erwähnt habe, arbeite ich mit "Objecten". Diesen Objecten kann man auch Variabeln geben, die sie fest besitzen. Diese Variabeln lassen sich auch über die C++ Schnittstellen ansprechen und auch ändern. Hierbei gibt es auch Objecte, die von anderen erben können. Diese erhalten dann alle Variabeln, die das Parent Object besitzt.
Schreibt man sich nun also ein grundlegendes Script für z.B. ein KS, und nutz darin die Variabeln der Objecte, kann man diese innerhalb der Database schon ändern. Das heißt, die Startwerte lassen sich anpassen, ohne das Script ändern zu müssen. Das wiederum bietet natürlich viel Freiraum für den Entwickler.
Wenn der Entwickler des Scripts viele Variabeln aus der Database ließt, hat der spätere Nutzer des Scripts mehr Möglichkeiten, selbst Einstellungen vor zu nehmen.
Ich hoffe ich habe das ausgiebig und verständlich genug beschrieben ;)
SEEEDinator
25.06.2013, 22:47
Habs mir gerade mal durchgelesen, und muss sagen: Hut ab! Hoffentlich ziehst du das auch durch! Falls ja, wäre es mir eine Freude, zu gegebener Zeit einmal ein kleines Projektchen mit deinem Programm zu versuchen :-D
Da fällt mir noch eine Sache ein, zu der du vielleicht schon eine Antwort hast:
Wie sieht es mit Audio aus? Also, welche Formate werden unterstützt werden? Würde man vielleicht sogar auf einer Map (Beispiel Weltkarte) verschiedene Soundzonen anlegen können? (also regionale Musik (düster im Sumpf, freundlich auf einer offenen Wiese)
Bis dahin noch viel Erfolg! Lass dich nicht entmutigen!
Greetz
Zu meiner Schande muss ich gestehen, das ich bisher den Sound komplett außen vor gelassen habe :(
Aber da ich QT nutze, und QT eigentlich alles gängige unterstützt, wird das auch kein großes Problem da stellen.
Soundzonen ließen sich durchaus umsetzen, merke ich mir mal für die Zukunft (wird es in die 1. Version nicht schaffen).
mfg
Es ist nun soweit!
Hiermit veröffentliche ich die erste Alpha meines GameEditors (v0.0.1).
Ich bitte Interessierte sich das ganze einmal anzusehen, und ein bisschen damit herumzuspielen. In dem Paket sind 2 Testprojekte enthalten, das erleichtert den Einstieg erheblich (wählt dazu am Besten "untitled" aus, da das das Komplexere der beiden ist). Für weitere Erklärungen besucht bitte mein Wiki (http://wiki.s2d-engine.bplaced.net/index.php?title=Hauptseite) (hier werde ich in den nächsten Tagen noch einige Updates online bringen, mit entsprechenden Tutorials). Ich habe versucht, das Programm so verständlich wie möglich zu halten, um den Einstieg zu erleichtern. Ich weiß, das es dennoch recht komplex erscheinen kann, wenn man sich das erste mal in der Database umsieht. Nehmt euch ein paar Minuten, lest die vorhanden Artikel, und versucht ein wenig damit herumzuspielen.
Ich bin froh über jedes Feedback, das ich bekommen kann, aber auch Fragen beantworte ich weiterhin gerne.
Zum Schluss sei noch einmal erwähnt, das sich mit diesem Editor bisher nichts spielbares erstellen lässt, und er im Prinzip nur Maps bearbeiten kann (mit ein paar Extras).
DOWNLOAD (http://share.cherrytree.at/showfile-10443/simple2d_gameeditor.rar)
Um den Editor starten zu können, benötigt ihr zusätzlich dieses Paket (http://download.microsoft.com/download/A/3/7/A371A2C7-B787-4AD9-B56D-8319CE7B40CA/VSU3/vcredist_x86.exe) (von Microsoft).
mfg
Hu, also damit du nicht ganz ohne Feedback bleibst, werd ich dir mal einige Punkte aufzählen, die mir gefallen und die mir nicht gefallen! :)
Ich hoffe ich hab nichts vergessen und auch alles soweit getestet. :S
Positiv
Vorschaufunktion spezieller Objekte
Reinziehen der "Weltobjekte" und das Bewegen dieser im Editor selbst
So wie es aussieht, die Möglichkeit zu jedem Text in der Datenbank, eine Übersetzung anzugeben
Bounding Box
Anlegen eigener Tilesets (Diese könnten meiner Meinung nach ebenfalls eine Vorschau im TileSets-Baum erhalten)
Autotiles können Transparenz erhalten, sodass man im "Foreground-Layer" diese normal verwenden kann
Massenimports
Anlegen mehrerer Layers für eine Map (damit lassen sich Karten schön mappen :D )
Verbesserungswürdig
Die "Rückgängig-Funktion" : Folgendes Szenario: Ich zeichne mit der Maus, ohne den Button loszulassen, viel Gras, merke dass ich doch nicht alles benötige und drücke STRG-Z. Leider muss ich das so oft drücken, wie Gras gezeichnet wurde. Besser wäre es, wenn sofort die letzte Aktion verschwindet, also mein komplett gezeichnetes Gras. (Ist wahrscheinlich Geschmackssache)
Ah jetzt hab ich herausgefunden, dass der Button "<-" der Zurück-Knopf ist ohne Short-Cut ... müsste man sich vielleicht auch noch überlegen, wie man das Designtechnisch besser lösen mag. ;)
Der Cursor im Editor selbst. Ich find das Fadenkreuz ist dafür eine schlechte Wahl...ich wollte am Anfang mehrere Felder selektieren, hab jedoch gezeichnet.
Im Database-Editor funktioniert bei mir der Cancel-Button nicht (Verhalten für mich: Drücke auf "Cancel" und das Fenster schließt sich)
Ist wahrscheinlich eher etwas für mich, aber ich würde noch eine oder zwei weitere Zoomstufen begrüßen und zwar näher dran (150% und vllt. 200%) Gerade für Detailarbeiten für mich extrem wichtig. :)
TileSet fallen-tree.png hat ein etwas komisches Verhalten. (es wiederholt sich immer in y-Richtung und wird nicht komplett gezeichnet) ::::: Ich seh grad, beim Fill hat das Tile die richtige Grafik
Was mir dabei auffällt..man importiert viele kleine Tiles, jedoch kann das später unübersichtlich werden. Eine Gruppierung wäre dabei hilfreich. (Ähnlich einem Chipset-System im Maker, nur mit DropDown-Box oder so)
Klick ich im Menü auf "File" und "move" dann mit meiner Maus über die anderen Reiter und komme auf "Database", öffnet sich diese sofort -> Sollte am Besten nur auf ein Klick reagiern
Bei den Weltobjekten gibt es ja die Animationsvorschau....die find ich irgendwie etwas unübersichtlich. Auch wenn ich das Fenster vergrößer, bleibt das leider so...da könnte man vielleicht noch einen Button einzubauen mit "Show Animation" oder sowas, der dann die ganze Verwaltung in einem neuen Fenster öffnet.
nochmal nen Fazit
Joa ansonsten sehen die Funktionen soweit gut aus, jedoch sind mir die Objekt-Anmiationstypen noch unklar...da kann man auch wenig dran schrauben. Ebenso wie bei den Texten....da hätt ich zu gerne mal ein weiteres Textfeld erzeugt... :)
Es sind echt schöne Sachen dabei und dein Projekt geht in eine gute Richtung, wie ich finde.
Die bisherigen Funktionen zur Kartendarstellung mit den Tiles, Autotiles und Weltobjekten find ich gut gelungen und damit würden sich schon schöne Karten darstellen lassen.
Ich bin auf jeden Fall gespannt, wie die weitere Entwicklung vorangeht.
Hu, also damit du nicht ganz ohne Feedback bleibst, werd ich dir mal einige Punkte aufzählen, die mir gefallen und die mir nicht gefallen! :)
Ich hoffe ich hab nichts vergessen und auch alles soweit getestet. :S
Hallo, danke für deine Mühen. Bin froh, das sich jemand die Mühe macht, und sich das ganze einmal ansieht.
Dennoch sind mir ein paar Punkte nicht ganz klar, bitte hilf mir dabei auf die Sprünge :P
Positiv
Anlegen eigener Tilesets (Diese könnten meiner Meinung nach ebenfalls eine Vorschau im TileSets-Baum erhalten)
Was meinst du mit "Vorschau im TileSets-Baum"? Im MapEditor wird dir beim drüber fahren eine Vorschau gezeigt.
Verbesserungswürdig
Die "Rückgängig-Funktion" : Folgendes Szenario: Ich zeichne mit der Maus, ohne den Button loszulassen, viel Gras, merke dass ich doch nicht alles benötige und drücke STRG-Z. Leider muss ich das so oft drücken, wie Gras gezeichnet wurde. Besser wäre es, wenn sofort die letzte Aktion verschwindet, also mein komplett gezeichnetes Gras. (Ist wahrscheinlich Geschmackssache)
Ist mir tatsächlich auch schon aufgefallen. Ich überlege mir auch schon eine Lösung, wie ich das anders machen könnte. Liegt ein wenig an der Implementierung. -> werde ich überarbeiten
Ah jetzt hab ich herausgefunden, dass der Button "<-" der Zurück-Knopf ist ohne Short-Cut ... müsste man sich vielleicht auch noch überlegen, wie man das Designtechnisch besser lösen mag. ;)
Hier werde ich wohl ein Icon einsetzen, welches in etwa so aussieht wie das "Zurück" aus dem Maker. Sonst irgendwelche Vorschläge?
Der Cursor im Editor selbst. Ich find das Fadenkreuz ist dafür eine schlechte Wahl...ich wollte am Anfang mehrere Felder selektieren, hab jedoch gezeichnet.
Kann ich verstehen, dass das ein wenig Eingewöhnungszeit benötigt. Dennoch denke ich, das wenn man öfter mit dem Editor arbeitet, auch damit zurecht kommen kann.
Im Database-Editor funktioniert bei mir der Cancel-Button nicht (Verhalten für mich: Drücke auf "Cancel" und das Fenster schließt sich)
Ist ein Bug, und wird behoben ;)
Ist wahrscheinlich eher etwas für mich, aber ich würde noch eine oder zwei weitere Zoomstufen begrüßen und zwar näher dran (150% und vllt. 200%) Gerade für Detailarbeiten für mich extrem wichtig. :)
Hatte ich auch schon drüber nach gedacht. Werde ich auch umsetzen.
TileSet fallen-tree.png hat ein etwas komisches Verhalten. (es wiederholt sich immer in y-Richtung und wird nicht komplett gezeichnet) ::::: Ich seh grad, beim Fill hat das Tile die richtige Grafik TileSet "fallen-tree.png"? Das klingt für mich eher nach einem normalen Tile. Ich sehe aber was du meinst (wenn du denn das Tile meinst), und weiß auch woher das kommt. Werde ich beheben ;)
Was mir dabei auffällt..man importiert viele kleine Tiles, jedoch kann das später unübersichtlich werden. Eine Gruppierung wäre dabei hilfreich. (Ähnlich einem Chipset-System im Maker, nur mit DropDown-Box oder so)
Auch das hatte ich mir schon überlegt, ist aber ein wenig knifflig umzusetzen, deswegen erst einmal nach hinten geschoben. Ich werde mir dafür aber eine Lösung überlegen!
Klick ich im Menü auf "File" und "move" dann mit meiner Maus über die anderen Reiter und komme auf "Database", öffnet sich diese sofort -> Sollte am Besten nur auf ein Klick reagiern
Stimmt, ist ein seltsames Verhalten. Werde ich überarbeiten.
Bei den Weltobjekten gibt es ja die Animationsvorschau....die find ich irgendwie etwas unübersichtlich. Auch wenn ich das Fenster vergrößer, bleibt das leider so...da könnte man vielleicht noch einen Button einzubauen mit "Show Animation" oder sowas, der dann die ganze Verwaltung in einem neuen Fenster öffnet.
Dabei kann ich dir leider nicht ganz folgen. Wenn du das Fenster größer machst, vergrößert sich doch auch der Bereich, in denen die Animationen sind.
nochmal nen Fazit
Joa ansonsten sehen die Funktionen soweit gut aus, jedoch sind mir die Objekt-Anmiationstypen noch unklar...da kann man auch wenig dran schrauben. Ebenso wie bei den Texten....da hätt ich zu gerne mal ein weiteres Textfeld erzeugt... :)
Es sind echt schöne Sachen dabei und dein Projekt geht in eine gute Richtung, wie ich finde.
Die bisherigen Funktionen zur Kartendarstellung mit den Tiles, Autotiles und Weltobjekten find ich gut gelungen und damit würden sich schon schöne Karten darstellen lassen.
Ich bin auf jeden Fall gespannt, wie die weitere Entwicklung vorangeht.
Vielen Dank für deine Zeit. Ich werde mich bemühen deine Kritikpunkte auszumerzen ;)
mfg
Ich pushe das ganze hier mal. Vielleicht verspürt ja noch jemand Lust, sich das mal etwas genauer anzusehen ;)
Habe mich jetzt auch einmal an den Launcher gewagt, und bin soweit, das ich Maps rendern lassen kann (noch ein wenig hacky, aber das ändert sich mit der Zeit). Im Moment wird die Map, welche man in Post #2 (http://www.multimediaxis.de/threads/138598-Simple-2D-Engine-v0-0-1-RELEASE%21?p=3088261&viewfull=1#post3088261) sehen kann, mit rund 170-200 FPS gerendert. Es passiert zwar noch nicht wirklich viel (kein Update der Objecte), aber ich denke ich bin auf einem guten Weg. ;)
Im Moment läuft das ganze ja auch nur auf einem Kern, ich habe also noch ganz gut Luft nach oben.
mfg
Oktorok3
06.07.2013, 12:56
Ich habe mir das ganze auch mal angeschaut und ein bisschen angetestet.
Die Funktionen sehen ganz gut aus, dennoch ist es erstmal schwierig sich in das Programm einzuarbeiten.
Das Plazieren von größeren Objekte (z.B. Bäume) ist schonmal eine wirklich praktische Angelegenheit (vor allem, das sich die Dinge automatisch vor- oder hintereinander versetzen, was sehr arbeitssparend ist!).
Wie man neue "Objecte" hinzufügt, oder generell das Spiel testet, hat sich mir jetzt noch nicht erschlossen.
Verbesserungsvorschläge:
-In den Tiles auch mehrere Dinge anwählen können, und dann auf der Map platzieren (Alles immer einzeln nehmen zu müssen ist sehr aufwendig, denn man will ja nicht für alles ein "Object" erstellen müssen)
-Animationsframes sollten auch per "Entf" löschbar sein, da man sonst jedesmal die Zahl ändern muss und dann auf "remove Animation" gehen muss.
-Übersicht der Animationsframes und der Anzahl sollte besser gelöst werden (z.B. Ansichtstyp ändern: [Liste]; [Animationen]; [Liste und Animationen] oder so ähnlich)
So weit erstmal dazu.
(Ein bisschen "Fütterung zurück" von mir, denn Essen braucht man bekanntlich.)
Hallo Oktorok3,
vielen Dank für deine Zeit.
Wie man neue "Objecte" hinzufügt, oder generell das Spiel testet, hat sich mir jetzt noch nicht erschlossen.
Meinst du damit Objecte zu Database hinzufügen, oder auf der Map platzieren? Das Spiel teste geht, wie oben bereits erwähnt, noch nicht, da ich gerade mitten in der Entwicklung des GameLaunchers stecke. Hier bitte ich noch um ein wenig Geduld ;)
Verbesserungsvorschläge:
-In den Tiles auch mehrere Dinge anwählen können, und dann auf der Map platzieren (Alles immer einzeln nehmen zu müssen ist sehr aufwendig, denn man will ja nicht für alles ein "Object" erstellen müssen)
Dafür habe ich die "TileSets" entwickelt. Mit diesen ist es in kurzer Zeit möglich (wenn man weiß, wie alles zusammen spielt, unter einer Minute) sich sein benötigtes Set zusammen zu klicken. Dieses wird wiederverwertbar gespeichert, sodass man in Zukunft schnell darauf zu greifen kann.
-Animationsframes sollten auch per "Entf" löschbar sein, da man sonst jedesmal die Zahl ändern muss und dann auf "remove Animation" gehen muss.
Stimmt, da hast du recht. Sollte nicht allzu aufwändig sein. Allerdings sind für den AnimationsEditor noch ein paar mehr Improvements geplant. Wird es sicherlich in der nächsten Version geben ;)
-Übersicht der Animationsframes und der Anzahl sollte besser gelöst werden (z.B. Ansichtstyp ändern: [Liste]; [Animationen]; [Liste und Animationen] oder so ähnlich)
Hierbei verstehe ich nicht ganz, was du mir sagen möchtest.
(Ein bisschen "Fütterung zurück" von mir, denn Essen braucht man bekanntlich.)
Stimmt, ohne ein wenig Feedback und Kritik kann die Motivation auch schnell dahin sein ;) Deswegen bin ich über jede Stimme froh die sich zu Wort meldet!
mfg
Oktorok3
07.07.2013, 14:59
Meinst du damit Objecte zu Database hinzufügen Yes! genau das.
Dieses wird wiederverwertbar gespeichert, sodass man in Zukunft schnell darauf zu greifen kann.
Not bad at all!
-Übersicht der Animationsframes und der Anzahl sollte besser gelöst werden (z.B. Ansichtstyp ändern: [Liste]; [Animationen]; [Liste und Animationen] oder so ähnlich)
Hierbei verstehe ich nicht ganz, was du mir sagen möchtest.
Sorry, fehlende Infos: Database/Objects/WorldObjects->Animationsframes
Hier finde ich fehlt eine gute Übersicht. Das ganze könnte Bspw. ähnlch wie im Maker angezeigt werden (Liste)
http://s14.directupload.net/file/d/3309/utyzhzwj_png.htm
(Beispiel der guten Übersicht)
Wäre schade, wenn du die Motivation verlierst, denn das ganze ist ein schönes Projekt und die Mühe und die Zeit sollte keine Verschwendung sein!
Hallo,
die Motivation verliere ich schon nicht, keine Angst ;) Dazu arbeite ich schon viel zu lange an dem Projekt, und es ist schon viel zu weit fortgeschritten.
Das du noch nicht ganz klar kommst mit dem Programm, ist mir verständlich. Deswegen wollte ich eigentlich ein paar HowTo´s veröffentlichen, habe aber noch keine Zeit gefunden, diese zu schreiben. Werde ich dann wohl mit der nächsten Version nachreichen, wenn es dann auch die 1. Version des GameLaunchers gibt.
Stimmt, das sieht ein wenig besser aus, von der Struktur. Werde ich mal gucken, was sich da machen lässt. Wird auf jeden Fall als ToDo vorgemerkt ;)
mfg
So, heute hab ich mal wieder an dem Launcher weiter gearbeitet. Mittlerweile werden die MapObjecte mitgeladen, und haben ein rudimentäres update Verhalten, was sich in Zukunft natürlich noch stark erweitert.
Erste Benchmark Tests mit 1700 Objekten auf der Map (wovon gut 2/3 sichtbar waren) haben immerhin noch eine FPS zwischen 70-100 ergeben und eine Nutzung des Arbeitsspeichers von ~20MB. Hier gilt es jedoch zu beachten, dass
1. viele Objekt Grafiken mehrfach verwendet wurden
2. die Map nicht sonderlich groß ist
3. keine Ausgefeilten AIs verwendet werden
Dennoch kann man sagen, das die Draw Routienen damit weitestgehend vollendet sind, was auch das Hardwarelastigste sein dürfte. Es bleibt also abzuwarten, was man am Ende für Werte erreichen kann ;)
mfg
G-Brothers
30.07.2013, 20:55
Tagchen. :3
Ich würde mal gerne einen Blick in die Alpha werfen, aber es heisst dann immer, dass "MSVCP110.dll" nicht gefunden wurde, und startet dann nicht. :O
Ansonsten zum Screenshot vom Post #2:
Kann man zwischen 16x16 und 32x32 etwa jederzeit wechseln? Dort ist ja letzteres aktiv, was man auch am Mapping merkt.
Hallo,
Ich hatte es ja oben geschrieben, das dieses Microsoft Paket (http://download.microsoft.com/download/A/3/7/A371A2C7-B787-4AD9-B56D-8319CE7B40CA/VSU3/vcredist_x86.exe) benötigt wird.
Die Tile Auflösung ist fix auf 32x32.
Ich hab mir das Map Format mal angeschaut. Ist noch ein wenig "unschön" gelöst, wie man es auch an der Dateigröße merkt. Damit meine ich vorallem die 500er Map.. die knapp 1MB groß ist. 100 Maps == 100MB? Ich weiß das wäre eher der worst-case, aber schau dir als gutes Beispiel mal das Tiled .tmx (eigentlich .xml) Format an. Tiled Map Editor (http://www.mapeditor.org/). Dort wird zlib Kompression + base64-encoding verwendet. Anstatt also:
<Layer>
<MapTiles Tiles="4:1,4:1,5:1, ....
im klartext zu speichern könntest du folgendes machen
<layer encoding="base64" compression="zlib" width="500" height="500">
eJzt2kEKAjEMheGizkXUk6gw97+R2QiZUgjUFDLJv/gW7eLRt3C.. <-- die codierten Tile IDs
</layer>
Um die Map zu erhalten dann sowas wie:
byte[] decoded = Base64.decode(layer.value);
int[] tileIDs = new int[layer.width * layer.height];
Zlib.inflate(tileIDs, decoded);
int tile = tileIDs[x + y * layer.width];
Zip die Map mal, dann siehst du wieviel du in etwa verschwendest. 994kb werden auf ca. 6kb komprimiert.
Falls du aus irgendeinen Grund nicht darauf verzichten willst, würde ich trotzdem einige Dinge überdenken. Sowas wie:
<MapTiles Tiles="4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4
<MapTiles Tiles="4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4
<MapTiles Tiles="4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4
Jeder char im xml Bezeichner ist mal fünfhundert = 500 Byte Verschwendung. Auch das Attributte "Tiles" ist unnötig. Den Tile IDs String kann man auch als value speichern. Also eher sowas wie
<tid> 4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4 ... </tid>
<tid> 4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4 ... </tid>
<tid> 4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4 ... </tid>
Bei AnimationDatabase.xml ist es ähnlich.
<Frame time_msec="50">
<Sprite spriteID="11" posX="0" posY="0" scale="100" rotation="0" opacity="100"/>
</Frame>
<Frame time_msec="50">
<Sprite spriteID="12" posX="0" posY="0" scale="100" rotation="0" opacity="100"/>
</Frame>
<Frame time_msec="50">
<Sprite spriteID="13" posX="0" posY="0" scale="100" rotation="0" opacity="100"/>
<Sprite spriteID="3" posX="-96" posY="-96" scale="100" rotation="0" opacity="100"/>
</Frame>
Anstatt jedesmal ein neuen Tag für die Framezeit zu beginnen könntest du ein int array mit [index] = frametime Wertepaaren verwenden. Außerdem könntest du default-werte einführen. Werte wie posX="0" posY="0" scale="100" rotation="0" opacity="100" braucht man nicht zu speichern, wenn es sie als default gibt. Daraus wird dann sowas wie:
<frame_times> 50 50 50 <frame_times>
<sprites>
<sprite id="11" t="0" />
<sprite id="12" t="1" />
<sprite id="13" t="2"/>
<sprite id="3" t="2" posX="-96" posY="-96" />
</sprites>
Die Frame zeiten werden dann mit frame_times[sprite.t] ausgelesen.
Na ja, das viel mir so auf. Hab mir aber auch nicht alles angeschaut.
Bei den Maps bin ich mit dir einer Meinung, diese wollte ich auch in Zukunft zipen.
Bei den Animationen machst du allerdings den Fehler zu denken, man hat nur ein Sprite pro Frame. Denn genau aus diesem Grund gibt es diesen Tag, damit mehrere Sprites pro Frame benutzt werden können.
Von den default Werten bin ich kein Freund.
Aber ich freue mich, das du dir das mal angeguckt hast, auch wenn ich im Moment wenig Zeit habe, daran weiter zu arbeiten ;)
Ist halt XML, da ist doch Speicherplatzverschwendung und Tag-Bloat by Design ;).
Nimm JSON, dann sparst du schon mal alle schließenden Tags ^^
Nachtrag:
Solche Optimierungen sollte man übrigens erst machen, wenn das Programm weitesgehend steht. Erstmal alles sauber programmieren und dann schauen was man optimieren kann.
Ist auch der Weg, den ich im Moment gehen möchte. Erstmal muss es funktionieren ;)
Ob ich dann letztendlich xml oder json oder komplett binary mache, ist reine fleiß arbeit.
Ist halt XML, da ist doch Speicherplatzverschwendung und Tag-Bloat by Design ;).
Nimm JSON, dann sparst du schon mal alle schließenden Tags ^^
Nachtrag:
Solche Optimierungen sollte man übrigens erst machen, wenn das Programm weitesgehend steht. Erstmal alles sauber programmieren und dann schauen was man optimieren kann.
Finde ich nicht, es handelt sich schließlich nicht um eine micro Optimierung sondern um grundlegende Dinge. Es geht mir nicht speziell um das zippen, sondern um das richtige planen von XML Formaten.
Ein Programm das so datenabhängig wie ein Game Maker ist, viele Baumstrukturen & Objekte, lebt von gut definierten Formaten.
Ich kann mir z.B. überhaupt nicht vorstellen warum man die gesamten Tiles einzeln speichern will. Sowas wie "Textures/high-grass/" bottom, top, left, right.
Es ist nicht nur umständlich zu importieren, sondern auch schwer zu bearbeiten. Was wenn ich das Gras umfärben möchte? Muss ich dann alle Dateien einzeln bearbeiten? Sowas löst man normalerweise mit Tilesets/Spritesheets.. was auch meist der Render Performance zugute kommt, da man auf kostbare Texturewechsel in Spritebatches oder ähnliches verzichten kann. Auch das indizieren und cachen fällt leichter.
Mir sind beim durchschauen noch einige Sachen ins Auge gefallen.
<AutoTileDatabase>
<prototype ID="1" Name="gras-set" Index0="12" Index1="13" Index2="14" Index3="15" Index4="16" Index5="17" Index6="18" Index7="19" Index8="20" Index9="11"/>
Für sowas sind XML-Attribute nicht geeignet. Es handelt sich um ein Int-Array. Wieso also nicht:
<prototype ID="1" Name="gras-set"> <indices> 12,13,14,15,16 <indices/></prototype>
<prototype ID="1" Name="Object1" boundingX="2" boundingY="24" boundingWidth="18" boundingHeight="8" animationSpeed="100" scriptName="">
Der Prototype Tag ist plötlich auch ein Rectangle? Wieso nicht einen extra Tag einführen?
<prototype ID="1" Name="Object1" animationSpeed="100" scriptName="">
<rect x="2" y="24" width="18" height="8"/>
Ich wette man wird an anderer Stelle ebenfalls ein Rectangle als Bounding Box benötigen, jedoch ohne animationSpeed oder scriptName Attribut.
Unnötig lange Bezeichner..
<AnimationInfo animationID="1" animationTypeID="1"/>
Man sieht doch im Tag dass es sich um eine AnimationInfo handelt, das "animation" innerhalb der attribute ist also unnötig.
<AnimationInfo ID="1" Type="1"/>
Solche doppelt und dreifach Bezeichner fallen beim lesen von code eher negativ auf. sprite.spritePosition.spriteX.. ihh.
<prototype ID="2" Name="forest" columnCount="3" rowCount="2" x0y0="55" x0y1="56" x1y0="53" x1y1="54" x2y0="51" x2y1="52"/>
x0y0 usw. Kann man auch als Matrix speichern.
<prototype ID="1" Name="gras" FileName="gras.png" Path="" transparent_color="" terraintype="0" passability="15"/>
<prototype ID="2" Name="stone" FileName="stone.png" Path="" transparent_color="" terraintype="0" passability="0"/>
Den Bezeichner prototype finde ich etwas fragwürdig. Es handelt sich um ein Tile, wieso also nicht <tile>. Hier könnte man auch einige Dinge anders machen um zukünftige Probleme zu vermeiden.
<tile ID="1" Name="gras" transparent_color="">
<image src="fullpath/image/tile.png"/>
<collision type="solid" passability="15" action="" />
<terrain type="0" action="#A102"/>
</tile>
Als Beispiel. Etwas mehr OOP im Design. Der <collision type="solid"> Tag ist dann für alle möglichen Kollisionsdaten definiert und kann für andere Objekte wiederverwendet werden. So könnte ein Sprite ebenfalls den Tag verwenden. Es ist auch übersichtlicher wenn man die Daten weiter runterbricht.
Aber nun gut, muss man ja alles nicht so genau nehmen. Mach wie du lustig bist, sollte nur eine kleine Anregung sein ;D
Ich verweise mal darauf, dass das ganze hier open source ist, und wenn du lust hast, durchaus mir deine Änderungen zukommen lassen kannst ;)
Ansonsten, klar bin ich froh, wenn man mir ein paar Anregungen gibt ;)
mfg
Open Source? Also irgendwie sind mir die Links zu Google Code, GitHub oder SourceForge entgangen. Wo wird das Projekt denn gehostet?
Ehrlich gesagt kenn ich mich aber auch zu wenig mit Qt aus um etwas beizusteuern.
Auf meinem Blog und im wiki Ist der Link zu finden. Hab nicht gedacht, das den jemand hier benötigt ;) Ist alles bei github zu finden.
Allerdings bin ich seit einiger Zeit mit refactoring und optimieren beschäftigt, deswegen Ist es nicht mehr ganz aktuell.
Jo, mal wieder was von der Front ;)
Ich hab mir XRPGs Kritik zu Herzen genommen, und überarbeite gerade meinen In-/Output. Das wird noch ein paar Tage dauern, bis ich da durch bin, aber ich denke es wird sich lohnen.
Die 2. Entscheidung die ich getroffen habe ist, das ich Maps im Binary Format speichern werde. Das wird den extremen Overhead der XML Dateien vernichten und mit Sicherheit auch einen kleinen Geschwindigkeitsschub bringen.
Wie bereits im letzten Post beschrieben, gehe ich das Projekt gerade von vorne bis hinten durch und schaue was sich optimieren lässt, und wo ich vielleicht nochmal besser was umschreiben sollte. Ich habe einige solcher Stellen entdeckt, deswegen wird es in nächster Zeit auch keinen großartigen (offensichtlichen) Fortschritt geben.
mfg
PS: Wer das Programm noch testen möchte, darf das natürlich weiterhin gerne tun. Allerdings spiegelt das mittlerweile nicht den aktuellen Stand wieder.
Hallo anti-freak
Ich beobachte dein Projekt hier schon länger. Irgendwie scheint dein Blog nicht mehr zu funktionieren...
Jedenfalls, tolle Sache an der du da arbeitest, wollte ich bloss mal loswerden!
Gruss
Raoh
Hallo roah,
vielen Dank für deinen Kommentar ;)
Mein Blog funktioniert weiterhin wie gewohn. Hast du es vll am 17.8 so gegen 23:50Uhr versucht? Da hatte google ne 2 minütige Downtime :P
Hier nochmal der Link: http://antis-proggerground.blogspot.de/
mfg
So, für alle die denken, es wäre tot...
Dem ist nicht so ;)
Ich hatte wenig Zeit und sehr stumpfe Arbeit vor mir (kompletter rewrite von Database und allem was dazu gehört (also praktisch alles :P )).
Um mal einen kurzen Überblick zu liefern -> der Editor funktioniert noch nicht, alerdings kann ich den meisten Code wiederverwenden. Die Database an sich funktioniert wieder und das auch besser als vorher und in einem hübscheren Code-Design ;)
Ich brauche noch ein paar Stunden um auf den alten Stand zurück zu kehren, befinde mich aber auf einem guten Weg.
Mit freundlichen Grüßen
Da ich gerade ein wenig Zeit habe und unbedingt meine Fortschritte präsentieren möchte, hier mal ein kleines Video zum MapEditor ;)
Das Video zeigt die grundlegenden Möglichkeiten, die einem mit dem MapEditor zur Verfügung stehen. Das platzieren der MapObjecte und der Script-Punkte fehlt jedoch noch.
Ich hoffe ich habe mit den Kommentaren alles wichtige erklärt, wenn nicht, einfach mal nachfragen.
http://www.youtube.com/watch?v=ETn7YzXyFdw
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.