SPRITES SETZEN mit Strings

  • 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ß.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von BIF ()

  • 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:

    Quellcode

    1. 10 V=53248:POKEV+32,3:POKEV+33,3:PRINT"{CLR}";
    2. 11 FORS=0TO2:AD=832+64*S:FORT=0TO15:READA,B:POKEAD+3*T,A:POKEAD+3*T+1,B
    3. 12 POKEAD+3*T+2,0:NEXT:FORU=48TO62:POKEAD+U,0:NEXT:POKE2040+S,13+S:NEXT
    4. 13 FORT=679TO714:READA:POKET,A:NEXT
    5. 14 POKEV+21,7:POKEV+23,0:POKEV+28,0:POKEV+29,0:POKEV+39,0:POKEV+40,1:POKEV+41,2
    6. 15 X=24:Y=50:DX=1:DY=1
    7. 16 SYS679,X,Y
    8. 17 X=X+DX:IFX=24ORX=328THENDX=-DX
    9. 18 Y=Y+DY:IFY=50ORY=234THENDY=-DY
    10. 19 GOTO16
    11. 20 :
    12. 21 DATA 7,224,24,24,32,4,64,2,64,2,128,1,128,1,128,1,128,1,128,1,143,241,114,78
    13. 22 DATA 34,68,32,4,16,8,15,240,0,0,0,96,24,120,48,60,39,156,15,192,15,204,79
    14. 23 DATA 222,103,158,96,12,64,0,13,176,29,184,31,248,15,240,0,0,0,0,7,128,7,128
    15. 24 DATA 15,192,24,96,112,62,112,50,48,32,24,96,31,242,48,14,0,0,0,0,0,0,0,0,0,0
    16. 25 DATA 32,253,174,32,235,183,142,1,208,142,3,208,142,5,208,165,20,141,0,208
    17. 26 DATA 141,2,208,141,4,208,165,21,240,2,169,7,141,16,208,96
    Alles anzeigen
    Dateien
    • 1up.prg

      (786 Byte, 14 mal heruntergeladen, zuletzt: )
  • 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




    Mike schrieb:

    Ach, jo. Mal was für zwischendurch:

    Quellcode

    1. 10 V=53248:POKEV+32,3:POKEV+33,3:PRINT"{CLR}";
    2. 11 FORS=0TO2:AD=832+64*S:FORT=0TO15:READA,B:POKEAD+3*T,A:POKEAD+3*T+1,B
    3. 12 POKEAD+3*T+2,0:NEXT:FORU=48TO62:POKEAD+U,0:NEXT:POKE2040+S,13+S:NEXT
    4. 13 FORT=679TO714:READA:POKET,A:NEXT
    5. 14 POKEV+21,7:POKEV+23,0:POKEV+28,0:POKEV+29,0:POKEV+39,0:POKEV+40,1:POKEV+41,2
    6. 15 X=24:Y=50:DX=1:DY=1
    7. 16 SYS679,X,Y
    8. 17 X=X+DX:IFX=24ORX=328THENDX=-DX
    9. 18 Y=Y+DY:IFY=50ORY=234THENDY=-DY
    10. 19 GOTO16
    11. 20 :
    12. 21 DATA 7,224,24,24,32,4,64,2,64,2,128,1,128,1,128,1,128,1,128,1,143,241,114,78
    13. 22 DATA 34,68,32,4,16,8,15,240,0,0,0,96,24,120,48,60,39,156,15,192,15,204,79
    14. 23 DATA 222,103,158,96,12,64,0,13,176,29,184,31,248,15,240,0,0,0,0,7,128,7,128
    15. 24 DATA 15,192,24,96,112,62,112,50,48,32,24,96,31,242,48,14,0,0,0,0,0,0,0,0,0,0
    16. 25 DATA 32,253,174,32,235,183,142,1,208,142,3,208,142,5,208,165,20,141,0,208
    17. 26 DATA 141,2,208,141,4,208,165,21,240,2,169,7,141,16,208,96
    Alles anzeigen
    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ß.
  • RKSoft schrieb:

    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. :)
  • Der SYNC, also die Abstimmung mit dem Rasterstrahl fehlt bei meinem Listing auch noch.

    :sys65374: macht das in Basic.

    Eleganter ist es allerdings den SYNC mit usr() in die Berechnung einzubinden
    :poke785,94:poke786,255: setzt den USR-Vektor auf SYNC.

    Schönen Gruß.
  • 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ß.