Feststellung:
Die Geschwindigkeit für die Berechnung der Pixel, lässt sich extrem beschleunigen, wenn man
1.) das Level verkleinert; um auch mehr oder größere Tabellen in den Speicher laden zu können.
2.) alle Schleifen ausschreibt und alles nicht so wissenschaftlich sieht.
Zu 1.)
Das Level ist jetzt 64*64 = 4096 Bytes groß und scheint als Spielfläche ausreichend zu sein, d.h. man benötigt keine Tiles.
Zur Geschwindigkeit: Um die 64 Höhen für den angezeigten Ausschnitt (8x8 Punkte) aus dem Level auszulesen, kann man einmal die Levelposition umrechnen und dann indiziert auf die ersten 32 Punkte zugreifen. Danach erhöht man das Highbyte der Levelposition und greift auf die restlichen 32 Punkte zu.
Als zweiten Schritt kann man das angezeigte Gitter mit dem Softscroll-offset vorbereiten.
Bspw:
x[i] = 16*(i%8)+softscroll für alle 64 Punkte
und
z[i] = i*16+softscroll für die 8 Tiefen in das Feld.
Im dritten Schritt wandelt man die 3D-Koordinaten mithilfe der bereits erwähnten Tabelle in Bildschirmkoordinaten um. xs[i] = x[i] / z[i%8] und ys[i] = (Levelhöhe für Punkt i + globaleHöhe) / z[i%8]
Die Tabelle beinhaltet nur Absolutwerte, d.h. um eine x-Koordinate umzuwandeln, wird unterschieden, ob sich der Punkt links oder rechts von der Bildschirmmitte befindet und danach wird entsprechend zur Bildschirmmitte der Wert aus der Tabelle addiert oder von ihr abgezogen. Bei der y-Koordinate muss man sich keine Gedanken machen. Hier ist es eher wichtig, dass man sich im Rahmen der Tabellengröße bewegt.
Jetzt können die Punkte gezeichnet werden.
Zum Schluss lassen sich die gespeicherten Bildschirmkoordinten bei der nächsten Bewegung zum Löschen der Punkte nutzen.
Zu 2.)
Im Prinzip ist alles sehr einfach und der ausgeschrieben Code passt in ca. 1400 Byte.
Angehängt ist ein Beispiel, bei welchem ich mir keine Mühe um das "Drumherum" gemacht habe und welches auch abstürzen kann.
Es soll zur Demonstration der Geschwindigkeit dienen. Viel mehr ist realistisch gesehen nicht drin (, d.h. es kann nur langsamer werden).
Die Berechnungen und Tabellen sind nicht geprüft/korrigiert etc. und das Level ist auch nicht wirklich im Speicher, sondern man sieht nur "Müll".
Der Eindruck der Geschwindigkeit kommt mit Sicherheit auch durch die Nutzung einer Beschleunigungsfunktion bei der Steuerung.
(...)
Was zu tun wäre (, irgendwann einmal...):
- Die Tabellen korrigieren. Evtl. versuchen sie nochmal zu verkleinern, um mehr Y-Werte zulassen zu können (am liebsten 255 bzw. den genannten Trick mit dem Shift auszuprobieren.
- Double-Buffering, d.h. am besten alles 2 mal unterbringen. (Speicher ist genug da)
- Korrektur an der Steuerung (Ich glaube, dass ich irgendwo addiere statt zu subtrahieren o.ä. etc..)
und dann könnte man sich wieder um die Linien und eine Füllroutine kümmern.
testzarch5.prg