Amstrad Plus Forum Index

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Défilement parallaxe

 
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> Affichage video
Previous topic :: Next topic  
Author Message
gurneyh


Offline

Joined: 18 Dec 2018
Posts: 13
Masculin
Point(s): 13
Moyenne de points: 1.00

PostPosted: Sat 23 Feb - 15:40 (2019)    Post subject: Défilement parallaxe Reply with quote

Salut à tous,

Je passe un peu de temps en ce moment pour voir s'il est possible d'imiter le scrolling de ce jeu
https://youtu.be/pAjvlSCf7CE.

La première chose que j'avais essayé, c'était d'imiter le scrolling à plusieurs vitesses du fond(sans la map !)

Il semble que certain sont intéressés, par le code, alors, j'ai enlevé ce qui n'était pas nécessaire(rasters sous interrupt, page flipping).




Code:

R1              EQU 32

CLOUD_SPEED:    EQU 0 * 256 + #80               
TREE_SPEED:     EQU 1 * 256 + #00

                org #8000

;;
;; HL = HL + A
;;
macro           ADD_____HL_A                    ;; 5c

                add             a, l
                ld              l, a
                jr              nc, $ + 3
                inc             h
endm


                call init
loop:
                ld b, #f5
                in a, (c)
                rra
                jr nc, loop


cloudScroll:    ld bc, 0
               
                ld a, (cloudScroll + 2)
                ld hl, #c000 + (R1 * 2 * 6)
                ld de, cloud_top
                call display

                ld a, (cloudScroll + 2)
                ld hl, #c000 + (R1 * 2 * 7)
                ld de, cloud_bottom
                call display
               
treeScroll:     ld bc, 0

                ld a, (treeScroll + 2)
                ld hl, #c000 + (R1 * 2 * 9)
                ld de, tree_top
                call display
               
                ld a, (treeScroll + 2)
                ld hl, #c000 + (R1 * 2 * 10)
                ld de, tree_bottom
                call display
               
                ld hl, (cloudScroll + 1)
                ld bc, CLOUD_SPEED
                add hl, bc
                ld (cloudScroll + 1), hl

                ld hl, (treeScroll + 1)
                ld bc, TREE_SPEED
                add hl, bc
                ld (treeScroll + 1), hl

                jp loop

display:
                di                              ; On va utiliser la pile
                ld (displayDone + 1), sp        ; On la sauvegarde
                                               
                                                ; (auto modification )hl => sp
                ld (addr + 1), hl             
                ex de, hl                       ; hl pointeur bandeau
                                                ; a position x du bandeau
                and 15                          ; mod 16 (on reste sur la première moitié du tile)
                srl a                           ; a = a / 2
                jr nc, no_shift                 ; si a impair
                inc h                           ; On utilise la version shiftée
no_shift
                ADD_____HL_A
                ld a, 8                         ; 8 ligne à afficher
displayLoop:    ld i, a                         ; on sauvegarde le contenu de A
REPEAT 2
                ld e, (hl)                      ; mot dans de, puis de'
                inc l
                ld d, (hl)
                inc l
                ld c, (hl)                      ; mot dans bc, puis bc'
                inc l
                ld b, (hl)
                inc l
                ld a, l                         ; On va utiliser les registres secondaires
                exx                             ; transfert de hl vers hl'
                ld l, a
                exx
                ld a, h
                exx
                ld h, a
REND
                jp aff

displayRowDone:
                exx
                ld hl, (addr + 1)               ; Passage ligne écran suivante
                ld a, h
                add a, 8                        ; hl = hl + #800
                ld h, a
                ld (addr + 1), hl
                exx
                ld a, 8                         ; Ligne suivante du tile
                ADD_____HL_A
               
                ld a, i
                dec a
                jr nz, displayLoop
displayDone:    ld sp, 0
                ei
                ret

aff:
addr:           ld sp, 0                        ; Adresse écran (fin de ligne)
               
REPEAT 16                                     
                exx
                push bc
                push de
REND
                exx
                jp displayRowDone
         
init:           
                di
                ld hl, #c9fb
                ld (#38), hl
                ei

                call clearScreen
               
               
                ld bc, #bc01                    ; R1 - Horizontal displayed
                out (c), c
                ld bc, #bd00 + R1
                out (c), c

                ld bc, #bc02                    ; R2 - Horizontal sync position
                out (c), c
                ld bc, #bd00 + 42
                out (c), c

                ld bc, #bc06                    ; R6 - Vertical displayed
                out (c), c
                ld bc, #bd00 + 24
                out (c), c


                ld e, 16                        ; Set Palette
                ld bc, #7f00
                ld hl, palette

init1:          out (c), c                      ; Set palette
                ld a, (hl)
                out (c), a
                inc c
                inc hl
                dec e
                jr nz, init1
                                                ; Set Border color
                ld c, #10
                out (c), c
                ld hl, palette
                ld a, #54
                out (c), a
               
                ld bc, #7F00                   
                ld a, #8c
                out (c), a
               
                ret

clearScreen:
                di
                ld (clearScreen2 + 1), sp
                ld sp, #ffff
                ld hl, 0
                ld a, 32
clearScreen1:
                REPEAT 256
                push hl
                REND
                dec a
                jp nz, clearScreen1
clearScreen2:
                ld sp, 0
                ei
                ret

palette:
                db #53, #54, #4b, #56
                db #4e, #54, #54, #54
                db #54, #54, #54, #54
                db #54, #54, #54, #54


include 'assets/bg_tiles.asm'





Code:

align 256

tree_top
defb #00,#40,#C0,#80,#00,#00,#00,#00,#00,#40,#C0,#80,#00,#00,#00,#00; line 0
defb #00,#C4,#CC,#C8,#00,#00,#00,#00,#00,#C4,#CC,#C8,#00,#00,#00,#00; line 1
defb #00,#C4,#30,#C8,#00,#00,#00,#00,#00,#C4,#30,#C8,#00,#00,#00,#00; line 2
defb #40,#98,#CC,#CC,#80,#00,#C0,#80,#40,#98,#CC,#CC,#80,#00,#C0,#80; line 3
defb #40,#98,#CC,#CC,#80,#40,#CC,#C8,#40,#98,#CC,#CC,#80,#40,#CC,#C8; line 4
defb #40,#98,#CC,#C8,#C0,#40,#64,#C8,#40,#98,#CC,#C8,#C0,#40,#64,#C8; line 5
defb #C4,#CC,#CC,#C4,#CC,#C4,#64,#CC,#C4,#CC,#CC,#C4,#CC,#C4,#64,#CC; line 6
defb #C0,#CC,#CC,#C4,#98,#C8,#CC,#CC,#C0,#CC,#CC,#C4,#98,#C8,#CC,#CC; line 7


tree_bottom
defb #C4,#CC,#CC,#CC,#64,#C8,#CC,#CC,#C4,#CC,#CC,#CC,#64,#C8,#CC,#CC; line 0
defb #C0,#CC,#CC,#C4,#64,#CC,#CC,#CC,#C0,#CC,#CC,#C4,#64,#CC,#CC,#CC; line 1
defb #CC,#C4,#CC,#C4,#64,#C8,#CC,#C8,#CC,#C4,#CC,#C4,#64,#C8,#CC,#C8; line 2
defb #CC,#C8,#CC,#CC,#CC,#CC,#C4,#C4,#CC,#C8,#CC,#CC,#CC,#CC,#C4,#C4; line 3
defb #CC,#C8,#CC,#CC,#CC,#CC,#C4,#C4,#CC,#C8,#CC,#CC,#CC,#CC,#C4,#C4; line 4
defb #CC,#C8,#CC,#CC,#CC,#CC,#CC,#C4,#CC,#C8,#CC,#CC,#CC,#CC,#CC,#C4; line 5
defb #CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC; line 6
defb #CC,#C8,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#C8,#CC,#CC,#CC,#CC,#CC,#CC; line 7


tree_top_shifted
defb #00,#C0,#C0,#00,#00,#00,#00,#00,#00,#C0,#C0,#00,#00,#00,#00,#00; line 0
defb #40,#CC,#CC,#80,#00,#00,#00,#00,#40,#CC,#CC,#80,#00,#00,#00,#00; line 1
defb #40,#98,#64,#80,#00,#00,#00,#00,#40,#98,#64,#80,#00,#00,#00,#00; line 2
defb #C4,#64,#CC,#C8,#00,#40,#C0,#00,#C4,#64,#CC,#C8,#00,#40,#C0,#00; line 3
defb #C4,#64,#CC,#C8,#00,#C4,#CC,#80,#C4,#64,#CC,#C8,#00,#C4,#CC,#80; line 4
defb #C4,#64,#CC,#C0,#80,#90,#CC,#80,#C4,#64,#CC,#C0,#80,#90,#CC,#80; line 5
defb #CC,#CC,#C8,#CC,#C8,#98,#CC,#C8,#CC,#CC,#C8,#CC,#C8,#98,#CC,#C8; line 6
defb #C4,#CC,#C8,#CC,#64,#C4,#CC,#C8,#C4,#CC,#C8,#CC,#64,#C4,#CC,#C8; line 7


tree_bottom_shifted
defb #CC,#CC,#CC,#98,#CC,#C4,#CC,#C8,#CC,#CC,#CC,#98,#CC,#C4,#CC,#C8; line 0
defb #C4,#CC,#C8,#98,#CC,#CC,#CC,#C8,#C4,#CC,#C8,#98,#CC,#CC,#CC,#C8; line 1
defb #C8,#CC,#C8,#98,#CC,#C4,#CC,#C4,#C8,#CC,#C8,#98,#CC,#C4,#CC,#C4; line 2
defb #CC,#C4,#CC,#CC,#CC,#C8,#C8,#CC,#CC,#C4,#CC,#CC,#CC,#C8,#C8,#CC; line 3
defb #CC,#C4,#CC,#CC,#CC,#C8,#C8,#CC,#CC,#C4,#CC,#CC,#CC,#C8,#C8,#CC; line 4
defb #CC,#C4,#CC,#CC,#CC,#CC,#C8,#CC,#CC,#C4,#CC,#CC,#CC,#CC,#C8,#CC; line 5
defb #CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#CC; line 6
defb #CC,#C4,#CC,#CC,#CC,#CC,#CC,#CC,#CC,#C4,#CC,#CC,#CC,#CC,#CC,#CC; line 7


cloud_top
defb #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00; line 0
defb #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00; line 1
defb #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00; line 2
defb #00,#04,#0C,#00,#00,#00,#00,#00,#00,#04,#0C,#00,#00,#00,#00,#00; line 3
defb #00,#0C,#0C,#08,#00,#00,#00,#00,#00,#0C,#0C,#08,#00,#00,#00,#00; line 4
defb #00,#0C,#0C,#08,#00,#0C,#08,#00,#00,#0C,#0C,#08,#00,#0C,#08,#00; line 5
defb #00,#0C,#0C,#0C,#04,#0C,#0C,#00,#00,#0C,#0C,#0C,#04,#0C,#0C,#00; line 6
defb #04,#0C,#0C,#0C,#04,#0C,#0C,#00,#04,#0C,#0C,#0C,#04,#0C,#0C,#00; line 7


cloud_bottom
defb #04,#0C,#0C,#0C,#04,#0C,#0C,#00,#04,#0C,#0C,#0C,#04,#0C,#0C,#00; line 0
defb #04,#0C,#0C,#08,#00,#0C,#0C,#00,#04,#0C,#0C,#08,#00,#0C,#0C,#00; line 1
defb #08,#0C,#0C,#08,#0C,#04,#08,#0C,#08,#0C,#0C,#08,#0C,#04,#08,#0C; line 2
defb #0C,#04,#0C,#0C,#0C,#04,#04,#0C,#0C,#04,#0C,#0C,#0C,#04,#04,#0C; line 3
defb #0C,#04,#0C,#0C,#0C,#0C,#04,#0C,#0C,#04,#0C,#0C,#0C,#0C,#04,#0C; line 4
defb #0C,#0C,#0C,#0C,#0C,#08,#0C,#0C,#0C,#0C,#0C,#0C,#0C,#08,#0C,#0C; line 5
defb #0C,#0C,#0C,#0C,#0C,#08,#0C,#0C,#0C,#0C,#0C,#0C,#0C,#08,#0C,#0C; line 6
defb #0C,#0C,#0C,#0C,#0C,#08,#0C,#0C,#0C,#0C,#0C,#0C,#0C,#08,#0C,#0C; line 7


cloud_top_shifted
defb #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00; line 0
defb #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00; line 1
defb #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00; line 2
defb #00,#0C,#08,#00,#00,#00,#00,#00,#00,#0C,#08,#00,#00,#00,#00,#00; line 3
defb #04,#0C,#0C,#00,#00,#00,#00,#00,#04,#0C,#0C,#00,#00,#00,#00,#00; line 4
defb #04,#0C,#0C,#00,#04,#0C,#00,#00,#04,#0C,#0C,#00,#04,#0C,#00,#00; line 5
defb #04,#0C,#0C,#08,#0C,#0C,#08,#00,#04,#0C,#0C,#08,#0C,#0C,#08,#00; line 6
defb #0C,#0C,#0C,#08,#0C,#0C,#08,#00,#0C,#0C,#0C,#08,#0C,#0C,#08,#00; line 7


cloud_bottom_shifted
defb #0C,#0C,#0C,#08,#0C,#0C,#08,#00,#0C,#0C,#0C,#08,#0C,#0C,#08,#00; line 0
defb #0C,#0C,#0C,#00,#04,#0C,#08,#00,#0C,#0C,#0C,#00,#04,#0C,#08,#00; line 1
defb #04,#0C,#0C,#04,#08,#0C,#04,#0C,#04,#0C,#0C,#04,#08,#0C,#04,#0C; line 2
defb #08,#0C,#0C,#0C,#08,#08,#0C,#0C,#08,#0C,#0C,#0C,#08,#08,#0C,#0C; line 3
defb #08,#0C,#0C,#0C,#0C,#08,#0C,#0C,#08,#0C,#0C,#0C,#0C,#08,#0C,#0C; line 4
defb #0C,#0C,#0C,#0C,#0C,#04,#0C,#0C,#0C,#0C,#0C,#0C,#0C,#04,#0C,#0C; line 5
defb #0C,#0C,#0C,#0C,#0C,#04,#0C,#0C,#0C,#0C,#0C,#0C,#0C,#04,#0C,#0C; line 6
defb #0C,#0C,#0C,#0C,#0C,#04,#0C,#0C,#0C,#0C,#0C,#0C,#0C,#04,#0C,#0C; line 7



Grossièrement, le principe c'est d'utiliser 2 versions pour chaque tile une normale, et une shiftée.
En fonction de la position x de départ, on choisi la version à afficher(c'est simplifié par la manière dont les tiles sont alignés).

Pour l'affichage, l'idée était de remplir 4 registres 16 bits avec les octets de la ligne à afficher.
Ensuite on fait pointer la pile sur la fin de ligne, et on dépile autant de fois que nécessaire.
Dans un premier je générai du code pour éviter la partie initialisation de tout les registres, mais c'est forcément très gourmand en mémoire, il me semble que cette version est un bon compromis.

Tronic, avait émis l'idée qu'utiliser une technique à base de "delta"(ne modifier que les pixels qui ont changés), pouvait être une bonne idée, mais je n'ai pas eu le temps de tester encore.

En espérant que ça puisse servir Smile


Back to top
Publicité






PostPosted: Sat 23 Feb - 15:40 (2019)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Sun 24 Feb - 12:56 (2019)    Post subject: Défilement parallaxe Reply with quote

Quelques conseils que je peux te donner, pour commencer :


A la place de calculer chaque ligne :


1.créer une table d'adresse (#C000,#C800,#D000... etc)
2. un simple pop hl devrait t'aider à récupérer l'adresse écran
3. Eviter d'utiliser l'adressage de type ld hl,(monadresse) ou ld a,(monadresse) et privilégier surtout des instructions d'auto-modification c'est-à-dire :


Code:
monadresse ld HL,#c000
                  ld a,h
                  add a,8
                  ld h,a
                  ld (monadresse+1),hl







ou


Code:
modeadresse ld a,20
                    inc a
                    ld (monadresse+1),a






voire encore mieux…


Code:
monadresse ld hl,#c000
                  set 3,h ; h=#c8
                  ld (monadresse),hl







voire ce que j'ai écrit au début


Code:
;
; la table pointée par hl doit toujours se trouver sur une adresse écran multiple de 256 (#100,#200, #300,.. etc)
; A=numéro de ligne
;
add a,a ; on multiplie a par 2 parce que l'adresse est gérée sur 16 bits
ld h,screenadr/256
ld l,a ; l pointe sur la bonne adresse
ld sp,hl
pop hl ; hl=adresse écran
….









avec bien sur une table d'adresse déifnie à une adresse multiple de 256


Code:
org #1000 ; c'est bien une adresse multiple de 256, non ?


defw #c000,#c800,#d000,#d800,...











                   
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Sun 24 Feb - 13:38 (2019)    Post subject: Défilement parallaxe Reply with quote

Je complète ici, afin de te donner une idée de routine d'affichage utilisant la pile pour l'adresse écran.


Code:
;
;  Affichage d'un motif avec adresse ecran precalculée
;  et recuperee grace a pile.
;  ---- AsT/iMPACT 24 Fev 2019
;
 org #1000
;
 xor a ; on commence a la ligne 0
 ld h,screenadr/256 
 add a,a
 ld l,a
;
 di
 ld (pile+1),sp
 ld sp,hl ; sp pointe sur la table adresse multiple de 256
 ld hl,sprite ; on pointe sur les données du sprite
;
 repeat 8 
 pop de ; récupère adresse écran dans [b]de[/b] afin de pouvoir utiliser le pouvoir du LDI (5 nops par instructions)
 ldi:ldi:ldi:ldi ; ne pas négliger le pouvoir d'un LDI
 rend
;
pile  ld sp,#caca
 ei
 ret
;
; Modif bidon
;
sprite 
 defb #aa,#ff,#aa,#ff
 defb #aa,#ff,#aa,#ff
 defb #aa,#ff,#aa,#ff
 defb #aa,#ff,#aa,#ff
 defb #aa,#ff,#aa,#ff
 defb #aa,#ff,#aa,#ff
 defb #aa,#ff,#aa,#ff
 defb #aa,#ff,#aa,#ff
;
; Table d'adresse video
;
 org #1200
screenadr 
 defw #c000,#c800,#d000,#d800 ; ligne 0-3
 defw #e000,#e800,#f000,#f800 ; ligne 4-7
 defw #c050,#c850,#d050,#d850 ; ligne 8-11
 defw #e050,#e850,#f050,#f850 ; ligne 12-15



_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Sun 24 Feb - 13:50 (2019)    Post subject: Défilement parallaxe Reply with quote

Afin de coller au mieux avec le sujet de départ, voici l'affichage de "tree_top"


Code:
;
;  Affichage d'un motif avec adresse écran précalculée
;  et récupérée grace a pile.
;  ---- AsT/iMPACT 24 Fev 2019
;
 org #1000
;
 xor a ; on commence a la ligne 0
 ld h,screenadr/256 
 add a,a
 ld l,a
;
 di
 ld (pile+1),sp
 ld sp,hl ; sp pointe sur la table adresse multiple de 256
 ld hl,tree_top ; on pointe sur les données du sprite
;
 repeat 8 
 pop de ; récupère adresse écran dans de afin de pouvoir utiliser le pouvoir du LDI (5 nops par instructions)
 ldi:ldi:ldi:ldi ; ne pas négliger le pouvoir d'un LDI
 ldi:ldi:ldi:ldi
 ldi:ldi:ldi:ldi
 ldi:ldi:ldi:ldi
 rend
;
pile  ld sp,#caca
 ei
 ret
;
; Modif tree_top
;
sprite 
;
tree_top
defb #00,#40,#C0,#80,#00,#00,#00,#00,#00,#40,#C0,#80,#00,#00,#00,#00; line 0
defb #00,#C4,#CC,#C8,#00,#00,#00,#00,#00,#C4,#CC,#C8,#00,#00,#00,#00; line 1
defb #00,#C4,#30,#C8,#00,#00,#00,#00,#00,#C4,#30,#C8,#00,#00,#00,#00; line 2
defb #40,#98,#CC,#CC,#80,#00,#C0,#80,#40,#98,#CC,#CC,#80,#00,#C0,#80; line 3
defb #40,#98,#CC,#CC,#80,#40,#CC,#C8,#40,#98,#CC,#CC,#80,#40,#CC,#C8; line 4
defb #40,#98,#CC,#C8,#C0,#40,#64,#C8,#40,#98,#CC,#C8,#C0,#40,#64,#C8; line 5
defb #C4,#CC,#CC,#C4,#CC,#C4,#64,#CC,#C4,#CC,#CC,#C4,#CC,#C4,#64,#CC; line 6
defb #C0,#CC,#CC,#C4,#98,#C8,#CC,#CC,#C0,#CC,#CC,#C4,#98,#C8,#CC,#CC; line 7
;
; Table d'adresse vidéo
;
 org #1200
screenadr 
 defw #c000,#c800,#d000,#d800 ; ligne 0-3
 defw #e000,#e800,#f000,#f800 ; ligne 4-7
 defw #c050,#c850,#d050,#d850 ; ligne 8-11
 defw #e050,#e850,#f050,#f850 ; ligne 12-15



_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Last edited by Ast on Sun 24 Feb - 15:05 (2019); edited 1 time in total
Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Sun 24 Feb - 14:53 (2019)    Post subject: Défilement parallaxe Reply with quote

J'ai modifié encore un peu la routine afin qu'on puisse décaler "facilement" le motif ! J'espère que ça t'aidera.


Code:
;
;  Affichage d'un motif avec adresse écran precalculée
;  et récupérée grace a pile.
;  ---- AsT/iMPACT 24 Fev 2019
;
;      in -> bc=adresse des sprites
;          -> ix=decalage de X octets pour afficher le modif suivant
;          -> a=numero de ligne de depart
;
 org #1000
;
 xor a ; on commence a la ligne 0
 ld bc,tree_top ; bc pointe sur les données du sprite
 ld ix,30 ; on peut décaler l'affichage de X octets
;
afftiles
 di
 ld h,screenadr/256 ; 
 add a,a
 ld l,a 
 
 ld (pile+1),sp
 ld sp,hl ; sp pointe sur la table adresse multiple de 256
;
 ld d,b
 ld e,c ; on récupère le pointage sur la table des sprites
;
 repeat 8 
 pop hl ; recup adresse écran dans de afin de pouvoir utiliser le pouvoir du LDI (5 nops par instructions)
 ld b,ixh ; bc=décalage
 ld c,ixl 
 add hl,bc
 ex de,hl
 ldi:ldi:ldi:ldi ; ne pas négliger le pouvoir d'un LDI
 ldi:ldi:ldi:ldi
 ldi:ldi:ldi:ldi
 ldi:ldi:ldi:ldi
 ex de,hl
 rend
;
pile  ld sp,#caca
 ei
 ret
;
; Modif tree_top
;
sprite 
;
tree_top
defb #00,#40,#C0,#80,#00,#00,#00,#00,#00,#40,#C0,#80,#00,#00,#00,#00; line 0
defb #00,#C4,#CC,#C8,#00,#00,#00,#00,#00,#C4,#CC,#C8,#00,#00,#00,#00; line 1
defb #00,#C4,#30,#C8,#00,#00,#00,#00,#00,#C4,#30,#C8,#00,#00,#00,#00; line 2
defb #40,#98,#CC,#CC,#80,#00,#C0,#80,#40,#98,#CC,#CC,#80,#00,#C0,#80; line 3
defb #40,#98,#CC,#CC,#80,#40,#CC,#C8,#40,#98,#CC,#CC,#80,#40,#CC,#C8; line 4
defb #40,#98,#CC,#C8,#C0,#40,#64,#C8,#40,#98,#CC,#C8,#C0,#40,#64,#C8; line 5
defb #C4,#CC,#CC,#C4,#CC,#C4,#64,#CC,#C4,#CC,#CC,#C4,#CC,#C4,#64,#CC; line 6
defb #C0,#CC,#CC,#C4,#98,#C8,#CC,#CC,#C0,#CC,#CC,#C4,#98,#C8,#CC,#CC; line 7
;
; Table d'adresse vidéo
;
 org #1200
screenadr 
 defw #c000,#c800,#d000,#d800 ; ligne 0-3
 defw #e000,#e800,#f000,#f800 ; ligne 4-7
 defw #c050,#c850,#d050,#d850 ; ligne 8-11
 defw #e050,#e850,#f050,#f850 ; ligne 12-15










Notez également l'utilisation du registre 16 bits IX décomposé en 2 registres 8 bits IXH et IXL.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
gurneyh


Offline

Joined: 18 Dec 2018
Posts: 13
Masculin
Point(s): 13
Moyenne de points: 1.00

PostPosted: Sun 24 Feb - 15:15 (2019)    Post subject: Défilement parallaxe Reply with quote

Merci beaucoup pour les exemples.


J'arrive au stade ou je veux intégrer ces backgrounds avec la map de premier plan. Ces optimisations tombent à pic Smile

En espérant pouvoir montrer un résultat correct rapidement .

C'est cool d'avoir ces exemples sous le coude, pour de nouvelles idées.


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Sun 24 Feb - 15:31 (2019)    Post subject: Défilement parallaxe Reply with quote

Bin disons que ce forum est fait pour cela !  Okay


J'espère que d'autres se joindront à moi pour ce sujet passionnant.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Tronic


Offline

Joined: 20 May 2015
Posts: 33
Localisation: 77
Masculin
Point(s): 22
Moyenne de points: 0.67

PostPosted: Wed 6 Mar - 18:59 (2019)    Post subject: Défilement parallaxe Reply with quote

gurneyh wrote:

Tronic, avait émis l'idée qu'utiliser une technique à base de "delta"(ne modifier que les pixels qui ont changés), pouvait être une bonne idée, mais je n'ai pas eu le temps de tester encore.




Salut,
J'ai finalement pris le temps de tester en "delta" uniquement le défilement de ton "arbre" (tree) pour comparer. (même taille, mode 0, au pixel également, pas touché au reg1/reg2, écran standard donc...).
Ta routine pour ce défilement au pixel mode 0 de l'arbre (tree) prend, si mes calculs sont justes, approx. 3724 nop soit 58.18 lignes de rasters.
Ma version "delta" quant à elle prend 3902 nop, soit 60.96 lignes de rasters.
J'imagine qu'elle pourrait-être certainement optimisée mais pas franchement de beaucoup je pense...
Bilan un peu mitigé donc...Mais ça reste une alternative...
Bref, ci-joint le zip de cette version "delta", source winape. (En espérant qu'il passe sur le forum... http://www.sendspace.com/file/07x69q)
Également posé sur uptobox, ici : https://uptobox.com/tqz9ekhbks3e
Sinon, plus simple, je te l'enverrai sur Discord ^^
+++
Tronic/GPA.


Back to top
gurneyh


Offline

Joined: 18 Dec 2018
Posts: 13
Masculin
Point(s): 13
Moyenne de points: 1.00

PostPosted: Wed 6 Mar - 20:21 (2019)    Post subject: Défilement parallaxe Reply with quote

Salut Tronic,

Et merci pour avoir testé. J'ai fait des essais de mon coté également en utilisant les deltas.

Le problème c'est qu'une fois qu'on a des tiles devant, on ne peut plus afficher des "bandeaux" aussi simplement.

Je dois tester les tiles de devant et venir afficher les tiles de derrière dans les trous, et c'est long.

Prochaine étape que je vais tester, c'est de générer des tiles compilés pour les tiles d'arrière plan.

Genre: je vais trié les octets utilisés dans un tile par ordre décroissant, et stocker les 3 4 valeurs les plus utilisées dans des registres.
Je ne pense pas pouvoir faire plus rapide avec un système de tile.

Si ce n'est pas suffisant je vais devoir réfléchir à une méthode complètement différente.

A+


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Wed 6 Mar - 22:19 (2019)    Post subject: Défilement parallaxe Reply with quote

Tronic wrote:
gurneyh wrote:
Tronic, avait émis l'idée qu'utiliser une technique à base de "delta"(ne modifier que les pixels qui ont changés), pouvait être une bonne idée, mais je n'ai pas eu le temps de tester encore.






Salut,
J'ai finalement pris le temps de tester en "delta" uniquement le défilement de ton "arbre" (tree) pour comparer. (même taille, mode 0, au pixel également, pas touché au reg1/reg2, écran standard donc...).
Ta routine pour ce défilement au pixel mode 0 de l'arbre (tree) prend, si mes calculs sont justes, approx. 3724 nop soit 58.18 lignes de rasters.
Ma version "delta" quant à elle prend 3902 nop, soit 60.96 lignes de rasters.
J'imagine qu'elle pourrait-être certainement optimisée mais pas franchement de beaucoup je pense...
Bilan un peu mitigé donc...Mais ça reste une alternative...
Bref, ci-joint le zip de cette version "delta", source winape. (En espérant qu'il passe sur le forum... http://www.sendspace.com/file/07x69q)
Également posé sur uptobox, ici : https://uptobox.com/tqz9ekhbks3e
Sinon, plus simple, je te l'enverrai sur Discord ^^
+++
Tronic/GPA.




 Mets le code source que je puisse visualiser cela stp. Merci. 
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Tronic


Offline

Joined: 20 May 2015
Posts: 33
Localisation: 77
Masculin
Point(s): 22
Moyenne de points: 0.67

PostPosted: Mon 11 Mar - 17:53 (2019)    Post subject: Défilement parallaxe Reply with quote

@AST :
Comme évoqué sur Discord, ci-joint une nouvelle version du scroll des arbres, au pixel, mode 0, toujours pour voir en delta ce que ça pouvait apporter de bon (ou pas...).
Comparativement à la première version delta, j'ai modifié la structure des fichiers (incbin/delta...) pour pouvoir m'affranchir de quelques nop dans la boucle principale au détriment ceci-dit de leur taille...
On descend cette fois ci à 3400nops (53.12RL) au mini de l'affichage delta et 3550nops (55.46RL) au maxi. Prendre donc en compte cette dernière valeur maxi bien sûr...
Ce qui est donc moindre que la routine initiale de Gurneyh (3724). Objectif au moins atteint sur ce point... Même si je pense qu'on peut mieux faire... Mais différemment...
Comme le souligne cependant Gurneyh, l'exploitation de ce genre de "scroll/delta" nécessiterait de repenser l'affichage de ce qui passerait (gros décors) devant ces bandeaux scrollant au pixel...
Idée comme ça :
Pourquoi ne pas d'ailleurs afficher (en soft, à l'octet) par dessus cette bande au pixel qu'un "bout" du "gros du décors" qui lui en revanche scrollerait en hard (à l'octet) et minoré du/des bouts affichés (en soft) sur ces bandes ?
Avec ruptures en dessous/dessus du bandeau bien sûr. (Je sais pas si je suis clair... ^^)
Bref, ci-joint la routine delta version 2 (3550nop / incbin inclus /zip) : https://uptobox.com/1zod1a3cr52g ou http://www.sendspace.com/file/3dlpi3
A suivre... A+

PS : Je te paste le code+qques commentaires (winape) aussi pour que tu puisses voir facilement de visu sur ta tablette/phone depuis ton plumard ^^ et/ou améliorer... (Un peu casse-pieds à coller dans une balise code...)

Code:
 
; tree-delta v2
; Tronic/GPA

    org &1000
    nolist
    run start

hauteur    equ 16
largeur    equ 8

start
    ld a,0            ; mode 0
    call &bc0e

;jp skip
                    ; voir plus bas pour jp skip...

put                    ; j'affiche le mini-sprite 8 fois, en largeur,
    ld de,&c000+8    ; classiquement (non decalee d'un pixel donc)
    ld b,8            ; afin d'obtenir visuellement une bande uniforme
pool   
    push bc            ; Le delta s'appliquera "dessus" et on ne
    push de            ; "pokera" donc que ce qui change d'une frame a l'autre
    ld hl,treesprite
    ld b,hauteur
loop   
    push bc
    push de
    ld bc,largeur
    ldir
    pop de
    call bc26de
    pop bc
    djnz loop
    pop de
    ex de,hl
    ld bc,8
    add hl,bc
    ex de,hl
    pop bc
    djnz pool   

skip            ; jp skip permet de voir ce qu'apporte le delta
                ; En l'occurence, dans ce cas, le scroll dudit
                ; mini-sprite, d'un pixel, horizontalement
                ; n'apporte finalement pas grand chose en delta
                ; comparativement a un objet qui bougerait de
                ; maniere plus complexe...
                ; Si jp skip est mis,
                ; on remarque une bande noire dans l'avant derniere
                ; ligne. C'est en quelquesorte le "gain" obtenu
                ; de "non pokage" d'octet avec du delta...
                ; Peanuts donc dans ce cas et c'est vraiment se faire
                ; chier pour pas grand chose ^^ Mais bon...   

    di
    ld hl,&c9fb        ; &c9fb...
    ld (&38),hl
    ei
main                ; sync...
    ld b,&f5
sync    in a,(c)
    rra
    jp nc,sync

    ld bc,&7f8c        ; mode 0
    out(c),c

    ld bc,&7f00        ; couleurs...
    ld a,&54
    out (c),c
    out (c),a
    inc c
    ld a,&56
    out (c),c
    out (c),a
    inc c
    ld a,&53
    out (c),c
    out (c),a
    inc c
    ld a,&4e
    out (c),c
    out (c),a

    halt            ; tempo...
    halt
    halt
    halt

    ld bc,&7f10        ; bande rouge   
    ld a,&6c
    out (c),c
    out (c),a
                ; count start
    call delta    ; 3400nops (53.12RL) / 3550nops (55.46RL)
                ; count stop

                ; Dans ce cas precis (mini-sprite "tree")
                ; l'affichage du delta oscille une fois sur deux
                ; selon le nombre de donnees qui changent lors d'un
                ; scroll d'un pixel...
                ; un coup 3400nops, un coup 3550nops...
                ; prendre en compte bien sur la valeur la plus haute (3550).
                ; A noter qu'en fonction de la forme du dessin du sprite,
                ; nous aurions des resultats certainement tres differents...
                ; un test sur les nuages serait interessant car moins complexe
                ; et moins de pixels changeant...
           
    ld bc,&7f10
    ld a,&54
    out (c),c
    out (c),a
   
    jp main            ; boucle...

bc26de  ld a,d        ; bc26 sur de...     
        add a,8    
        ld d,a     
        ret nc     
        ex de,hl   
        ld bc,#c050
        add hl,bc    
        ex de,hl
    ret  

delta
    di
    ld (pile+1),sp        ; on sauve la pile...
modif    ld sp,frame0    ; sp pointe sur le premier fichier delta...
    ld bc,8                ; incrementation pour afficher 7 fois le delta +x (8)
boucle
    pop hl               ; recuperation de l'adresse ecran      
    ld a,h       
    or a                ; si h=a=0
    jr z,fin            ; alors fin, frame terminee...
        pop af            ; sinon, recuperation de l'octet a poker...
                        ; pas besoin de faire prealablement un "dec sp"
                        ; avant le pop af car il y a un "octetbidon"
                        ; dans le delta (&bb)
    ld (hl),a            ; affichage delta une fois
    add hl,bc            ; adrecr+8 octets
    ld (hl),a            ; affichage meme delta x+8 plus loin
    add hl,bc            ; adrecr+16 octets
    ld (hl),a            ; affichage meme delta x+16 plus loin   
    add hl,bc            ; etc...
    ld (hl),a            ; afin d'avoir la bande en entier...
    add hl,bc            ; Comme le mini sprite boucle en delta
    ld (hl),a            ; c'est "invisible" sur la bande en entier
    add hl,bc            ; qui est donc visuellement cyclique, au pixel...
    ld (hl),a            ; puisque le delta du mini-sprite est au pixel...
    add hl,bc
    ld (hl),a
    add hl,bc
    ld (hl),a
   
    jr boucle            ; adrecran/octet suivant...
fin
    pop hl                ; a la prochaine vbl, frame suivante...
    ld (modif+1),hl        ; que l'on place dans le future sp de la vbl suivante...
pile
    ld sp,0                ; on remet la pile...
    ei
    ret

frame0
incbin '000to001.bin'    ; delta d'un decalage d'un pixel (image0/image1)
dw frame1                ; on va sur frame1

; incbin contient le delta de (frame_N / Frame_N+1)
; avec agencement suivant
; dw adrecr
; db octetbidon qui sert a rien (&bb)
; afin d'eviter un "dec sp" dans la boucle pour recup de A (voir 1ere routine)
; Bemol, c'est plus rapide mais ca grossit la taille du delta...
; db val_de_a (valeur a poker...)
; dw adrecr
; db octetbidon (&bb)
; db val_de_a
; etc
; dw 0000 (test de sortie)
; dw frame_number pour passer/boucler au delta suivant a la prochaine vbl.

frame1
incbin '001to002.bin'    ; delta d'un decalage d'un pixel (image1/image2)
dw frame2                ; on va sur frame2

frame2
incbin '002to003.bin'    ; delta d'un decalage d'un pixel (image2/image3)
dw frame3                ; on va sur frame3

frame3
incbin '003to004.bin'    ; delta d'un decalage d'un pixel (image3/image4)
dw frame4                ; on va sur frame4

frame4
incbin '004to005.bin'    ; delta d'un decalage d'un pixel (image4/image5)
dw frame5                ; on va sur frame5

frame5
incbin '005to006.bin'    ; delta d'un decalage d'un pixel (image5/image6)
dw frame6                ; on va sur frame6

frame6
incbin '006to007.bin'    ; delta d'un decalage d'un pixel (image6/image7)
dw frame7                ; on va sur frame7

frame7
incbin '007to008.bin'    ; delta d'un decalage d'un pixel (image7/image8)
dw frame8                ; on va sur frame8

frame8
incbin '008to009.bin'    ; delta d'un decalage d'un pixel (image8/image9)
dw frame9                ; on va sur frame9

frame9
incbin '009to010.bin'    ; delta d'un decalage d'un pixel (image9/image10)
dw frame10                ; on va sur frame10

frame10
incbin '010to011.bin'    ; delta d'un decalage d'un pixel (image10/image11)
dw frame11                ; on va sur frame11

frame11
incbin '011to012.bin'    ; delta d'un decalage d'un pixel (image11/image12)
dw frame12                ; on va sur frame12

frame12
incbin '012to013.bin'    ; delta d'un decalage d'un pixel (image12/image13)
dw frame13                ; on va sur frame13

frame13
incbin '013to014.bin'    ; delta d'un decalage d'un pixel (image13/image14)
dw frame14                ; on va sur frame14

frame14
incbin '014to015.bin'    ; delta d'un decalage d'un pixel (image14/image15)
dw frame15                ; on va sur frame15

frame15
incbin '015to000.bin'    ; delta d'un decalage d'un pixel (image15/image0) bouclage...
dw frame0                ; on boucle sur frame0

treesprite                ; le mini-sprite originel...
db #0c,#0c,#0c,#0c,#0c,#0c,#00,#00
db #04,#0c,#0c,#0c,#0c,#08,#c0,#c0
db #04,#0c,#0c,#0c,#0c,#08,#c4,#c8
db #80,#0c,#08,#00,#0c,#40,#c8,#c0
db #80,#0c,#40,#c0,#04,#40,#c8,#c0
db #00,#04,#44,#c0,#04,#40,#c8,#c0
db #c0,#80,#c4,#c0,#80,#c0,#c0,#80
db #c0,#c8,#40,#c0,#80,#40,#c0,#80
db #c4,#c0,#40,#c0,#80,#c0,#c0,#c0
db #c4,#c0,#c0,#c0,#80,#40,#c0,#80
db #c4,#c0,#40,#c0,#40,#80,#c0,#80
db #c0,#c0,#80,#80,#c0,#c0,#40,#c0
db #c0,#c0,#80,#80,#c0,#c0,#40,#c0
db #c0,#c0,#c0,#80,#c0,#c0,#40,#c0
db #c0,#c0,#c0,#c0,#c0,#c0,#c0,#c0
db #c0,#c0,#c0,#c0,#c0,#c0,#40,#c0

zeend




Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Tue 12 Mar - 13:47 (2019)    Post subject: Défilement parallaxe Reply with quote

Superbe! Merci... faudrait trouver un système pour conserver les fichiers sur le forum, parce que sendspace ne conserve qu’un temps.
Si quelqu’un a une solution à me proposer...
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
siko


Offline

Joined: 12 Apr 2018
Posts: 33
Localisation: Civaux (86)
Masculin
Point(s): 22
Moyenne de points: 0.67

PostPosted: Sun 8 Sep - 14:19 (2019)    Post subject: Défilement parallaxe Reply with quote

Ast wrote:
Superbe! Merci... faudrait trouver un système pour conserver les fichiers sur le forum, parce que sendspace ne conserve qu’un temps.
Si quelqu’un a une solution à me proposer...



Je crois que j'ai une piste pour ca Smile


Back to top
Visit poster’s website
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Sun 8 Sep - 19:18 (2019)    Post subject: Défilement parallaxe Reply with quote

siko wrote:
Ast wrote:
Superbe! Merci... faudrait trouver un système pour conserver les fichiers sur le forum, parce que sendspace ne conserve qu’un temps.
Si quelqu’un a une solution à me proposer...





Je crois que j'ai une piste pour ca Smile




Une piste ? Je veux en savoir plus...
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Display posts from previous:   
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> Affichage video All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  

Index | Administration Panel | Create a forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group