Beitrag
von lytron » 27. Dezember 2012, 12:45
Eine Idee, in den Äther hinein...
Thema: Collision Map.
Eine reguläre Collision Map, wie ich sie in meiner RPG-Engine eingebaut habe, ist recht speicherintensiv, also könnte man ja mal eine andere Methode wählen...
eine wäre natürlich, die Collision Map zu komprimieren und innerhalb des RAMs (irgendwo da, wos keiner sieht, ich meine zwischen $7E2000 und $7FFFFF) zu dekomprimieren.
Oder, kam mir gerade die Idee, man schreibt zwei aufsteigende Listen. Die eine Liste ist für die begehbaren, die andere für die nicht-begehbaren Tiles. Es wird jeweils nur *das erste Tile* der Reihe benannt, die nachfolgenden Tiles haben dieselbe Eigenschaft, bis in der anderen Liste ein entsprechender Eintrag ist. Was meine ich?
Beispiel:
Begehbar: $00, $08
Nicht begehbar: $04, $0A
Ergibt:
Begehbar: $00, $01, $02, $03
Nicht begehbar: $04, $05, $06, $07
Begehbar: $08, $09
Nicht begehbar: $0A...
Der Abgleich erfolgt dann folgendermaßen: Die zu-untersuchende Tile-Adresse wird genommen (das ist, z. B. beim Hoch gehen, aktuelle Adresse minus $20, beim rechts gehen plus eins etc.) und mit einer der Listen abgeglichen, bis in der Liste ein Eintrag gefunden wird, der größer ist. Dann wird der vorherige Eintrag genommen. Beisipiel: Zu untersuchen ist $07.
Er geht die Begehbar-Liste ab, bis er auf $08 stößt. Dann nimmt er den vorherigen Eintrag. Das ist $00.
$00 wird zwischengespeichert.
Den gleichen Abgleich führt er mit der zweiten Liste ab. Er bliebt bei $0A stehen, geht einen zurück und speichert $04 zwischen.
Jetzt führt er einen Abgleich zwischen den beiden durch. Da $04 größer ist, gilt für $07 dasselbe wie für $04. Und das ist nicht-begehbar.
Zur Optimierung des ganzen könnte man ihn die Listen nicht in der richtigen Reihenfolge absuchen lassen, sondern "immer die Mitte der noch zu untersuchenden Spanne" testen lassen.
Heißt: Bei 20 Einträgen untersucht er zuerst den zehnten, in Abhängigkeit davon untersucht er als nächstes entweder den fünften oder den fünfzehnten usw.
PRO:
- In der Masse sicherlich speichersparend
CONTRA:
- Rechenintensiv
- Wird derartig schwer, events in die Collision Map einzubauen
~~~
Praktikabler wäre sicherlich die Idee, die Tilemap im RAM zeichnen zu lassen.
Für soetwas könnte man dann etwas schreiben, dass auf 3-Byte-Befehle reagiert:
Befehl, Inhalt, Länge.
Befehl ist, z. B.: Schreibe, komplementiere oder beende die Subroutine.
Inhalt ist das, mit dem Geschrieben oder das Komplement gebildet wird, Länge ist die Menge der Loops, die es zu durchlaufen hat.
Und jetzt kommt der Clou: Man könnte sich z. B. im Befehls-Byte die untere Hälfte der Werte ($00 bis $7F) für spezielle Schreibbefehle vorbehalten.
Z. B. ist $01 das reguläre schreiben, bei $02 wird nur jedes zweite Tile beschrieben, bei $03 nur jedes dritte usw. Auf die Art und Weise kann man nämlich $20 schlicht vertikal "zeichnen".
Nach Ende dieser Subroutine kann man dann einzeln die Spezialfälle hineinstippeln (z. B. per Subroutine, die 2-Byte- oder 3-Byte-Befehle frisst, wahlweise ein Inhalt-AdresseLowByte-AdresseHighbyte, oder Inhalt-SchrittweiteVomLetztenStippelpunkt).
Wäre mal mehr drüber nachzudenken.
pantalytron: ルトロンはくそのディスアセンブラだよ!
Perikles hat geschrieben:Man muss sich das mal reinziehen: die Idee ist scheiße, die theoretische Ausarbeitung ist scheiße, die praktische Umsetzung ist scheiße und der so entstehende Anspruch noch beschissener.