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éplacement de sprite au pixel(mode 1)

 
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: Fri 21 Dec - 00:47 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

Salut à tous

Je me recolle depuis quelques semaines  à la programmation sur le CPC(enfin crossdev + émulateur, malheureusement pas de vrai machine sous la main  Sad ). J'avais oublié à quel point c'était addictif.


Forcément je reprend un peu de zéro, et je rencontre un problème(enfin je crois).
J'essaye de déplacer un sprite repiquer du Galaga de la NES. Les data du sprite sont généré à l'aide de Retro Game Asset Studio.

Malgré l'utilisation d'un double buffer, visuellement j'ai une impression de tearing(ce qui me semble impossible).
L'effet produit n'est pas très heureux.

Si une âme charitable pouvait jeter un oeil au résultat obtenu, et me dire s'il voit bien cet effet bizarre lors du déplacement du sprite, ce serait super sympa.


vstars3/dsk
(Le point d'entrée est en &8000)


Au cas ou je colle, une partie du code
- la récupération de l'adresse écran du sprite
- la version du sprite à afficher
- l'affichage
- les sprites, et la table de masquage


Code:

displayPlayer:
   ld bc, (playerPos)   ; Player coordinates (b: ordinate, c: absciss)
   ld h, 0
   ld l, b       ; Ordinate
   add hl, hl       
   ld de, linesOfs
   add hl, de
   ld e, (hl)
   inc hl
   ld d, (hl)       
   ld a, c       ; Absciss
   srl a
   srl a          ; Abciss to byte
   add a, e
   ld e, a       ; de = screen address
   ld hl, (buf2)      ; save address
   ld (hl), e
   inc hl
   ld (hl), d
   ld a, c       ; Shift
   and 3
   add a, a
   ld c, a
   ld b, 0
   ld hl, sprites
   add hl, bc
   ld c, (hl)
   inc hl
   ld b, (hl)      ; bc = Sprite address
   
   ld ix, 16 * 256 + 5   ; ixh => height
            ; ixl => widht
   ld h, masklookuptable / 256
displayPlayer1:
REPT 5
   ld a, (bc)
   ld l, a
   ld a, (de)
   and (hl)
   or l
   ld (de), a
   inc e
   inc bc
ENDM
   ld a, e
   sub ixl
   ld e, a
   nextLine

   dec ixh
   jr nz, displayPlayer1
   ret


playerPos:
   dw 239 * 256 + 128
sprites:
dw player1
dw player2
dw player3
dw player4

player1:
db 0x00,0x10,0x00,0x00,0x00; line 0
db 0x00,0x10,0x00,0x00,0x00; line 1
db 0x00,0x10,0x00,0x00,0x00; line 2
db 0x00,0x30,0x80,0x00,0x00; line 3
db 0x00,0x30,0x80,0x00,0x00; line 4
db 0x01,0x30,0x81,0x00,0x00; line 5
db 0x01,0x30,0x81,0x00,0x00; line 6
db 0x10,0x70,0xD0,0x00,0x00; line 7
db 0x18,0xE9,0xF2,0x02,0x00; line 8
db 0x19,0xC3,0x79,0x02,0x00; line 9
db 0x90,0xD2,0x78,0x20,0x00; line 10
db 0xB0,0xF0,0xF0,0xA0,0x00; line 11
db 0xF0,0xB4,0xB4,0xE0,0x00; line 12
db 0xE0,0x3C,0x86,0xE0,0x00; line 13
db 0xC0,0x1C,0x06,0x60,0x00; line 14
db 0x80,0x10,0x00,0x20,0x00; line 15


player2:
db 0x00,0x00,0x80,0x00,0x00; line 0
db 0x00,0x00,0x80,0x00,0x00; line 1
db 0x00,0x00,0x80,0x00,0x00; line 2
db 0x00,0x10,0xC0,0x00,0x00; line 3
db 0x00,0x10,0xC0,0x00,0x00; line 4
db 0x00,0x18,0xC0,0x08,0x00; line 5
db 0x00,0x18,0xC0,0x08,0x00; line 6
db 0x00,0xB0,0xE0,0x80,0x00; line 7
db 0x04,0xF4,0x79,0x81,0x00; line 8
db 0x04,0xE9,0x3C,0x89,0x00; line 9
db 0x40,0xE1,0xB4,0x90,0x00; line 10
db 0x50,0xF0,0xF0,0xD0,0x00; line 11
db 0x70,0xD2,0xD2,0xF0,0x00; line 12
db 0x70,0x16,0xC3,0x70,0x00; line 13
db 0x60,0x06,0x83,0x30,0x00; line 14
db 0x40,0x00,0x80,0x10,0x00; line 15


player3:
db 0x00,0x00,0x20,0x00,0x00; line 0
db 0x00,0x00,0x20,0x00,0x00; line 1
db 0x00,0x00,0x20,0x00,0x00; line 2
db 0x00,0x00,0x70,0x00,0x00; line 3
db 0x00,0x00,0x70,0x00,0x00; line 4
db 0x00,0x02,0x70,0x02,0x00; line 5
db 0x00,0x02,0x70,0x02,0x00; line 6
db 0x00,0x20,0xF0,0xA0,0x00; line 7
db 0x01,0x31,0xD2,0xE4,0x04; line 8
db 0x01,0x32,0x87,0xE2,0x04; line 9
db 0x10,0x30,0xA5,0xE0,0x40; line 10
db 0x10,0x70,0xF0,0xF0,0x40; line 11
db 0x10,0xF0,0x78,0x78,0xC0; line 12
db 0x10,0xC1,0x78,0x1C,0xC0; line 13
db 0x10,0x81,0x28,0x0C,0xC0; line 14
db 0x10,0x00,0x20,0x00,0x40; line 15


player4:
db 0x00,0x00,0x40,0x00,0x00; line 0
db 0x00,0x00,0x40,0x00,0x00; line 1
db 0x00,0x00,0x40,0x00,0x00; line 2
db 0x00,0x00,0xE0,0x00,0x00; line 3
db 0x00,0x00,0xE0,0x00,0x00; line 4
db 0x00,0x04,0xE0,0x04,0x00; line 5
db 0x00,0x04,0xE0,0x04,0x00; line 6
db 0x00,0x50,0xF0,0x40,0x00; line 7
db 0x02,0x72,0xB4,0xC8,0x08; line 8
db 0x02,0x74,0x1E,0xC4,0x08; line 9
db 0x20,0x70,0x5A,0xC0,0x80; line 10
db 0x20,0xF0,0xF0,0xE0,0x80; line 11
db 0x30,0xE1,0xE1,0xF0,0x80; line 12
db 0x30,0x83,0xE1,0x38,0x80; line 13
db 0x30,0x03,0x41,0x18,0x80; line 14
db 0x20,0x00,0x40,0x00,0x80; line 15

align 256
masklookuptable: ; lookup table for masks, indexed by sprite byte. and with screen data, then or with pixel data.
db 0xff,0xee,0xdd,0xcc,0xbb,0xaa,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00,0xee,0xee,0xcc,0xcc,0xaa,0xaa,0x88,0x88,0x66,0x66,0x44,0x44,0x22,0x22,0x00,0x00
db 0xdd,0xcc,0xdd,0xcc,0x99,0x88,0x99,0x88,0x55,0x44,0x55,0x44,0x11,0x00,0x11,0x00,0xcc,0xcc,0xcc,0xcc,0x88,0x88,0x88,0x88,0x44,0x44,0x44,0x44,0x00,0x00,0x00,0x00
db 0xbb,0xaa,0x99,0x88,0xbb,0xaa,0x99,0x88,0x33,0x22,0x11,0x00,0x33,0x22,0x11,0x00,0xaa,0xaa,0x88,0x88,0xaa,0xaa,0x88,0x88,0x22,0x22,0x00,0x00,0x22,0x22,0x00,0x00
db 0x99,0x88,0x99,0x88,0x99,0x88,0x99,0x88,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00,0x66,0x66,0x44,0x44,0x22,0x22,0x00,0x00,0x66,0x66,0x44,0x44,0x22,0x22,0x00,0x00
db 0x55,0x44,0x55,0x44,0x11,0x00,0x11,0x00,0x55,0x44,0x55,0x44,0x11,0x00,0x11,0x00,0x44,0x44,0x44,0x44,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x00,0x00,0x00,0x00
db 0x33,0x22,0x11,0x00,0x33,0x22,0x11,0x00,0x33,0x22,0x11,0x00,0x33,0x22,0x11,0x00,0x22,0x22,0x00,0x00,0x22,0x22,0x00,0x00,0x22,0x22,0x00,0x00,0x22,0x22,0x00,0x00
db 0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00



Merci d'avance, et bonne fin de semaine


Back to top
Publicité






PostPosted: Fri 21 Dec - 00:47 (2018)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
roudoudou


Offline

Joined: 14 Jul 2016
Posts: 427
Localisation: LYON
Masculin
Point(s): 46
Moyenne de points: 0.11

PostPosted: Sat 22 Dec - 23:23 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

Si tu es sur émulateur et que tu veux vérifier si il y a du tearing ou non, le plus simple est de ralentir l'émulateur à 5% comme ça tu as le temps de voir tes frames en détail
Le souci d'un émulateur sur un écran à 60Hz (ce qui est presque toujours le cas sauf si tu mets ton ordi sur une vraie télévision) c'est qu'il ne peut pas être synchro sur le 50Hz donc tu auras toujours un effet désagréable sur tout ce qui tourne à 50Hz ou 25Hz


Back to top
gurneyh


Offline

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

PostPosted: Sun 23 Dec - 00:36 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

Effectivement, je suis sur un émulateur. Et je n'avais pas du tout pensé que la différence de synchro sur un moniteur pouvait provoquer cet effet désagréable.

Après je continue à regarder, car sur l'exemple que j'avais fourni sur le dsk, il s'agit d'un starfield vertical, avec en plus un sprite que l'on peut déplacer horizontalement.
Sur le déplacement du starfield aucun problème, mais sur le déplacement du sprite c'est la cata. C'est pour ça que je me dis que je fais n'importe quoi sur le shift du sprite.

Merci pour ton retour Smile


Back to top
gurneyh


Offline

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

PostPosted: Sun 23 Dec - 01:45 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

Bon... Embarassed

J'ai trouvé le problème grâce au conseil de roudoudou(vitesse d'émulation à 5%)

En fait, les données de mon sprite étaient inversées sur le 3ème et 4ème frame, ce qui donnait pour un déplacement vers la droite:
frame 1 -> frame 2 -> frame 4 -> frame 3

Je n'arrivais pas à discerner le problème à vitesse normale.

désolé pour le dérangement,
et encore merci à roudoudou pour le conseil


Back to top
Ast
Administrateur

Offline

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

PostPosted: Mon 24 Dec - 14:22 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

Bien joué et bienvenue à toi!
Est ce pour un futur projet de jeu ?
_________________
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: Mon 24 Dec - 15:00 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

Merci Ast

J'aimerai faire un remake de Galaga NES effectivement.


Mais mon manque d'expérience en asm et sur le CPC, font que se sera plutôt un objectif à moyen terme. 


L'objectif actuel, c'est plus de multiplier des petits essais(comme le starfield). Rien qu'un truc dans ce genre ça m'a pris des jours. Et déjà, c'est sur ce forum que j'ai pu lire au sujet du "out magique" pour faciliter le double buffering.

Je me bagarre aussi pour essayer de me faire un environnement de crossdev acceptable sous mac.


Back to top
Ast
Administrateur

Offline

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

PostPosted: Mon 24 Dec - 15:25 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

Sous Mac, si tu as la chance d’avoir MorphOs, tu peux y installer facilement Ace émulateur suprême du grand OffseT.
Sinon il te reste Arnold bien que la version Mac me semble un peu vieillotte.
Encore une solution, utiliser un système windows via un émulateur avec Winape de Richard Wilson.
Bonne chance pour la programmation mais tu sais que si tu as des questions, nous sommes là !!


Pour tes sprites, utilise plutôt le mode 0, car :


-Tu n’as seulement que 2 positions pour les déplacer au pixel
-Tu auras moins de zones à masquer (donc plus rapide à l’affichage)
_________________
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: Mon 24 Dec - 20:15 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

Ast wrote:
Pour tes sprites, utilise plutôt le mode 0, car :


-Tu n’as seulement que 2 positions pour les déplacer au pixel
-Tu auras moins de zones à masquer (donc plus rapide à l’affichage)


Merci pour les conseils.
En fait, j'ai un soucis de taille: je ne vois pas du tout comment conserver l'esprit des sprites originaux en mode 0.

Sprites originaux

Aussi pour le moment, je compte conserver le mode 1 mais en ne me déplaçant que par pas de 2.

Pour les zones à masquer, effectivement je risque d'avoir un soucis de rapidité. Bien qu'en y réfléchissant, même si je ne suis pas en 50hz ce ne sera pas un problème, je pense qu'il doit être possible de tenir en 25hz(bien évidemment c'est possible lorsqu'on voit les jeux modernes sur CPC, mais veux dire possible avec mon niveau de connaissance actuel).

D'ailleurs j'ai encore appris un truc aujourd'hui: je perdais beaucoup de temps à transformer mes coordonnées en adresse écran malgré le précalcul de ces adresses. Mais rien qu'en profitant mieux de l'alignement sur 256 octets, j'ai un gain de temps terrible !. Idea

Encore une fois c'est terriblement rafraichissant de programmer sur le CPC. J'imagine que c'est vrai sur n'importe quelle machine de cette génération. Smile
Ça change de mon merdier Javascript journalier :p


Très bon réveillon à tous


Back to top
hlide fremen


Offline

Joined: 16 Dec 2018
Posts: 46
Masculin
Point(s): 46
Moyenne de points: 1.00

PostPosted: Mon 24 Dec - 23:54 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

En général, sur ces machines, leur limitation nous force à être très créatif - et ça paye en satisfaction d'avoir surmonter tant d'obstacle. 

Back to top
gurneyh


Offline

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

PostPosted: Tue 25 Dec - 00:04 (2018)    Post subject: Déplacement de sprite au pixel(mode 1) Reply with quote

hlide fremen wrote:
En général, sur ces machines, leur limitation nous force à être très créatif - et ça paye en satisfaction d'avoir surmonter tant d'obstacle. 


Même que le concept se vend Very Happy
Console virtuelle

D'ailleurs je trouve que c'est une superbe porte d'entrée.
C'est vrai, on avait la chance de pouvoir coder direct en allumant notre machine.
Aujourd'hui c'est légèrement plus chaud.


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