Ergebnis 1 bis 20 von 33

Thema: Simple-2D-Engine

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Zitat Zitat
    Meinst du damit Objecte zu Database hinzufügen
    Yes! genau das.

    Zitat Zitat
    Dieses wird wiederverwertbar gespeichert, sodass man in Zukunft schnell darauf zu greifen kann.
    Not bad at all!

    Zitat Zitat
    Zitat Zitat von Oktorok
    -Ü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/3...yzhzwj_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!

  2. #2
    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

  3. #3
    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

  4. #4
    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.

    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.

  5. #5
    Hallo,

    Ich hatte es ja oben geschrieben, das dieses Microsoft Paket benötigt wird.

    Die Tile Auflösung ist fix auf 32x32.

  6. #6
    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. Dort wird zlib Kompression + base64-encoding verwendet. Anstatt also:
    Zitat Zitat
    <Layer>
    <MapTiles Tiles="4:1,4:1,5:1, ....
    im klartext zu speichern könntest du folgendes machen
    Zitat Zitat
    <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:
    Zitat Zitat
    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:
    Zitat Zitat
    <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
    Zitat Zitat
    <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.
    Zitat Zitat
    <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:
    Zitat Zitat
    <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.

  7. #7
    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

  8. #8
    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.

    Geändert von Ghabry (09.08.2013 um 20:36 Uhr)

  9. #9
    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.

  10. #10
    Zitat Zitat von Ghabry Beitrag anzeigen
    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.
    Zitat Zitat
    <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:
    Zitat Zitat
    <prototype ID="1" Name="gras-set"> <indices> 12,13,14,15,16 <indices/></prototype>
    Zitat Zitat
    <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?
    Zitat Zitat
    <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..
    Zitat Zitat
    <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.
    Zitat Zitat
    <AnimationInfo ID="1" Type="1"/>
    Solche doppelt und dreifach Bezeichner fallen beim lesen von code eher negativ auf. sprite.spritePosition.spriteX.. ihh.

    Zitat Zitat
    <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.

    Zitat Zitat
    <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.
    Zitat Zitat
    <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

    Geändert von XRPG (10.08.2013 um 14:21 Uhr)

  11. #11
    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

  12. #12
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •