?
Entschuldigt, wenn es auch schon etwas länger her ist, aber ich denke, ich habe eine Lösung für dieses Problem hier:
Metal_Zone schrieb:
xxxxxxxxxx
xoxxoxxxxx
xoooooooox
xxxoxxxxxx
xxxooooxxx
xxxxxxxxxx
X = Wand; O = frei
Ist die einfachere Methode und lässt später noch Türen, Leitern usw. zu.
Kreuzungen ergeben sich bereits aus dem Wegverlauf.
Metal_Zone schrieb:
Da bekomme ich dann leider ein Speicherprolem und vom Abfragen her wird's auch nicht viel einfacher, z.B. wenn ich nach Osten schaue, muss ich das ganze ja auch irgendwie "drehen"...
Ja, aber nur den sichtbare Bereich muss "gedreht" werden und dass lässt sich so lösen:
Nehmen wir mal an, du hast eine Sichtweite von 3 Schritten nach vor und jeweils einen Schritt links und rechts und der Spieler blickt nach Osten.
xxxxxxxxxx
xoXXOxxxxx
xoOOOoooox
xxXOXxxxxx
xxxooooxxx
xxxxxxxxxx
Die Großbuchstaben zeigen jetzt dein Sichtfeld, du stehst vor der Kreuzung und siehst nach Westen.
Zum ersten, drehen muss man nur den sichtbaren Bereich und zwar so, daß man immer nach Norden sieht. Bei der Darstellung am Bildschirm sieht man auch immer nach Norden, da man die richtige Himmelsrichtung nicht wirklich bestimmen kann und es auch das Zeichnen auch wesentlich einfacher gestaltet .
(Natürlich kann man auch ein N, W, O od. S irgendwo anzeigen )
Dazu braucht man jetzt in diesem Fall ein Array von 9 Feldern welches wie folgt aussieht:
01 02 03
04 05 06
07 08 09
Jetzt überträgt man den sichtbaren Kartenausschnitt auf das Array, wobei die Position, wo der Spieler selbst steht immer 08 ist.
07 ist jetzt der Kartenteil links vom Spieler und 09 ist der Kartenteil rechts vom Spieler.
05 ist der Kartenteil direkt einen Schritt vor ihm usw.
So erreicht man jetzt eine "Drehung" nach Norden.
Jetzt geht es an den Ausgabebildschirm:
Nun muß von hinten nach vorne gezeichnet werden, wobei, hat man ein X, so muß man eine Wand zeichnen, hat man ein O, so braucht man nichts zeichnen, da normalerweise bei jedem Schritt der Ausgabebildschirm gelöscht und immer neu gezeichnet wird, so bleibt der Bereich also frei und der dahinter liegende Bereich wird gezeigt.
Bei der hintersten Ebene (1,2,3) sind die Tiles also am niedrigsten. Man zeichnet also die entsprechenden Tiles etwas ober der Mitte des Bildschirms.
_____________________
| |
| |
|---------------------|
|---------------------|
| |
|_____________________|
Bei der mittleren Ebene (4,5,6) sind die Tiles höher als die Tiles der hintersten Ebenen. Folglich zeichnet man Tiles etwas über der ersten Ebenen.
Handelt es sich um eine Wand, so wird also die hinterste Ebene übermalen.
_____________________
| |
|---------------------|
| |
| |
|---------------------|
|_____________________|
Bei der vordersten Ebene (7,8,9) sind die Tiles genau so hoch wie der Ausgabebereich und kann man von einfach zu zeichnen beginnen.
_____________________
| |
| |
| |
| |
| |
|_____________________|
Vom Speicher- bzw. Geschwindigkeitsbedarf her, lässt sich hier sicher noch einiges optimieren, aber der Weg bleibt, denke ich immer der gleiche.
Vorteil hierbei habe ich noch, das Sichtfeld lässt sich beliebig erweitern oder verkleinern.
Wenn sich jetzt die Sichtweite ändert, so muß man natürlich auch die Ebenen am Ausgabebildschirm anpassen.
Ich hoffe, ich konnte diesen Lösungsansatz verständlich und von Programmiersprachen unabhängig wie möglich beschreiben.
Grüße.