[Preview]Isometric Tile-Engine

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Derzeit hänge ich wieder bei der Layersache, die Spielfiguren sollen überdeckt werden, wenn sie hinter einem Baum stehen, aber nicht davor, was derzeit leider auch der Fall ist...

zeichne alle objektlayer in einer schleife, und streng nach y-koordinate der unterkante des sprite... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Wenn es nur so einfach wäre...
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Es ist so einfach.

Du mußt in zwei durchgängen berechnen: erst alle Böden und dann alle mauern und objekte. Zeichnest du dann in der richtigen reinfolge wird auch nichts falsch überdeckt, außer du hast sehr große objekte, dann merkst du dir alle tiles auf denen dein objekt steht und zeichnest dein objekt für jedes tile einmal. Dann werden teilüberzeichnungen ausgeglichen.

Unterstützt deine engine Blöcke über Blöcke, dann zeichnest du jede schicht von hinten nach vorne, und von unten nach oben.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Nein, so einfach ist das im letzteren Fall auch nicht - es sei denn, es gibt wirklich nur Blöcke und auch Figuren können immer nur direkt auf Blöcken stehen. Ansonsten mußt Du nämlich alle vertikalen Pixel (also vom Bildschirm aus gesehen - bei einer Auflösung von 1024x768 wären es also 768 Schritet) von hinten nach vorn durchgehen, und für JEDEN Pixel erstmal von unten nach oben alle entsprechenden darauf stehenden Figuren / Objekte zeichnen. Und da mußt Du Dir von vorneherein ein Limit setzen, wie hoch das ganze werden kann. Und dann kommt noch dazu, daß JEDER Block ein Boden sein kann, deswegen mußt Du dann bei jedem Boden, auf dem eine Figur steht, Dir das merken und sobald der Boden gezeichnet wurde, die Beine der Figur nochmal zeichnen.

Also Iso in 2D ist noch relativ einfach, da sortiert man nach sichtbarem Y-Wert (der sich berechnet aus X+Y), und zeichnet i.d.R. erst Boden und dann den Rest - aber sobald es 3D wird und man in alle Richtungen Dinge plazieren kann, kann es schon sehr trickreich werden, und vor allem muß man auch an die Performance denken. Eine Priority-Queue ist hier eine gute Idee, die sortiert nämlich automatisch. Also alles reinwerfen (vorher testen, ob es überhaupt sichtbar ist) und danach Stück für Stück entnehmen und zeichnen. Weiß aber nicht, ob es bereits eine gute Priority-Queue für PB gibt.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hm... meiner ansicht nach denkt ihr manchmal zu kompliziert...

mal angenommen, ich hab ne iso-ansicht,
auf jeder tile kann sich ne anzahl blöcke übernander befinden,
(jetzt mal vorerst nicht unterschiedliche etagen, nur stufen sozusagen)
spielfiguren und objekte können überall umeinander wuseln.

dann gehe ich einfach von hinten nach vorne tile-weise vor,
und zeichne für jedes einzelne tile alle objekte von unten nach oben.

hier habe ich gar keine veranlassung, feine y-koordinaten zu haben.


wenn ich hingegen eine landschafts-engine habe,
wo auf den Tiles mehrere objekte gleichzeitig stehen können.
dann speicher ich für die objekte eine feinkoordinate, und zwar die seiner unterkante.
dann zeichne ich für jede tile alle objekte nach feinkoordinate sortiert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ich versuche es mal zu veranschaulichen:

Hier ein (hässliches) Rohgerüst einer Iso-Map:
Bild

Methode A:
Du zeichnest die Teile in der Reihenfolge, wie sie nummeriert sind.
Alles kein Problem, die Iso-Ansicht ist perfekt.
Jetzt hast du eine Spielfigur, die z.B. von Feld 9 auf Feld 12 laufen will.
Sie setzt sich also ein paar Pixel in Bewegung.
Sie ist praktisch gesehen noch auf Feld 9, also setzt du die Spielfigur, nachdem du Feld 9 gepinselt hast, allerdings ragt die Figur schon in Feld 12, was ja erst später gezeichnet wird. Der Haxen der Spielfigur wird also abgeschnitten.

Nun gut, du kannst dir ja sagen, o.k. sie bewegt sich auf 12, also werde ich warten bis Feld 12 dran ist und sie dann erst zeichnen. Was aber, wenn auf Feld 11 ein ziemlich hoher Felsblock steht, der dein halbes Feld 9 überdeckt ?. Er würde vorher gezeichnet werden und deine Figur hinterher, ihn also überdecken.

Was nun, wenn die Spielfigur so breit ist, dass sie sogar in Feld 14 ragt ?

Methode B:
Du zeichnest 1,4,7,10,13,6,9,12...
Naja, ich bin jetzt zu faul, aber hier entstehen genau die selben Effekte.

Fazit:
Zaphods Methode ist in diesem beschriebenen Fall die schnellste und beste, weil der komplette Boden einfach als erstes gezeichnet wird. So braucht man sich keinen Kopf machen, wie und warum und überhaupt.

Aber:
Wie ZeHa schon sagte:
Sobald man die Spielfiguren dann auch noch in der (virtuellen) Z-Achse bewegt, hört das auch schon wieder auf. Dann kann plötzlich jeder Felsen zu einem potentiellen Boden werden.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Jepp, und da muß man dann echt gut aufpassen...

Iso ist eine der schlimmsten Perspektiven, wenn's um's Programmieren geht, aber eine der coolsten, wenn's um die Optik geht ;)

Wenn man noch keine Iso-Engine programmiert hat, stellt man es sich schnell zu einfach vor. Und auch wenn man anfängt zu planen, dann denkt man "was soll daran schwer sein". Aber nach jedem gelösten Problem kommt auf einmal wieder ein neues, das man sich vorher nicht im Traum hätte vorstellen können.

Eine Top-Down-Perspektive wie bei Zelda oder Young Merlin (also nicht komplett von oben, sondern so seitlich von oben, also daß sich Objekte auch teilweise überdecken) sieht im Grunde auf den ersten Blick nicht viel anders aus, aber die Programmierung ist wirklich entschieden einfacher. Auch wenn man es zunächst nicht glaubt ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Also das mit der "isometrie" kriege ich hin, halt bloß das mit der Spielfigur nicht so ganz... denn die steht nicht nur in der Mitte der Flächen, sondern kann überall stehen, auf jedem Pixel, sie ist unabhängig von der Map. Bei einer Spielerbewegung wird die Map bewegt, die Spielfigur bleibt immer in der Mitte des Bildschirms.

Ich habe aber schon eine theoretische Lösung:
Ich mache es einfach geschickt so, dass gar nichts den Spieler verdeckt (also so etwas wie Bäume), jedoch Dächer etc., die ja wiederum nicht vom Spieler überdeckt werden können.

@ZeHa: Die TopDown Perspektive hatte ich auch schon überdacht und längst geproggt, allerdings passt die nicht so wirklich, die ist zu "harmlos", die gibt so einen Gameboylook... einfach zu unspektakulär

PS: das mit der Zeichenreihenfolge der Tiles habe ich sogar besser hinbekommen! (erstmal eine Reihe fertig zeichnen (von links nach oben), bevor die darunterliegende angefangen wird) <)

So sieht es derzeit bei mir aus:

Bild
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ich mache es einfach geschickt so, dass gar nichts den Spieler verdeckt (also so etwas wie Bäume), jedoch Dächer etc., die ja wiederum nicht vom Spieler überdeckt werden können.

Es gibt da schon bessere Lösungen. Prinzipiell mußt Du, wenn Du eine flache Map hast (also wo jedes Teil auf dem Boden aufsetzt und sich nur durch die eigene Höhe unterscheidet), nach (X + Y) sortiert zeichnen, und zwar nicht die Koordinaten vom Feld, sondern tatsächlich pixelgenaue Koordinaten.

Es sollte wirklich jemand eine Priority-Queue programmieren... oder Du nimmst 'ne LinkedList und sortierst die jedes mal (was nicht so tragisch wäre, weil sie sich nicht großartig umsortiert sondern zum großen Teil gleich bleibt).
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Vermilion hat geschrieben: PS: das mit der Zeichenreihenfolge der Tiles habe ich sogar besser hinbekommen! (erstmal eine Reihe fertig zeichnen (von links nach oben), bevor die darunterliegende angefangen wird) <)
Also nach oben kann nicht besser sein, weil falsch...
Nur bei deinen Tiles is es eh ziemlich irrelevant, bau mal nen höheren Felsbrocken ein und sieh dir das Ergebnis dann an.
Antworten