Höhenanordnung von Sprites bei 2D tilebasierten Spielen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Höhenanordnung von Sprites bei 2D tilebasierten Spielen

Beitrag von Ynnus »

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).
Bild

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:

Bild
(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 kein PureBasic sondern 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 -__-).
(Und muss somit nicht darauf achten, in welcher Reihnfolge ich die Sprites anzeigen lasse sondern nur, an welcher Z-Stelle).
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.

Sunny


@Moderatoren Team: Ich weiß zwar, dass wir hier ein extra Forum für andere Sprachen haben, aber hier ist es ja letztlich egal, welche Sprache es ist. Es geht ja mehr um die Theorie als die Praxis. Und das ist ja überall gleich oder zumindest sehr ähnlich. Daher bitte ich darum, dieses Thema nicht zu verschieben, denn hier in diesem Subforum gehts ja um Spiele- und Grafikprogrammierung.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Warum teilst du den Baum überhaupt logisch auf? Das mit den Sprites ist ja evtl. noch ok, aber der Baum sollte immer als ein Objekt (mit einem einzigen z-Wert) behandelt werden.

D.h. du hast z.B. folgende logische Map

Code: Alles auswählen

00000
00000
00000
00B00
gezeichnet wird aber dies hier (an einem Stück, bzw. mit derselben Z-Info)

Code: Alles auswählen

00B00
0BBB0
00B00
00B00
Ich weiß, ist kein sehr schöner Baum :)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

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.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

@Sunny,

Du must einfach nur abstrakt genug denken.
Ich würde sagen alles ist ein Objekt.

Was spricht dagegen das ein Objekt nicht auch wie ein 'Tile' behandelt wird?

Wenn Du mir erklärst wie der Unterschied von 'Tile' zu Objekt aussieht, wirst Du merken das da kein Unterschied ist.
(Wenn doch dann sollten wir nochmal miteinander reden ;-)
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Doch, der Unterschied von Objekt zu Tile ist, dass man bei mir Objekte ähnlich wie Grafikobjekte in einem Bildbearbeitungsprogramm frei auf der Karte platzieren kann, die Größe verziehen, eine Animation hinzufügen, usw. So sehen bei mir Objekte aus. Tiles sind fest im 32 x 32 Pixel Raster gelegt und werden aus einem Tileset "gerippt". Sie lassen sich auf die Layer legen und werden durch die Objekte ergänzt.

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. :(

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
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag von Green Snake »

cool, die bilder vom editor sehen gut aus :allright:
-.-"
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Wieso hast du den Desktop dabeigelassen. Das kostet nur Ladezeit.
:roll:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Ursprünglich dienten diese Bilder zur dokumentation des Editors, sie stellen unterschiedliche Zeitabschnitte und Entwicklungsstadien dar (Dies sind nur 3 von 8 Bildern). Daher hab ich ein volles Bild mit Hintergrund und Entwicklungsumgebung (bis auf das mit dem Desktop) erstellt und eben kein zugeschnittenes Bild erstellt.
Wer die großen Daten scheut, der muss es sich ja nicht ansehen. Die Bilder waren nur zum Verständnis noch angehängt, da ich die Bilder nun schonmal online auf dem Webspace hatte.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

Ich kenne mich zwar mit Tiles nicht gut aus,
aber ich gehe mal davon aus das du sie mit der Sprite Libary benutzt.

Deshalb schlage ich dir vor die Tiles mit Sprite3D zu verwenden.
Da kannst du für jedes Sprite einen Optionales Z Wert angeben.
Nachteil ist aber es ist langsamer
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

unix hat geschrieben:Ich kenne mich zwar mit Tiles nicht gut aus,
aber ich gehe mal davon aus das du sie mit der Sprite Libary benutzt.

Deshalb schlage ich dir vor die Tiles mit Sprite3D zu verwenden.
Da kannst du für jedes Sprite einen Optionales Z Wert angeben.
Nachteil ist aber es ist langsamer
Lies mal seinen ersten Beitrag, er nutzt C++ und OpenGL. Nichts mit PureBasics Libraries.
[EDIT]
Warum sollte es langsamer sein? D3D ist schneller als DD!
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten