[ISO-Perpektive] Wie herstellen?



  • Hi,

    ich möchte eine Spiel basierend auf einer ISO-Perpektive (wie zb. Ultima, LBA
    oder Crusader) herstellen und habe eigentlich (auf dem Papier) alles soweit
    als 2D Top-Down Darstellung fertig. Das Problem ist jetzt, dass ich keine Idee
    habe wie und wo ich anfangen soll das Spiel in die ISO zu hieven.

    Mein - gedanklicher - Ansatz ist bisher folgender:
    Ich verwende weiterhin ein 2D-Array als Untergrund und ersetze die Bitmaps
    durch Gifs (um den Helden auch mal durch etwas verdecken zu lassen).
    Alternativ habe ich irgendwo gelesen, dass sich ISO-Tiles am besten herstellen
    lassen wenn ich das orginal Tile nehmen um ca 30° drehe und an der Y-Achse
    stauche (wobei ich mir nicht vorstellen kann, dass das gut aussieht).

    Wie würdet Ihr / seid Ihr das angehen / angegangen?
    Gibt es zb. brauchbare Klassen um Gifs (oder PNGs) darzustellen?
    Gibt es andere Wege die benötigte Transparenz zu erreichen?

    Danke im Voraus,
    Khadgar



  • Transparenz? DirectDraw oder (besser) Direct3D ermöglichen das ohne großen Aufwand. Gifs brauchst du dafür nicht.
    Ich würde auch die einzelnen Kacheln in deinem Game als transparente Trapeze einfügen.



  • @Optimizer:
    Die transparenten Trapeze hab ich schon 🙂
    Die theoretische Idee des Bildschimraufbaus (Erst GroundLayer, dann
    CreatureLayer, dann ObjectLayer zeichnen) ebenfalls, aber kannst du mir
    einen kleinen Schubs geben wonach ich bzgl. dieses Problems bei DirectDraw /
    Direct3D suchen soll?

    Danke,
    Khadgar 😃



  • Welche API verwendest du denn für die Grafikausgabe? Bei DDraw und D3D setzt du die Transparenz der Bilder einfach per Colorkey.
    Generell müsstest du eigentlich in jedem besseren Tutorial dazu was finden.

    Bei den Kreaturen und Objekten würde ich mir außerdem ein Array anlegen, in dem du die Zeichenreihenfolge sortierst. Viecher, die weiter oben (also hinten) sind, müssen zuerst gezeichnet werden.



  • Optimizer schrieb:

    Welche API verwendest du denn für die Grafikausgabe? Bei DDraw und D3D setzt du die Transparenz der Bilder einfach per Colorkey.
    Generell müsstest du eigentlich in jedem besseren Tutorial dazu was finden.

    Api? *schäm* Bisher ist das alles reines MFC (hey, ich mache C++ erst seit ca.
    zwei Monaten). Was würdest du mir denn nahe legen?

    Optimizer schrieb:

    Bei den Kreaturen und Objekten würde ich mir außerdem ein Array anlegen, in dem du die Zeichenreihenfolge sortierst. Viecher, die weiter oben (also hinten) sind, müssen zuerst gezeichnet werden.

    Das ist der Plan 😃
    Ich habe ein World-Objekt, das für jede Ebene (also Kellergeschosse etc.)
    mehrere Layer enthält (2D-Arrays von Größe der gesamten Landkarte) und in
    diesen Layern speichere ich dann ab welches Boden-Tile wo liegt (GroundLayer),
    welche Kreatur sich wo befindet (CreatureLayer) und welches Objekt wo ist
    (ObjectLayer) hinzukommen noch eine Karte über die Ereignisse (EventLayer),
    eine Karte über Zaubereffekte und deren Positionen (SpellEffectLayer) und eine
    Karte über die Positionen von Projektilen (ProjectileLayer).

    Das ganze sieht dann so aus:

    for (int x = 0; x < 21; x++)
    {
        for (int y = 0; y < 21; y++)
        {
            if (world.Level1.GroundLayer[y][x] == 1005) // ID für rechteckiges Gras-Tile
                dc->... // Hier wird dann das Bild gezeichnet
            if (world.Level1.CreatureLayer[y][x] == 2000) // ID für eine Ratte
                dc->... // Hier wird dann die Ratte gezeichnet
            [...]
        }
    }
    

    [Das mag zwar im Code beschissen aussehen, da mir CBitmap aber den Operator =
    verweigert habe ich - anscheinend - keine Möglichkeit die ID über eine Liste
    abzugleichen (zb. wie folgt:

    CBitmap ground, creature;
    for (int x = 0; x < 21; x++)
    {
        for (int y = 0; y < 21; y++)
        {
            ground = ListTiles[world.Level1.GroundLayer[y][x]];
            creature = ListCreatures[world.Level1.CreatureLayer[y][x]];
            dc->... // Hier würde dann "ground" gezeichnet
            dc->... // Hier würde dann "creature" gezeichnet
            [...]
        }
    }
    

    ) oder geht das irgendwie?]

    Gruß,
    Khadgar

    [EDIT] Alles meine Rechtschreibfehler... nur meine 😉 [/EDIT]



  • Mittlerweile gibts zwar in WinApi Transparenz und Alphablending, wie weit das aber in MFC geht? Früher hat man das aber mit SW Masken lösen müssen. z.B. erstmal geANDet und so die nicht transparenten Stellen gelöscht, dann per OR die neuen Farbwerte reingeschrieben. Ich würde aber DX empfehlen bzw. die Benutzung eines Wrappers dafür, gibt ja genug. Dann ist gleich auch noch alles andere, was man für's Spiel brauchen wird, dabei.

    P.S.: Für deinen = Operator brauchst du doch nur von CBitmap erben und ihn implementieren.



  • DX, will heißen Direct3D ab Version 8.0 - eignet sich auch für 2D-Anwendungen sogar besser als DirectDraw. Du kannst zoomen, drehen, Alphablenden.



  • Danke für Eure Hinweise und Hilfestellungen 🙂

    @TGGC:
    Dank dir für den Hinweis. Die Idee war mir während der Arbeit auch gekommen,
    aber ich denke, da ich Gifs einsetzen werde, werde ich darauf hoffen, dass
    IPicture die benötigten Operatoren mitbringt 😃
    Ansonsten wird da halt überschrieben 🙂

    @Optimizer:
    Ich hab mir das DX9 SDK jetzt besorgt und mal im Netz nach Tutorials zur
    9er DX geschaut: Kann es sein, dass es da noch nichts gibt?
    Habs auf DUS, der Robsite, Red Death's HP und Softgames, sowie dieser hier
    probiert und bin nicht wirklich fündig geworden.
    Kannst du mir evtl. ein konkretes Tutorial empfehlen?

    Danke,
    Khadgar



  • Es ist auch nicht "schlimm", wenn du dich mit DirectX Graphics Version 8 beschäftigst.
    Dazu gibt es genug Tutorials.
    http://www.bytelords.de/cowiki/310.html?cowiki=ac1b1b073d2879747ed430f0a660dfa2

    EDIT: btw, du brauchst dir jetzt nicht dafür das DX SDK 8 zu ziehen 😉



  • Was für eine Nacht 🙂
    Ich habe mir also das DX9SDK besorgt und mal lustig nach www.husser.de die
    Tutorials durchgearbeitet (bis Kapitel 5) um dann festzustellen, dass dort
    auf die ddutil.cpp verwiesen wird (welche den DX9 Beispielen beiliegt) und
    diese nicht DX9-kompatibel zu sein scheint 😞

    Dann DX7 besorgt und alles von vorne...
    Jetzt geht das zwar soweit und ich bin echt glücklich darüber mal wieder ein
    neues Türchen zu anderen Ecken den Programmierung einen Spalt geöffnet zu
    haben, nur:

    Kann mir wer sagen wie ich vorgehen muss, möchte ich DX mit den MFC verwenden?
    WinApi ist nunmal nicht so mein Ding 😞

    Danke im Voraus,
    Khadgar



  • Wieso DX7 ??
    Da gibt es noch die Trennung zwischen DirectDraw und Direct3D. Tu dir das jetzt nicht an. Es ist doch kein Problem, mit dem DX9 SDK DX8 zu proggen!
    Und ohne WinAPI geht es nicht.



  • @Optimizer:
    Bezüglich der Trennung von DirectDraw und Direct3D.

    Die auf den Bytelords dargebotenen Tutorials gliedern sich wie folgt:

    * Tutorials die sich konkret auf DX7 beziehen (www.husser.de)

    * Tutorials die sich auf Direct3D beziehen und mich 'nur' Vertizes herstellen
    lassen (www.x-tutorials.de, www.zfx.info); keinen Einblick in die Darstellung
    von Bildern geben

    * Tutorials deren Homepage down ist: www.andypike.com

    Kannst du evtl. mal in deinen Bookmarks nachsehen ob sich dort noch irgendwo
    was zur Darstellung von 2D-Grafiken mit DX8+ befindet? Solltest du ansonsten
    eine Idee haben wie das anzugehen ist wäre ich dir auch dafür sehr dankbar.

    Danke im Voraus,
    Khadgar



  • Nein ich benutze leider noch DDraw7 und habe deshalb keine Tuts jetzt parat. Ich weiß nur dass ich das bereue, nicht gleich DirectX Graphics gemacht zu haben. Für die Darstellung von 2D-Bildern gibt es Sprite-Funktionen, die zoomen, rotieren und den ganzen Schnickschnack beherrschen.
    Ich denke mit Google solltest du fündig werden.



  • Dann probiere ich es mit dem neu gewonnen Wissen über DirectX nochmal dort 🙂

    Danke für deine Hilfe und deine Hinweise,

    Gruß,
    Khadgar


Anmelden zum Antworten