Derniers sujets
» Listings de l'ORIC-1 Manual
afficher un sprite au pixel près, quelle méthode optimale ? EmptyAujourd'hui à 18:07 par didierv

» Une découverte probablement majeure pour la 3D sur Oric !!
afficher un sprite au pixel près, quelle méthode optimale ? EmptyAujourd'hui à 14:46 par jbperin

» rs
afficher un sprite au pixel près, quelle méthode optimale ? EmptyHier à 19:59 par rjiji

» J'ai reçu un Oric !!!
afficher un sprite au pixel près, quelle méthode optimale ? EmptyHier à 19:43 par jbperin

» une atan2 pour vos lib math
afficher un sprite au pixel près, quelle méthode optimale ? EmptyHier à 19:23 par jbperin

» [débutant] besoin d'infos sur l'Oric-1
afficher un sprite au pixel près, quelle méthode optimale ? EmptyHier à 18:06 par kenneth

» CEO-MAG 356, le dernier de l'année ...
afficher un sprite au pixel près, quelle méthode optimale ? EmptyHier à 9:25 par jbperin

» L'aigle D'or sur Colecovision !!!!
afficher un sprite au pixel près, quelle méthode optimale ? EmptyMar 10 Déc 2019 - 21:27 par didierv

» Session de travail avec VisuCar
afficher un sprite au pixel près, quelle méthode optimale ? EmptyDim 8 Déc 2019 - 13:48 par jbperin

» Black Mamba
afficher un sprite au pixel près, quelle méthode optimale ? EmptyDim 8 Déc 2019 - 13:46 par jbperin

» le retour du Commodore 64
afficher un sprite au pixel près, quelle méthode optimale ? EmptyVen 6 Déc 2019 - 1:55 par jbperin

» Type in Master Mind
afficher un sprite au pixel près, quelle méthode optimale ? EmptyJeu 5 Déc 2019 - 14:53 par Ladywasky

» Pictoric
afficher un sprite au pixel près, quelle méthode optimale ? EmptyMer 4 Déc 2019 - 12:02 par Sheld67

» Nouveau site ceo.oric.org
afficher un sprite au pixel près, quelle méthode optimale ? EmptyMar 3 Déc 2019 - 5:08 par didierv

» Bocco's adventures - nouveau jeu pour Oric
afficher un sprite au pixel près, quelle méthode optimale ? EmptyMar 3 Déc 2019 - 0:08 par retroric

Qui est en ligne ?
Il y a en tout 2 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 2 Invités

Aucun

Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion

Récupérer mon mot de passe

Statistiques
Nous avons 202 membres enregistrés
L'utilisateur enregistré le plus récent est stephane53ra

Nos membres ont posté un total de 8332 messages dans 722 sujets
Portail ORIC



-30%
Le deal à ne pas rater :
Console Sony PS4 Pro 1To Death Stranding + lampe et Fallout 76 offerts
369.99 € 530.97 €
Voir le deal

afficher un sprite au pixel près, quelle méthode optimale ?

Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty afficher un sprite au pixel près, quelle méthode optimale ?

Message par goyo le Mar 17 Sep 2019 - 16:05

Je souhaiterais afficher un sprite de 4 octets de large au pixel près. Pour cela j'utilise l'opcode ROR avec un shift = décalage de 0 à 5 pixel.

Le problème est que suivant le décalage en cours, la vitesse d'affichage sera très différente . Puisque si shift = 0 l'affichage sera rapide car dans ce cas pas de traitement au niveau des pixels, mais si  le décalage est de 5 ce sera beaucoup plus lent car il exécutera 5 x la boucle avec l'instruction ROR pour l'octet courant du sprite + ROR de l'octet précédent pour récupérer ses bits.

Quelle est donc la meilleurs méthode pour afficher un sprite au pixel près ? et pour équilibrer le timing suivant le décalage du sprite... ??

Code:
                        ....
         cpx #0  ; less than 1 = 0 so branch
         beq no_shift
      
         loop_shift
            
            ror byte ; shift the current byte of the sprite to the right C-> b7 b0 -> C

            lda byteprev ; previous current byte of the sprite

            bit bitflag ;     check the 1rst bit of prev byte      
      
            beq bitelse ;IF BIT0 !=1 then Branch to ELSE
               ; else put 1 in bit 5
                lda byte
                ora #32
                sta byte
                jmp bit1end
            bitelse: ; ELSE
            
         lda byte
                    and #223 ; clear bit n°5
                   sta byte
bit1end                  
         clc
         ror byteprev
            
            
            dex
            
            cpx #0
         bne loop_shift
no_shift
         lda byte
         ora #64 ; set bit 64 BITMAP mode
         and #127 ; clear bit 127  No Inverse
         sta byte
                        ...
Fichiers joints
afficher un sprite au pixel près, quelle méthode optimale ? Attachment
spr_and_key2.zip Vous n'avez pas la permission de télécharger les fichiers joints.(15 Ko) Téléchargé 1 fois
goyo
goyo

Messages : 181
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par Jede le Mar 17 Sep 2019 - 16:23

goyo a écrit:Je souhaiterais afficher un sprite de 4 octets de large au pixel près. Pour cela j'utilise l'opcode ROR avec un shift = décalage de 0 à 5 pixel.

Le problème est que suivant le décalage en cours, la vitesse d'affichage sera très différente . Puisque si shift = 0 l'affichage sera rapide car dans ce cas pas de traitement au niveau des pixels, mais si  le décalage est de 5 ce sera beaucoup plus lent car il exécutera 5 x la boucle avec l'instruction ROR pour l'octet courant du sprite + ROR de l'octet précédent pour récupérer ses bits.

Quelle est donc la meilleurs méthode pour afficher un sprite au pixel près ? et pour équilibrer le timing suivant le décalage du sprite... ??

Code:
                        ....
         cpx #0  ; less than 1 = 0 so branch
 beq no_shift
 
 loop_shift
 
 ror byte ; shift the current byte of the sprite to the right C-> b7 b0 -> C

 lda byteprev ; previous current byte of the sprite

 bit bitflag ;     check the 1rst bit of prev byte
 
 beq bitelse ;IF BIT0 !=1 then Branch to ELSE
 ; else put 1 in bit 5
 lda byte
 ora #32
 sta byte
   jmp bit1end
 bitelse: ; ELSE
 
 lda byte
              and #223 ; clear bit n°5
                 sta byte
bit1end
 clc
 ror byteprev
 
 
 dex
 
 cpx #0
 bne loop_shift
no_shift
 lda byte
 ora #64 ; set bit 64 BITMAP mode
 and #127 ; clear bit 127  No Inverse
 sta byte
                        ...

Le plus rapide est de faire le précalcul des shifts. C'est à dire que le décalage se fait avant avec un logiciel (en natif, il y a un soft de Twilighte qui le fait) Sinon, avec un soft de dessin sur PC.). Les images sont stockées dans le code et en fonction de la position, l'offset de lecture du sprite change.

Cela mange un peu de ram, mais c'est ce qu'il y a de plus rapide.
Jede
Jede

Messages : 295
Date d'inscription : 20/04/2016
Localisation : Var

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par Dbug le Mar 17 Sep 2019 - 16:54

La meilleur méthode est celle donnée par Jede, une alternative est d'utiliser des tables pour les parties gauches/droites de rotation qui prennent en compte directement les valeurs a conserver.

_________________

Dbug
Dbug

Messages : 233
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par goyo le Mar 17 Sep 2019 - 21:41

Si je vous ai bien compris c'est mieux avec des tableaux d'octets en rotation pré calculés qui contiennent toutes les combinaisons d'octets sur 6 bits ...

un peu comme dans  le code suivant : ?

Code:
lda SprByte
.
.
tay
ldx bitshift ;  get shift value from bitshiftable indexed from posX
cpx #0
bcc jumpShift0
lda STableShift0,y
jumpShift0  
cpx #1
bcc jumpShift1
lda STableShift1,y
jumpShift1
cpx #2
bcc jumpShift2
lda STableShift2,y
jumpShift2
cpx 3
bcc jumpShift3
lda STableShift3,y
jumpShift3
cpx #4
bcc jumpShift4
lda STableShift4,y
jumpShift4
cpx #5
bcc jumpShift5
lda STableShift5,y
jumpShift5
.
.
.

STableShift0 ; shift tables of 64 first values of byte
.byt %00000000,%00000001,%00000010,%00000011
.byt %00000100,%00000101,%00000110,%00000111
.byt %00001000,%00001001,%00001010,%00001011
.byt %00001100,%00001101,%00001110,%00001111
.byt %00010000,%00010001,%00010010,%00010011
.byt %00010100,%00010101,%00010110,%00010111
.byt %00011000,%00011001,%00011010,%00011011
.byt %00011100,%00011101,%00011110,%00011111
.byt %00100000,%00100001,%00100010,%00100011
.byt %00100100,%00100101,%00100110,%00100111
.byt %00101000,%00101001,%00101010,%00101011
.byt %00101100,%00101101,%00101110,%00101111
.byt %00110000,%00110001,%00110010,%00110011
.byt %00110100,%00110101,%00110110,%00110111
.byt %00111000,%00111001,%00111010,%00111011
.byt %00111100,%00111101,%00111110,%00111111
STableShift1 ; same than previous table with a shift of 1
.byt %00000000,%00000000,%00000001,%00000001
.byt %00000010,%00000010,%00000011,%00000011
.byt %00000100,%00000100,%00000101,%00000101
.byt %00000110,%00000110,%00000111,%00000111
.byt %00001000,%00001000,%00001001,%00001001
.byt %00001010,%00001010,%00001011,%00001011
.byt %00001100,%00001100,%00001101,%00001101
.byt %00001110,%00001110,%00001111,%00001111
.byt %00010000,%00010000,%00010001,%00010001
.byt %00010010,%00010010,%00010011,%00010011
.byt %00010100,%00010100,%00010101,%00010101
.byt %00010110,%00010110,%00010111,%00010111
.byt %00011000,%00011000,%00011001,%00011001
.byt %00011010,%00011010,%00011011,%00011011
.byt %00011100,%00011100,%00011101,%00011101
.byt %00011110,%00011110,%00011111,%00011111
STableShift2
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000010,%00000010,%00000010,%00000010
.byt %00000011,%00000011,%00000011,%00000011
.byt %00000100,%00000100,%00000100,%00000100
.byt %00000101,%00000101,%00000101,%00000101
.byt %00000110,%00000110,%00000110,%00000110
.byt %00000111,%00000111,%00000111,%00000111
.byt %00001000,%00001000,%00001000,%00001000
.byt %00001001,%00001001,%00001001,%00001001
.byt %00001010,%00001010,%00001010,%00001010
.byt %00001011,%00001011,%00001011,%00001011
.byt %00001100,%00001100,%00001100,%00001100
.byt %00001101,%00001101,%00001101,%00001101
.byt %00001110,%00001110,%00001110,%00001110
.byt %00001111,%00001111,%00001111,%00001111
STableShift3
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000010,%00000010,%00000010,%00000010
.byt %00000010,%00000010,%00000010,%00000010
.byt %00000011,%00000011,%00000011,%00000011
.byt %00000011,%00000011,%00000011,%00000011
.byt %00000100,%00000100,%00000100,%00000100
.byt %00000100,%00000100,%00000100,%00000100
.byt %00000101,%00000101,%00000101,%00000101
.byt %00000101,%00000101,%00000101,%00000101
.byt %00000110,%00000110,%00000110,%00000110
.byt %00000110,%00000110,%00000110,%00000110
.byt %00000111,%00000111,%00000111,%00000111
.byt %00000111,%00000111,%00000111,%00000111
STableShift4
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000010,%00000010,%00000010,%00000010
.byt %00000010,%00000010,%00000010,%00000010
.byt %00000010,%00000010,%00000010,%00000010
.byt %00000010,%00000010,%00000010,%00000010
.byt %00000011,%00000011,%00000011,%00000011
.byt %00000011,%00000011,%00000011,%00000011
.byt %00000011,%00000011,%00000011,%00000011
.byt %00000011,%00000011,%00000011,%00000011
STableShift5
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000000,%00000000,%00000000,%00000000
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001
.byt %00000001,%00000001,%00000001,%00000001


bitshiftable
 .byt 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
 .byt 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
 .byt 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
 .byt 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
 .byt 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
 .byt 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
 .byt 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
 .byt 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5

 
goyo
goyo

Messages : 181
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par Jede le Mar 17 Sep 2019 - 21:55

Le code peut être plus simple que cela.

Il faut faire une table qui va pointer sur les données du sprite (le code suivant peut être fait de différente manière, et surtout l'affichage peut se faire en code déroulé ou pas, en fonction de ce qu'on veut ):

L'exemple ci dessous c'est juste pour montrer l'utilisation de tables.
Code:

; Y contient la position à afficher

lda  table_shift_sprites_low,y
sta  $00
lda  table_shift_sprites_high,y
sta  $01

; et ici on peut commencer à afficher avec la page 0
ldy #$00
lda ($00),y
...



table_shift_sprites_high:
.byt >sprite_shift0
.byt >sprite_shift1

table_shift_sprites_low:
.byt <sprite_shift0
.byt <sprite_shift1

sprite_shift0:
.byt XX
sprite_shift1:
.byt XX


Dernière édition par Jede le Mar 17 Sep 2019 - 22:57, édité 4 fois
Jede
Jede

Messages : 295
Date d'inscription : 20/04/2016
Localisation : Var

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par didierv le Mar 17 Sep 2019 - 22:17

Dbug a écrit:La meilleur méthode est celle donnée par Jede, une alternative est d'utiliser des tables pour les parties gauches/droites de rotation qui prennent en compte directement les valeurs a conserver.

C'est tout bete comme solution et ... très efficace. je ne programme vraiment plus assez pour avoir le réflexe des tables pré-programmées.
Il est loin le temps des demos sur st et amiga, boostées à coups de tables de sinus


Dernière édition par didierv le Mer 18 Sep 2019 - 21:58, édité 1 fois

_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
didierv
didierv

Messages : 768
Date d'inscription : 19/01/2014
Age : 57
Localisation : Nord de la France

http://www.dmacoco.fr

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par Oric1-Atmos le Mer 18 Sep 2019 - 11:13

Hoooo !!  Very Happy  Very Happy  un amigaiste !!! Le monde est petit.....
Oric1-Atmos
Oric1-Atmos

Messages : 92
Date d'inscription : 08/03/2017
Localisation : 49

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par Moonchild le Mer 18 Sep 2019 - 11:27

Amiga Rulez ! Cool Very Happy
Moonchild
Moonchild

Messages : 46
Date d'inscription : 05/08/2014
Age : 47
Localisation : Albigny Sur Saône

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par goyo le Mer 18 Sep 2019 - 17:43

Merci Jede.

En fait je suis débutant en assembleur (avec un petit peu 40 ans de retard pour m'y mettre), je suis loin d'avoir ton niveau, je vais essayer comprendre ton exemple.

Je n'ai pas encore utilisé la page 0 pour l'affichage mais le mode "patch".

J'ai l'impression que tu utilises un tableau de tableau ?

Je ne comprends pas à quoi correspond shift high et shift low ?


Jede a écrit:Le code peut être plus simple que cela.

Il faut faire une table qui va pointer sur les données du sprite (le code suivant peut être fait de différente manière, et surtout l'affichage peut se faire en code déroulé ou pas, en fonction de ce qu'on veut ):

L'exemple ci dessous c'est juste pour montrer l'utilisation de tables.
Code:

; Y contient la position à afficher

lda  table_shift_sprites_low,y
sta  $00
lda  table_shift_sprites_high,y
sta  $01

; et ici on peut commencer à afficher avec la page 0
ldy #$00
lda ($00),y
...



table_shift_sprites_high:
.byt >sprite_shift0
.byt >sprite_shift1

table_shift_sprites_low:
.byt <sprite_shift0
.byt <sprite_shift1

sprite_shift0:
.byt XX
sprite_shift1:
.byt XX
goyo
goyo

Messages : 181
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par Dbug le Mer 18 Sep 2019 - 20:35

Pour mes besoins persos, en général j'y vais bien plus simple, et je me fait une image avec mon sprite dans les 6 positions et je laisse PictConv me convertir ca comme il faut.

Par exemple dans Quantum FX, le sprite du joueur avec tous les décalages c'est ca: (j'ai mis la couleur gris pour mettre en valeur mais normalement c'est tout noir.)
afficher un sprite au pixel près, quelle méthode optimale ? Pods_w10

_________________

Dbug
Dbug

Messages : 233
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

afficher un sprite au pixel près, quelle méthode optimale ? Empty Re: afficher un sprite au pixel près, quelle méthode optimale ?

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum