Hallo Besucher, der Thread wurde 2k mal aufgerufen und enthält 11 Antworten

letzter Beitrag von BIF am

SPRITES SETZEN mit Strings

  • Hier ein Basic-Code zum schnellen Sprite-Setzen mit Strings.



    Quellcode:
    10 :i=0:k=80:rem---sprite-setzen mit strings
    11 :print"[clr]sprite-setzen:":s=peek(648)*256:
    12 :b=s/64and255:fora=s+1016toa+7:pokea,b:next:fora=s-64tos-1:pokea,255:next
    14:
    15 :dima(99):fori=.to40:rem---string-feld aufbauen
    16 :c$="":forb=.to7:c$=c$+chr$(24+b*24)+chr$(k):next:a$(i)=c$:k=k+1:next
    19 :
    20 :i=.:k=1:rem---bewegen
    21 :poke3,peek(51):poke4,peek(52):poke52,208:
    22 :poke51,len(a$(i)):poke51,len(a$(i)+""):poke53269,255
    24 :fori=itoi+39*kstepk:poke51,len(a$(i)+""):next
    25 :k=-k:ifpeek(198)=.goto24
    26 :poke51,peek(3):poke52,peek(4):geta$:poke53269,.


    Schönen Gruß.

  • Das Funktions-Prinzip des Codes basiert darauf, daß es schneller ist einen String in den VIC zu übertragen, als zu poken.


    Dazu wird zuerst der Stringgrenzenzeiger auf den VIC verstellt und dann die Strings mit den Sprite-Positionen in den VIC kopiert.


    Das ganze funktioniert ähnlich, wie bereits in dem Listing zur Feststringverwaltung gezeigt.


    Schönen Gruß.

  • Hier noch einmal das Listing zur Stringpositionierung mit String-Kopie.
    So ähnlich kann man es natürlich auch in Maschinensprache machen.



    10 : rem---sprites.bewegen
    11 :print"[clr]sprite-schau"
    12 :a=15:forb=peek(648)*256+1016tob+7:pokeb,a:next:k=1:y=80
    13 :forb=a*64tob+63:pokeb,255:next
    19 :
    20 :a=53248:i=.:rem--strings aufbauen und setzen
    21 :c$="":forj=.to7:x=24+j*24:c$=c$+chr$(x)+chr$(y):next:gosub30:poke53269,255
    22 :geta$:ifa$=""then:y=y+k:i=i+1:on-(i<40)goto21:k=-k:goto20
    26 :poke53269,.:list
    29 :
    30 :rem---string-copy(c$,a)
    31 :poke782,peek(35+(c$<"")):poke781,peek(34+(c$<"")):poke780,len(c$)
    32 :poke54,a/256:poke53,a-peek(54)*256:sys46728:return


    Schönen Gruß.

  • Ach, jo. Mal was für zwischendurch:

  • Hallo, anscheinend hab ich in Zeile 12 noch eine -1 vergessen,
    was einen Fehler bei der Sprite-Installation gibt,
    daher hier noch mal die korrigierte Version.


    Quellcode:
    10 :i=0:k=80:rem---sprite-setzen mit strings
    11 :print"[clr]sprite-setzen:":s=peek(648)*256:
    12 :b=s/64-1and255:fora=s+1016toa+7:pokea,b:next:fora=s-64tos-1:pokea,255:next
    14:
    15 :dima(99):fori=.to40:rem---string-feld aufbauen
    16 :c$="":forb=.to7:c$=c$+chr$(24+b*24)+chr$(k):next:a$(i)=c$:k=k+1:next
    19 :
    20 :i=.:k=1:rem---bewegen
    21 :poke3,peek(51):poke4,peek(52):poke52,208:
    22 :poke51,len(a$(i)):poke51,len(a$(i)+""):poke53269,255
    24 :fori=itoi+39*kstepk:poke51,len(a$(i)+""):next
    25 :k=-k:ifpeek(198)=.goto24
    26 :poke51,peek(3):poke52,peek(4):geta$:poke53269,.



    Schönen Gruß.

  • @BIF
    Dein Code im ersten Beitrag verursacht einen Fehler in Zeile 16




    Ach, jo. Mal was für zwischendurch:

    Cooles Sprite :D
    Kann das sein, daß dein MC bissl langsam ist? Ich habe deine Schleife zwischen 16 und 19 mal optimiert, was aber irgendwie nichts brachte. oO

  • Stimmt wohl, da das Feld kein Stringfeld ist.
    Der Fehler ist in Zeile 15. Also dima(99) müßte dima$(99) sein.


    Quellcode:
    10 :i=0:k=80:rem---sprite-setzen mit strings
    11 :print"[clr]sprite-setzen:":s=peek(648)*256:
    12 :b=s/64-1and255:fora=s+1016toa+7:pokea,b:next:fora=s-64tos-1:pokea,255:next
    14:
    15 :dima$(99):fori=.to40:rem---string-feld aufbauen
    16 :c$="":forb=.to7:c$=c$+chr$(24+b*24)+chr$(k):next:a$(i)=c$:k=k+1:next
    19 :
    20 :i=.:k=1:rem---bewegen
    21 :poke3,peek(51):poke4,peek(52):poke52,208:
    22 :poke51,len(a$(i)):poke51,len(a$(i)+""):poke53269,255
    24 :fori=itoi+39*kstepk:poke51,len(a$(i)+""):next
    25 :k=-k:ifpeek(198)=.goto24
    26 :poke51,peek(3):poke52,peek(4):geta$:poke53269,.


    Schönen Gruß.

  • Cooles Sprite
    Kann das sein, daß dein MC bissl langsam ist? Ich habe deine Schleife zwischen 16 und 19 mal optimiert, was aber irgendwie nichts brachte. oO

    Lach. Der ist gut.


    Abgesehen davon, daß die Zeilen 17 bis 19 auf Klarheit und nicht unbedingt auf Geschwindigkeit optimiert sind, macht der Maschinencode nicht viel mehr, als was ein POKE Befehl auch tut: nach CHKCOM werden die Parameter für POKE eingelesen, die "Adresse" in $14/$15 wird als X-Koordinate verwurstet und das Low-Byte direkt nach $D000, $D002 und $D004 geschrieben, wohingegen das High-Byte auf != 0 gecheckt wird und bei !=0 fix auf 7 gesetzt wird und so nach $D010 geht (womit die MSBs der drei Sprites auch gesetzt sind). Der "POKE-Wert" (wird vom Interpreter im X-Register angeliefert und) geht als Y-Koordinate nach $D001, $D003 und $D005.


    Damit werden alle relevanten Koordinatenregister auf einen Schlag gesetzt, damit die 3 Sprites sich nicht gegeneinander bewegen.


    Wenn dir das immer noch zu langsam verkommt, liegt das eben am Rest, sprich, dem BASIC-Programm drumherum. Natürlich ist die pixelweise Bewegung auch nicht besonders schnell. Kannst ja mal mit |DX| und |DY| > 1 experimentieren. Das BASIC-Programm kriegt ja schon die 50 Updates pro Sekunde hin, und damit ist das ganze auch prinzipiell ruckelfrei - fehlt halt nur noch der Sync zum Bildschirmaufbau. :)

  • Hier das Listing für das Spritesetzen mit Strings mit dem USR-SYNC in Zeile 24.



    Quellcode:
    10 :i=0:k=80:rem---sprite-setzen mit strings
    11 :print"[clr]sprite-setzen:":s=peek(648)*256:
    12 :b=s/64-1and255:fora=s+1016toa+7:pokea,b:next:fora=s-64tos-1:pokea,255:next
    13 :poke785,94:poke786,255:rem---usr=sync
    14 :
    15 :dima$(99):fori=.to40:rem---string-feld aufbauen
    16 :c$="":forb=.to7:c$=c$+chr$(24+b*24)+chr$(k):next:a$(i)=c$:k=k+1:next
    19 :
    20 :i=.:k=1:rem---bewegen
    21 :poke3,peek(51):poke4,peek(52):poke52,208:
    22 :poke51,len(a$(i)):poke51,usr(len(a$(i)+"")):poke53269,255
    24 :fori=itoi+39*kstepk:poke51,usr(len(a$(i)+"")):next
    25 :k=-k:ifpeek(198)=.goto24
    26 :poke51,peek(3):poke52,peek(4):geta$:poke53269,.



    Schönen Gruß.