witam,
http://atariarea.krap.pl/forum/viewtopic.php?id=5853
http://atari.online.pl/v01/index.phtml? … ct=nowinki
http://atari.pl/nr.rar - filmik
na filmiku widac, ze sprity smieca po ekranie... chcialbym prosic o pomoc w napisaniu dobrego i szybkiego silnika spritow dla tej gry.
obecnie wyglada on tak:
; sprite engine
_x       equ $b0
_y       equ $b1
_hv      equ $b2
_ekran   equ $b3
_sprite1 equ $b5
_sprite2 equ $b6
_temp_x  equ $b7
_sprite_engine
                ldx #$0f  - 16 spritow
_next_spr  stx _temp_x
                lda $400,x - od $400 do $42f znajduja sie rejestry hardwarowe. $400-$40f to pozycja x spritow ponizej sposob liczenia
                sta _x
                lda $410,x - pozycja y
                sta _y
                lda $420,x - szerokosc i wysokosc sprita. starszy nibbel=0 oznacza sprita wylaczonego
                sta _hv
                jsr _se0
                ldx _temp_x
                dex
                bpl _next_spr
                rts
                
_se0
                lda _hv
                and #%11110000
                bne _se1
                rts
_se1      
                lda #$00
                sta _sprite2
                lda _x
                and #%111
                tay
                
                lda _hv
                lsr @
                lsr @
                lsr @
                lsr @
                tax
                lda _tab_h,x
                cpy #0
                beq _se5
_se2         lsr @
                ror _sprite2
                dey
                bne _se2
_se5         sta _sprite1
                
                lda _y
                lsr @
                lsr @
                lsr @
                tax
                lda _tab_y,x
                sta _ekran+1
                lda _y
                and #%111
                tax
                lda _tab_y_fine,x
                sta _ekran
                lda _x
                lsr @
                lsr @
                lsr @
                clc
                adc _ekran
                sta _ekran
                
                lda _hv
                and #%1111
                eor #%1111
                tax
_se4         ldy #0
                ;lda (_ekran),y
                ;ora _sprite1
              lda _sprite1
                sta (_ekran),y
                iny
                ;lda (_ekran),y
                ;ora _sprite2
              lda _sprite2
                sta (_ekran),y
                lda _ekran
                clc
                adc #$20
                sta _ekran
                bcc _se3
                inc _ekran+1
_se3         dex
                bpl _se4
                rts
; szerokosc sprita
_tab_h  dta %00000000,%10000000,%11000000,%11100000
        dta %11110000,%11111000,%11111100,%11111110,%11111111 - hardware obsluguje szersze ale w tej grze nie ma spritow szerszych od 8
        
; numer lini przelozyc na starszy adres 0,1,2,3..7 zawsze puste
_tab_y  dta $40,$40,$40,$40,$40,$40,$40,$40
        dta $40,$41,$42,$43,$44,$45,$46,$47
        dta $48,$49,$4a,$4b,$4c,$4d,$4e,$4f
        dta $50,$51,$52,$53,$54,$55,$56,$57
        
; mlodszy bajt pozycji pionowej
_tab_y_fine     dta $00,$20,$40,$60,$80,$a0,$c0,$e0nie bylo by problemu gdyby mozna bylo szybko na vbi wymazac pamiec ekranu, ale nie mozna...
na powyzsza procedurke jesli jest taka potrzeba mozna przeznaczyc pamiec: $b0-$1af
procedura bedzie wykonywana na vbi ale byc moze lepiej bedzie sie wpiac w kod gry:
            ldy #$0f
            ldx #$1f
_1        lda $08,x
            sta $420,y
            lda $28,x
            eor #$ff
            sta $400,y
            lda $48,x
            sta $410,y
            dex
            dex
            dey
            bpl _1






