Hallo Besucher, der Thread wurde 1,4k mal aufgerufen und enthält 5 Antworten

letzter Beitrag von Soulstealer am

Einzelnes 2x2 Tile setzen

  • Momentan stehe ich vor dem Problem, einigermaßen elegant ein einzelnes 2x2 Tile auf den Bildschirm zu bringen :cursing:
    Ich verbrauche irgendwie jede menge Speicher für vier Tabellen jeweils (Hi+Low Screen+Colormem), sowie danach noch einiges an ZP Addition. :cry:
    Bei meinem (2x2) Screen gibt es 19 Spalten in 11 Zeilen (der erste und letzte Char bleibt immer leer, angefangen wird ab Zeile 2).


    Das Rendern des gesamten Screens braucht als (halber) Speedcode nur m.M.n. schlanke ~734 kb (Syntax ist C64 Studio)


    Hat da jemand einen Tipp/Rant oder Beispielsource, wie man das schöner/schneller/kleiner machen kann?

  • Ich verbrauche irgendwie jede menge Speicher für vier Tabellen jeweils

    Ob Du die Tabellen wirklich brauchst, hängt vom Aussehen Deiner Tiles ab. Bei 2x2-Charsets oder so simplen Grafiken wie bei Boulder Dash käme man wohl ohne Tabellen aus, da man Tile "n" einfach immer aus den Chars n, n+64, n+128 und n+192 zusammensetzen kann.
    Mit Tabellen lassen sich die Tiles dagegen beliebig zusammensetzen.

    Code
    1. ldy counter
    2. lda level_cache+(ROW*19),y
    3. tax
    4. lda counter
    5. asl ; multiply by 2
    6. tay

    Idee 1: Statt "lda counter" reicht hier auch "tya".
    Idee 2: Das mehrfache Verdoppeln von "counter" im Speedcode ist überflüssig - einfach einmal vor dem Speedcode machen und in die ZP schreiben, dann reduziert sich das Verdoppeln auf "ldy cached_write_counter".
    Idee 3: Der Lesezähler "counter" zählt von 19 bis 0 in Einerschritten, während der Schreibzähler in Zweierschritten zählt. Am Schreibzähler kann man bei 2x2 nichts ändern, aber durch Interleaving der Leveldaten könnte man den Schreibzähler auch gleich zum Lesen benutzen. Dann fällt das Verdoppeln komplett weg, nur der Initialwert wäre anders und DEC müsste zweimal statt einmal ausgeführt werden.

  • @Mac Bacon
    Danke schon mal für die Tipps, die habe ich direkt umgesetzt. Aber das Rendern des kompletten screens war ja schon relativ flott und kommt ja ohne Tabellen aus.
    Ich habe nur keine gute Lösung ein einzelnes Tile neu zu setzen, z.B. wenn man was einsammelt und das vom screen verschwindet.
    Dank @Squidwards Tipp brauche ich zumindest zwei Tabellen weniger. Trotzdem rechne ich da noch für meinen Gechmack zu viel, dafür dass ich zwei Tabellen als 'Cache' habe.


    Edit: Das mit dem Interleaving habe ich noch nicht so ganz verstanden. Wie sollten die Daten denn da am besten abgelegt werden?


    Edit2: Ah, ich glaube ich habe das mit dem Interleaving doch verstanden. Naja, bei mir passt ein Level in 228 bytes. das kann ich natürlich schön X\Y indiziert abrufen, dass wäre ja dann nicht mehr möglich, da ich über 256bytes kommen würde.


    Edit3: ok war wohl doch noch falsch. Der Ansatz ist wohl eher das in zwei 114er Tabellen zu aufzuteilen, sagen wir mal A und B und dann immer ABABABABA abzulegen. Dann kann ich da in Zweierschritten durch und muss nur nach der Hälfte wieder auf den anfang+1 setzen?

  • So, nachdem ich mich ein wenig reingefuchst hatte, habe ich die für mich kleine und schnelle Lösung zum setzen eines 2x2 Tiles gefunden. Zuerst hatte ich natürlich den Ansatz mit der X indizierten ZP Adresse, aber da musste ich natürlich jedesmal inx dann nach a kopieren u adc #$40 machen. Außerdem brauchte ich mindestens zwei Tabellen und musste das HI byte vorher ausrechnen.


    Mein Ansatz beruht darauf, dass ich ja den Screen mit vier festen X indizierten Werten erreichen kann. Also, habe ich nur die relative Adresse des Tiles abgespeichert (bei mir 19x11, geht aber auch bis zu 20x11, Hauptsache unter 255!)



    Also m.M.n. ist der Weg schon ziemlich der Beste. Wenig Rechnerei und nur eine Table. Man könnte evtl. noch was sparen, wenn man den Wert am Anfang evtl. in A statt in X ablegt.