Ergebnis 1 bis 7 von 7

Thema: Spriteanordnung bei 2D-Tile-Spielchen (Theorie)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Spriteanordnung bei 2D-Tile-Spielchen (Theorie)

    Hallöchen,

    ich bin gerade dabei, ein tilebasiertes 2D Spielchen zu erstellen. Dabei bereitet mir die korrekte Anordnung der verschiedenen Layer Probleme. Als Testobject habe ich einen Baum gewählt (in 32 x 32 Pixel große Tiles geteilt).


    Das Problem dabei ist, der Spieler soll sich einmal vor dem Baum, und einmal hinter dem Baum bewegen können. Also einmal nicht verdeckt vom Baumstamm und Baumkrone und einmal verdeckt.
    Dabei ist es jetzt wichtig, wie ich die Sprites auf der Höhe anordne. ich habe von -10000 bis 10020 Positionen wo ich Sprites anorndern kann, diese werden in der Reihnfolge von - nach + angezeigt. (Also 10020 als oberstes, -10000 als unterstes, verdeckt von allen folgenden).

    Ich habe für jedes Tile eine Positionsvariable welche angibt, ob sich das Tile "immer über dem Spieler", "über dem Spieler wenn Spieler-Y kleiner oder gleich Tile-Y ist" und "immer unter dem Spieler".
    Das erste und letzte sollte klar sein, das zweite bedeutet praktisch, dass das Tile auf einer höheren Ebene als der Spieler angezeigt wird, wenn des Spielers Y-Position (Wo seine Füße stehen) auf dem Bildschirm auf gleicher Höhe oder weiter oben sind. Praktisch, wenn er hinter dem Tile steht, wird es auf höherer Ebene angezeigt, ansonsten unter ihm.
    Soweit die Theorie, in der Praxis gibt es da leider Probleme:


    (Aus Kontrastgründen ist der Spieler hier komplett weiß)
    Die Symbole Viereck, Kreis und Pfeil kennzeichnen den Positionsstatus der Tiles. Viereck ist unter Spieler, Kreis ist über Spieler wenn dieser hinter dem Tile steht und Pfeil ist immer im Vordergrund.

    Wie man bei 1. erkennen kann, soll es so aussehen, wenn der Spieler davor steht.
    Bei 2. steht der Spieler hinter dem Baum, da das erste Problem. Der Oberkörper und Kopf werden durch den Stamm hindurch angezeigt, da die Füße des Spieler unterhalb des Baumstammes sind und der Spieler damit im Vordergrund steht. Lediglich das eine Tile welches auf Fußhöhe ist, wird darüber gelegt.
    Bei 3. habe ich versucht, das Problem zu beseitigen, indem ich die Tiles auf "immer drüber" schalte, welche in 2. noch unter dem Spieler waren. Dabei ergibt sich leider wieder ein anderes Problem, bei dem der Spieler nun nicht mehr vor dem Baum stehen kann, ohne dass diese immer-höheren Tiles ihm den Kopf "absägen".

    Etwas zur Technik:
    Ich verwende C++ mit OpenGL, daher hab ich hardwarebasierte freie Platzierung der Sprites im 3D-Raum, was die Sache eigentlich erleichtern "sollte" (Bis jetzt merk ich wenig davon -__-).
    Bisher befindet sich der Spieler immer an Position 0 in der Tiefenebene. Tiefergelegte Sprites werden unter 0 gestapelt, höhere über 0. Und wie gesagt, bis jetzt liegt die Grenze für den Bereich zwischen -10000 und 10020 möglichen Positionen. (wobei afaik auch Kommazahlen möglich wären, was theoretisch unendlich Positionen ausmachen würde).

    Die Frage ist nun, wie kann man so einen Effekt vermeiden und wie realisiert man eine korrekte Anordnung der Höhen von Sprites? Bei mehreren Layern untereinander gibts noch keine Probleme aber wenn ein Spieler hinzu kommt, der mal hinter und mal vor einem Layer sein soll, dann siehts aus wie oben auf den Bildern.
    Ich hoffe, es gibt hier ein paar kundige Leute die mir dabei helfen können.

    mfg.

    Ynnus

  2. #2
    Du könntest die Bäume irgendwie zu "Tilegruppen" machen, wobei die Renderreihenfolge nach dam y Wert des untersten Tiles berechnet wird. Dann werden zusammenhängende Objekte auch immer als Ganzes gerendert.

  3. #3
    Zitat Zitat
    Du könntest die Bäume irgendwie zu "Tilegruppen" machen, wobei die Renderreihenfolge nach dam y Wert des untersten Tiles berechnet wird. Dann werden zusammenhängende Objekte auch immer als Ganzes gerendert.
    Erstmal Danke für die Antwort, leider macht mir genau dieses "irgendwie" Probleme. Wie sollte man das realisieren? Wie soll ich den Tiles verklickern, dass sie keine einzelnen Teile sind sondern sich nach dem Tile XYZ zu richten haben? Mein Editor sieht eigentlich nur vor, Tiles unabhängig zu platzieren und nicht gruppieren zu können.

  4. #4
    Wie waere es dann, wenn du nicht die Tiles der Map gruppierst, sondern die Tiles des Spielers. Das sollte der kleinste Aufwand sein, da diese eben nicht zur Map gehoehren.

    Alternativ koentest du auch versuchen eine Y-Z-Korrelation zu machen, das heisst, je hoehr auf Y das Fuss Tile des Spielers liegt, desto kleiner der Z-Werte des Spielerlayer, wobei alle Tiles des Spielers auf dem selben Layer liegen. Da Maptiles alle ebenfalls im jeweils gleichen Layer liegen, sollte der Spieler somit entweder komplett vor oder komplett hinter dem Objekt liegen.

    Im Grunde wuerden diese Layer dann die Gruppierung ausmachen, alles, was auf der selben Y-Zeile Fusst, kommt automatisch in den selben Layer ...

  5. #5
    Zitat Zitat von Ineluki
    Wie waere es dann, wenn du nicht die Tiles der Map gruppierst, sondern die Tiles des Spielers. Das sollte der kleinste Aufwand sein, da diese eben nicht zur Map gehoehren.
    Der Spieler ist ein Sprite und somit gruppiert, wenn man es so nennen will. Allerdings eben die Tiles nicht, welche sich dann ab und an über den Spieler schieben.

    Zitat Zitat von Ineluki
    Alternativ koentest du auch versuchen eine Y-Z-Korrelation zu machen, das heisst, je hoehr auf Y das Fuss Tile des Spielers liegt, desto kleiner der Z-Werte des Spielerlayer, wobei alle Tiles des Spielers auf dem selben Layer liegen. Da Maptiles alle ebenfalls im jeweils gleichen Layer liegen, sollte der Spieler somit entweder komplett vor oder komplett hinter dem Objekt liegen.
    Bei mehreren (bei mir unbegrenzte Anzahl) Layer wird das aber sehr aufwändig, oder hab ich das System nicht richtig verstanden? Ich habe etwa 20 Layer welche alle ein Tileset haben und welche alle der Reihe nach sortiert werden. Jedes Tile hat die Möglichkeit, über dem Spieler zu sein. Wenn jetzt der Spieler bei Höhe 0 beginnt und dann einen Schritt hoch macht und dann bei -1 Höhe ist, würde er höchstens hinter dem 1ten Layer sich befinden, nicht hinter den dahinterliegenden 19 anderen Layer welche alle mit einer Höhe Abstand hintereinander liegen.
    Anders gesagt, mein System ist darauf ausgelegt, dass jedes Tile, egal welches Layers (kann auch ein Tile des untersten Layers sein), die Möglichkeit hat, über dem Spieler dargestellt zu werden. Dann muss man zwar zusehen, dass kein darüberliegender Layer ein Tile an der Stelle hat, welches unter dem Spieler ist, weil das sonst optische Probleme gibt, aber so lässt sich bequemer mappen, als wenn man darauf achten muss, auf welchem Layer welches Objekt liegt, um nachher richtig angeordnet zu sein.
    Es gibt also keine Layer welche immer unter und welche immer über dem Spieler sind, alles ist flexibel nach der Positionsvariablen sortiert, wobei die Layer untereinander sortiert sind (mit Abstand 1).

    Und wenn das jetzt alles kein Problem bei deinem System wär, hab ich es nicht richtig verstanden. D

  6. #6
    Warum trennst du Objekte nicht vom Tileset ab und zeigst sie als eigenständiges Sprite an?

    Kachelung bringt nur den Vorteil wenn eine Kachel mehrmals verwendet wird. Diese Baumkacheln werden aber immer nur als ganzer Baum benutzt, ob du jetzt also zweimal alle Kacheln, oder zweimal das Baumsprite zeichnest, macht keinen Unterschied.

    Ich sehe da beim Baum keinen wirklichen Vorteil ihn, wie Bodenflächen in Tiles zu unterteilen, die Nachteile siehst du ja selber =).

  7. #7
    Ich hab parallel dazu in einem anderen Forum nachgefragt, hier mal der Stand der Dinge:

    Zitat Zitat
    Ja, ich bin auch gerade dabei zu überlegen, in wie fern solche Objekte überhaupt als TIles behandelt werden sollten oder in wie fern man sie als Objekte einbringt. Mein Editor sieht bereits vor, dass man Objekte platzieren kann, da könnte ich auch Bäume einladen.
    Die Frage ist, wo hört das auf? Plötzlich ist alles nur noch Objekt, nichts mehr Tile. Und ob das so gut ist, ist die Frage. Eigentlich sollte es ein Tileeditor werden. Und wenn plötzlich nur noch der Boden mit Tiles bepflanzt wird, ist es ein etwas seltsamer editor...
    Aber irgendwo müsste man solche großen Objekte wirklich gruppieren und als ein Objekt machen. Die Frage ist, was bleibt Tile und was wird Objekt?
    Und wenn dann plötzlich alles Objekt wird, nur die Bodentexturen nicht, brauche ich auch keine Layer mehr, da man dann ja auf einem Layer unbegrenzt viele Objekte platzieren kann.
    Zitat Zitat
    Ich schätze, ich bin gerade dabei, meinen Editor komplett umzubasteln und daraus einen 2D-Editor zu basteln, der nichts mehr mit Tiles zu tun hat. Alles wird über Objekte geregelt, für Flächen kann man sich selbst Vertexe zeichnen und mit Textur bespannen. (Dank OpenGL sollte das ganz gut machbar sein). Das gibt mehr Freiheit in der Mapgestaltung aber erfordert leider eine komplette Überarbeitung meines schönen editors. Sad

    Hier sind übrigens mal ein paar Bildchen meines Editors:
    http://derfeind2k.de/daten/mapedit%204.0.png

    http://derfeind2k.de/daten/mapedit%205.0.png

    http://derfeind2k.de/daten/mapedit%206.0.png

    Also ich werden meinen Editor zum größten Teil überarbeiten und komplett auf Objekte bzw. Polygone setzen, welche ich in OpenGL bereitstellen werden. Diese per Textur überziehen, fertig. Das bietet mehr Flexibilität beim Mappen und sieht im Endprodukt besser aus.

Berechtigungen

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