Sprite Tool (Grafikanimation des Sprites)

geschrieben am 27.07.2017 0:40:48
zuletzt bearbeitet von WYE am 27.07.2017 21:38:43.
( Link )
Ich wollte ein Sprite programmieren, aber die Animation des Sprites funktioniert nicht so richtig. Ich könnte auch mit PIXI ein Sprite programmieren, wenn eine Anleitung kommen würde. Könntet ihr mir bitte helfen?

Hier ist der Code:

edit: code-Tag
Code
dcb "INIT"
RTL

dcb "MAIN"
JSR Graphics
RTL

TILEMAP: dcb $A2,$A4

Graphics:
JSR GET_DRAW_INFO
LDA $00
STA $0300,y
LDA $01
STA $0301,y
PHX
LDA $13
LSR
LSR
LSR
AND #$01
TAX
LDA TILEMAP,x
STA $0302,y
PLX
LDA #%00111011
ORA $64
STA $0303,y

INY
INY
INY
INY

LDY #$02
LDA #$00
JSL $01B7B3

RTS



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GET_DRAW_INFO
; This is a helper for the graphics routine. It sets off screen flags, and sets up
; variables. It will return with the following:
;
; Y = index to sprite OAM ($300)
; $00 = sprite x position relative to screen boarder
; $01 = sprite y position relative to screen boarder
;
; It is adapted from the subroutine at $03B760
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPR_T1 dcb $0C,$1C
SPR_T2 dcb $01,$02

GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
STZ $15A0,x ; reset sprite offscreen flag, horizontal
LDA $E4,x ; \
CMP $1A ; | set horizontal offscreen if necessary
LDA $14E0,x ; |
SBC $1B ; |
BEQ ON_SCREEN_X ; |
INC $15A0,x ; /

ON_SCREEN_X LDA $14E0,x ; \
XBA ; |
LDA $E4,x ; |
REP #$20 ; |
SEC ; |
SBC $1A ; | mark sprite invalid if far enough off screen
CLC ; |
ADC.W #$0040 ; |
CMP.W #$0180 ; |
SEP #$20 ; |
ROL A ; |
AND #$01 ; |
STA $15C4,x ; /
BNE INVALID ;

LDY #$00 ; \ set up loop:
LDA $1662,x ; |
AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
BEQ ON_SCREEN_LOOP ; | else, go through loop once
INY ; /
ON_SCREEN_LOOP LDA $D8,x ; \
CLC ; | set vertical offscreen if necessary
ADC SPR_T1,y ; |
PHP ; |
CMP $1C ; | (vert screen boundry)
ROL $00 ; |
PLP ; |
LDA $14D4,x ; |
ADC #$00 ; |
LSR $00 ; |
SBC $1D ; |
BEQ ON_SCREEN_Y ; |
LDA $186C,x ; | (vert offscreen)
ORA SPR_T2,y ; |
STA $186C,x ; |
ON_SCREEN_Y DEY ; |
BPL ON_SCREEN_LOOP ; /

LDY $15EA,x ; get offset to sprite OAM
LDA $E4,x ; \
SEC ; |
SBC $1A ; | $00 = sprite x position relative to screen boarder
STA $00 ; /
LDA $D8,x ; \
SEC ; |
SBC $1C ; | $01 = sprite y position relative to screen boarder
STA $01 ; /
RTS ; return

INVALID PLA ; \ return from *main gfx routine* subroutine...
PLA ; | ...(not just this subroutine)
RTS ; /


Und hier ist die CFG-Datei:

01
36
00 00 0B 80 00 00
00 00
DK_spring_fix.asm
0
geschrieben am 27.07.2017 21:40:12
( Link )
Kann sein, dass ich falsch liege, aber hast du genau die Frage nicht schon mal auf SMWC gestellt? Sag bescheid, ob das hier dein Problem löst oder nicht.

Zitat von WhiteYoshiEgg:
Das könnte daran liegen, dass dein Code das Data Bank Register nicht setzt.

Wenn du 16-bit-Adressen ansprichst (also vierstellige Adressen), dann hängt es vom Data Bank Register (DBR) ab, aus welcher Bank diese Adresse genommen wird. Beispiel: wenn das DBR $00 ist, spricht der Befehl LDA $1234 eigentlich die Adresse $001234 an, wenn es $2F ist, die Adresse $2F1234, und so weiter.

Das macht in deinem Fall wahrscheinlich bei dem LDA TILEMAP,x was aus. Die Teiledaten stehen in derselben Bank wie der Code, aber das DBR ist nicht entsprechend angepasst - so werden die Daten aus einer anderen Bank, also einer ganz anderen Stelle gelesen.

Beheben kannst du das aus zwei Weisen: entweder du gibst dem LDA die ganze sechsstellige Adresse mit (das kannst du mit LDA.l TILEMAP,x erzwingen), oder du änderst vorübergehend das DBR, damit es auf dieselbe Bank zeigt, in der auch der Code ist (das machst du am besten mit den Befehlen PHK : PHB : PLB am Anfang der Main-Routine und PLB ganz am Ende).

Nebenbei bemerkt: dein ASM scheint für den Assembler TRASM gedacht zu sein, aber besser (weil weniger altbacken und fehleranfällig) wäre so was wie Asar. Kannst du dir ja für die Zukunft mal angucken.