Hi Leute
mal eine frage, ich habe mir von der codebase64 - Seite ein Sprite-scroller genommen um das mal zu verstehen wie das funktioniert.
Nachdem ich einige Anpassungen gemacht habe damit das Ding auch läuft, musste ich feststellen das manche Buchstaben beim scrollen 1 oder 2 höher sind als der restliche Text.
Jetzt habe ich mich auf die Suche macht woran das liegen könnte, habe hier und da ein paar Werte geändert. Aber nichts hat geholfen. Vielleicht weis einer von euch eine Tipp
woran das liegen könnte
Hier mal der Quellcode
Code
- !to "sprite-scroller 01.prg",cbm
- !source "e:\C64er\C64 Emulatoren\C64StudioRelease\Library-Label\Vic-Label.asm"
- ; ----------------------------------------------------------------------------------------------------
- ;
- ; Sprite-Scroller Routine
- ; ----------------------------
- ;
- ; coding: testicle/payday
- ; logo: fabu/payday
- ;
- ;
- ; contact and payday-releases:
- ; ------------------------------------
- ;
- ; daniel@popelganda.de
- ; www.popelganda.de
- ;
- ; dieser Quellcode ist Teil eines Intros, daher fehlt hier viel Code,
- ; während nur die interessanten Teile für den Sprite-Scroller gezeigt werden.
- ; Es wird gezeigt, wie man Sprites für das Scrollen von Text verwendet,
- ; so dass der Scrolltext einfach über Bildern platziert werden kann.
- ; dieser Quellcode ist am besten mit der Schriftart "tahoma", Schriftgröße 9 zu sehen.
- ;
- ; Sie können diesen Code mit dem ACME-Crossassembler kompilieren.
- ; Der Code wurde mit Relaunch64 geschrieben, dem c64-crossassembler-tool
- ; für Windows-PC. Sie finden ihn unter www.popelganda.de!
- ;
- ;
- ;
- ;
- ; ----------------------------------------------------------------------------------------------------
- *=$c000
- ;--------------------------------------------------
- ;----- Paragraph @Globale Variablen@ -----
- ;--------------------------------------------------
- spritexpos = 128
- spriteypos = 140 ;sprite y-position
- clrscr = $E544 ;Bildschirm löschen
- zeichensatz = $3000
- spritechar = $3300 ;hier befindet sich der Char, für das "rollen" des Spritescroller
- text = $3a00
- ;--------------------------------------------------
- ;----- Paragraph @Includes@ -----
- ;--------------------------------------------------
- ; init text pointer
- lda #<text
- sta $50
- lda #>text
- sta $51
- ;--------------------------------------------------
- ;----- Paragraph @clear sprite-memory@ -----
- ;--------------------------------------------------
- ldx #0
- lda #$00
- .loop4
- sta zeichensatz+$800,x
- inx
- bne .loop4
- ldx #0
- lda #$00
- .loop6
- sta zeichensatz+$900,x
- inx
- cpx #64
- bne .loop6
- ldx #7
- lda #0
- .loop5
- sta spritechar,x
- dex
- bpl .loop5
- jsr sprscrollinit ;Sprung zum Unterprogramm zur Initialisierung der Sprite-Positionen
- sei
- jsr charrom
- jsr clrscr
- lda #<spritescroll
- sta $0314
- lda #>spritescroll
- sta $0315
- cli ; denn das ist das Ende des Setups, das hier noch fehlt
- ;(siehe Kommentar oben für weitere Informationen)
- lda #$00
- sta rahmen
- jmp * ;Endlosschleife
- ;--------------------------------------------------
- ;
- ;----- Paragraph @init sprites above@ -----
- ;
- ;--------------------------------------------------
- !zone Zone1
- sprscrollinit
- lda #spritexpos
- sta sprite0X
- lda #spritexpos+24
- sta sprite1X
- lda #spritexpos+48
- sta sprite2X
- lda #spritexpos+72
- sta sprite3X
- lda #spritexpos+96
- sta sprite4X
- lda #spriteypos
- sta sprite0Y
- sta sprite1Y
- sta sprite2Y
- sta sprite3Y
- sta sprite4Y
- lda #%00011111 ;5 Sprites einschalten
- sta spritean
- lda #0
- sta spriteprio
- sta spritemulti
- lda #7 ;Spritefarbe
- sta sprite0col
- sta sprite1col
- sta sprite2col
- sta sprite3col
- sta sprite4col
- ;--------------------------------------------------
- ; sprites bei $3800
- ;--------------------------------------------------
- lda #224
- sta $07f8
- lda #225
- sta $07f9
- lda #226
- sta $07fa
- lda #227
- sta $07fb
- lda #228
- sta $07fc
- rts
- ;--------------------------------------------------
- ;
- ;----- Char Rom umkopieren -----
- ;
- ;--------------------------------------------------
- charrom
- lda #$31
- sta $1
- ldx #0
- copyromchar
- lda $d000,x
- sta zeichensatz,x
- lda $d100,x
- sta zeichensatz+$100,x
- lda $d200,x
- sta zeichensatz+$200,x
- lda $d300,x
- sta zeichensatz+$300,x
- lda $d400,x
- sta zeichensatz+$400,x
- lda $d500,x
- sta zeichensatz+$500,x
- lda $d600,x
- sta zeichensatz+$600,x
- lda $d700,x
- sta zeichensatz+$700,x
- inx
- bne copyromchar
- lda #$37
- sta $1
- rts
- ;--------------------------------------------------
- ;
- ;----- Paragraph @Sub-Route: Spritescrolling@ -----
- ;
- ;--------------------------------------------------
- ;dies ist die Hauptroutine, die für das Scrollen verantwortlich ist
- ;für den Text im Sprites
- !zone Zone2
- spritescroll
- dec .cnt+1
- .cnt lda #8 ;bereits 8 Pixel verschoben?
- beq .neuchar ;wenn ja, neues Zeichen einlesen
- jmp .softscroll ;sonst Sprung zum .softscroll und Rückkehr in die Hauptroutine
- .neuchar
- ldy #0 ;neues Zeichen einlesen
- lda ($50),y ;dies ist der text-pointer
- bne .undlos ;Endzeichen?
- ;--------------------------------------------------
- lda #0 ;wenn ja, Text-Vektor zurücksetzen
- sta $50
- lda #>text
- sta $51
- lda #$20
- .undlos
- clc ;lösche carry-bit
- rol ;Zeichenwert * 8
- rol ;(dies ist der Offset für die Pixeldaten eines Zeichens im Zeichensatz)
- rol
- sta .loop2+1
- bcc .weiter
- inc .loop2+2
- .weiter
- ldx #7 ;lese 8 bytes (ein Zeichen aus dem Zeichensatz)
- .loop2
- lda zeichensatz,x ;von charset-memory
- sta spritechar,x ;und speichern an der Speicheradresse, an der sich das Zeichen befindet,
- dex ;das nächste Byte holen für den spritscroller
- bpl .loop2
- lda #0 ;Adressen zurücksetzen
- sta .loop2+1
- lda #$30
- sta .loop2+2
- inc $50 ;Scrolltext-Zähler erhöhen
- lda $50
- bne .nixneu
- inc $51
- .nixneu
- lda #8 ;scrolltext-zähler zurücksetzen
- sta .cnt+1
- .softscroll
- ldy #0
- ldx #0
- ;--------------------------------------------------
- ; Zeichen in Sprites verschieben
- ; nach links (Soft-Scrolling)
- ;--------------------------------------------------
- .loop1
- clc
- .origin
- rol spritechar ;"lese" linkes bit für ein neues Zeichen
- rol $3902,x ;Sprite-Zeichen verschieben - sprite5
- rol $3901,x
- rol $3900,x
- rol $38c2,x ;Sprite-Zeichen verschieben - sprite4
- rol $38c1,x
- rol $38c0,x
- rol $3882,x ;Sprite-Zeichen verschieben - sprite3
- rol $3881,x
- rol $3880,x
- rol $3842,x ;Sprite-Zeichen verschieben - sprite2
- rol $3841,x
- rol $3840,x
- rol $3802,x ;Sprite-Zeichen verschieben - sprite1
- rol $3801,x
- rol $3800,x
- iny
- inc .origin+1 ;Zähler erhöhen und auf die nächste "Pixel-Zeile" dieses Zeichens setzen
- txa
- clc:adc #3
- tax
- cpy #8
- bne .loop1
- lda #<spritechar ;Originalwert wiederherstellen
- sta .origin+1
- jmp $ea31
- ;--------------------------------------------------
- ;
- ;----- Paragraph @Scrolltext@ -----
- ;
- ;--------------------------------------------------
- *= text
- !ct scr
- !tx " Das besondere Zebra Susi An einem ganz besonders heissen Nachmittag verweilten Loewe Ludwig,"
- !tx " Gunnar das Erdmaennchen und Susi das Zebra auf einem Huegel unter einem schattigen Baum. "
- !tx " Von hier aus hatten sie einen tollen Ausblick auf die afrikanische Savanne."
- !tx "................ "
- !byte 0
und hier das fertig Progamm
Hoffe einer von euch kann mir einen Rat geben
Gruß Drachen