Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.12.2015, 18:40

2D - Grafiken richtig "überlappen" mit SFML.

Ich habe ein kleines Problem. Ich möchte Grafiken die dem unterem Bildschirmrand näher sind als erstes Zeichnen. Damit man bei einem Baum zBsp. nicht den Charakter sieht obwohl er eigentlich hinten vorbeigeht. Bei Sfml ist es aber so das die Grafik die als erstes Gezeichnet werden soll an erster Stelle im Code stehen muss. Weiß einer von euch wie ich das lösen könnte?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.12.2015, 19:18

Wie zeichnest du denn deine Grafiken im Moment? Hast du wirklich eine Zeile Code für jeden Baum?

3

27.12.2015, 19:22

Natürlich nicht, ich benutze Listen und Vectoren.
Mir geht es ums Prinzip wie Ich das den anstellen könnte.

Lares

1x Contest-Sieger

  • Private Nachricht senden

4

27.12.2015, 19:34

Ist eigentlich ganz einfach. Jedes Objekt in deiner Welt hat zusätzlich einen Z-Wert für die Tiefenbewegung. Pro Frame (oder sobald sich die Position eines Objekts in z geändert hat) sortierst du nun die Objekte in deiner Liste anhand des Z-Wertes so, dass das nahste Objekt als letztes (also über allen anderen) gezeichnet wird. Du könntest auch von SFML aus auf entsprechende Funktionalitäten in OpenGL zugreifen (damit die Grafikkarte das übernimmt). Je nach Spiel ist das aber nicht zwingend notwendig und die erste Möglichkeit ist wahrscheinlich einfacher und schneller umzusetzen für dich.

cojo2015

Alter Hase

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

5

27.12.2015, 20:32

Ich würde es genau so machen, wie es @Lares schon geschreiben hat. Mich würde nur interessieren, wofür du das machen willst?

6

27.12.2015, 21:05

Mich würde nur interessieren, wofür du das machen willst?
TE hat es schon geschrieben wozu er es brauch.

Damit man bei einem Baum zBsp. nicht den Charakter sieht obwohl er eigentlich hinten vorbeigeht.


Ich würde auch empfehlen es selber zu implementieren anstatt es irgendwie mit OpenGL zu machen.
Jedes Objekt in deiner Welt hat zusätzlich einen Z-Wert für die Tiefenbewegung.
Um Lares Antwort noch etwas zu ergänzen, den Z-Wert (ich nenne es mal DrawOrder) musst du deinen Objekten als Member mitgeben. Du könntest dir dann eine Vergleichsfunktionschreiben und diese dann z.B. bei std::list::sort() anwenden. Jedes mal wenn die Liste neu geordnet werden muss wird die Sort-Funktion der Liste aufgerunden und gut.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

7

28.12.2015, 00:08

Ja Danke. Ich denke Ich bin zu unfähig Fragen zu formolieren. Das ich da eine Art Z-Achse brauche war mir schon klar, aber ich weiß nicht wie ich das dann mit mehreren Klassen machen soll.
zBsp: Ich habe eine GUI Klasse mit mehreren Funktionen die etwas zeichnen: Livebar,Manabar,... und eine Klasse für den Spieler der natürlich auch gezeichnet werden muss. wie kann ich dann beides also GUI und Spieler nach diesem Schema bearbeiten?

EDIT: Mir fällt gerade auf das GUI ein schlechtes Beispiel ist da es sowiso als letztes gezeichnet wird, aber Ich denke Ihr wisst was Ich meine.

Lares

1x Contest-Sieger

  • Private Nachricht senden

8

28.12.2015, 00:55

Nun wenn du dir die SFML-Klasse Sprite ansiehst (http://www.sfml-dev.org/documentation/2.…f_1_1Sprite.php), dann merkst du, dass diese von Transformable erbt. Ähnlich kannst du es auch mit dem Z-Wert machen, sprich jedes Objekt, dass ein Sprite besitzt erbt auch den Z-Wert. Anstelle der ursprünglichen SFML-Sprite-Klasse benutzt du dann immer die SpriteWithZ-Klasse, welche lediglich ein SFML-Sprite mit zusätzlicher Z-Komponente ist.
Zum Rendern brauchst du nur die Informationen der SpriteWithZ-Klasse, insofern reicht es das Sprite jedes zu zeichnenden Objekts in die Liste zu packen, die Liste zu sortieren und dann jedes Sprite zu zeichnen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

28.12.2015, 02:42

Was du suchst ist einfach std::sort() bzw. std::stable_sort(). Du willst deine Sprites z.B. erst per std::sort() nach der x-Koordinate sortieren und dann per std::stable_sort() nach der y-Koordinate und fertig. Noch besser wär's natürlich, wenn du deine Listen gleich von vorn herein richtig herum befüllst... ;)

10

28.12.2015, 10:01

Was soll das Sortieren nach x und y bringen? Dann lieber nach z sortieren. Dann kann man für jedes Objekt einzeln festlegen, wie weit weg das ist.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Werbeanzeige