La Place des Développeurs [EN COURS] SPRITES sur MSX. Mieux comprendre le SPRITE sur MSX.
igal
Membre non connecté
Conseiller Municipal
Reprise du message précédent
Salut Métalion.Oui j'ai bien lu ton message et ca a l'air très intéressant même si je sais absolument pas comment exploiter cette possibilité.
En gros, à ce que j'ai compris.
1) Le VDP (9938 et 9958) génère génère et stock en Hardware les coordonnées X,Y de toutes les COLLISIONS qu'il détecte.
2) Pour relever ces coordonnées, il faut "interroger" les registres 3,4,5,6 en BASIC VDP(2),VDP(3),VDP(4),VDP(5).
Comment faire pour exploiter cette possibilité
De mon coté, j'ai voulu en avoir le coeur net avec les XOR.
J'ai donc fait ce petit programme pour tester les commandes relatives aux SPRITES:
Code TEXT :
10 FORI=&H7800TO&H781F:VPOKEI,255:NEXTI:x=100 20 ONSPRITEGOSUB130:SPRITEON 30 X=X-4:IFX<1THENX=0 50 VDP(27)=VDP(27)+1AND255 60 C=CXOR32:PUTSPRITE5,(X+Y,VDP(27)),6+C,0:C=CXOR32 70 C=CXOR32:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),6+C,0:C=CXOR32 80 C=CXOR32:PUTSPRITE3,(-X-VDP(27),-Y+VDP(27)),1+C,0:C=CXOR32 90 C=CXOR32:PUTSPRITE4,(-Y,X-VDP(27)),8+C,0:C=CXOR32 100 PUTSPRITE0,(X+80,Y+150),15OR32,0 110 IFSTRIG(0)THENPUTSPRITE1,(X+50,Y),1,0 120 S=STICK(0):ONS+1GOTO30,30,30,30,30,30,30,30,30 130 END
ericb59
Membre non connecté
Conseiller Municipal
Igal, tu dois déjà dérfinir 'C'
Dans tes listings précédents : C=9
Si on suppose que la couleur de ton sprite est : 9 (mode collision ON)
ligne 60
Ton premier XOR désactive les collisions. Le second à la fin de la ligne active les collision
Ligne 70
Ton premier XOR désactive les collisions. Le second à la fin de la ligne active les collision
Ligne 80 :
Idem
Ligne 90
Idem
On arrive à la ligne 100 avec des collisions activées…
Alors, je ne sais pas exactement ce que tu cherches à faire… mais c'est bancale !
Dans tes listings précédents : C=9
Si on suppose que la couleur de ton sprite est : 9 (mode collision ON)
ligne 60
Ton premier XOR désactive les collisions. Le second à la fin de la ligne active les collision
Ligne 70
Ton premier XOR désactive les collisions. Le second à la fin de la ligne active les collision
Ligne 80 :
Idem
Ligne 90
Idem
On arrive à la ligne 100 avec des collisions activées…
Alors, je ne sais pas exactement ce que tu cherches à faire… mais c'est bancale !
Non, Igal ... Tu t'emmêles les pinceaux là.
Pour basculer le 6e bit sur l'attribut couleur de l'un de tes sprites : tu définis sa couleur dans une variable et puis tu utiliser XOR32 dans l'instruction PUT SPRITE.
Concernant les coordonnées de collision, tu as effectivement bien compris, sauf :
- Il ne s'agit PAS des coordonnées de TOUTES les collisions, mais bien uniquement de celle qui vient d'être détectée
- La lecture des registres de statuts du VDP se fait en BASIC en utilisant la valeur négative : VDP(-1) pour le registre de statut 1, VDP(-2) pour le registre de statut 2, etc ...
Pour exploiter ces coordonnées, voir le document dans mon message précédent. Edité par Metalion Le 12/02/2014 à 08h41
Pour basculer le 6e bit sur l'attribut couleur de l'un de tes sprites : tu définis sa couleur dans une variable et puis tu utiliser XOR32 dans l'instruction PUT SPRITE.
Code :
on défini les variables avant :
C1=9
C2=1
C3=8
ensuite dans ta boucle :
C1=C1XOR32:PUTSPRITE5,(X+Y,VDP(27)),C1
C2=C2XOR32:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),C2
C3=C3XOR32:PUTSPRITE3,(-X-VDP(27),-Y+VDP(27)),C3
Concernant les coordonnées de collision, tu as effectivement bien compris, sauf :
- Il ne s'agit PAS des coordonnées de TOUTES les collisions, mais bien uniquement de celle qui vient d'être détectée
- La lecture des registres de statuts du VDP se fait en BASIC en utilisant la valeur négative : VDP(-1) pour le registre de statut 1, VDP(-2) pour le registre de statut 2, etc ...
Pour exploiter ces coordonnées, voir le document dans mon message précédent. Edité par Metalion Le 12/02/2014 à 08h41
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
igal
Membre non connecté
Conseiller Municipal
Merci pour ces précisions.
J'ai essayé de tirer le maximum avec mes moyens limités et voila ce que ça donne:
Le rendu est très limité et le possibilités restreignent encore plus la vitesse.
Il faudrait exploiter la piste des coordonnées X,Y dont fait référence Métalion.
Voici une vidéo du rendu Basic avec gestion des collisions "Ennemis/Tirs".
http://youtu.be/W9bi3DzVSBs
J'ai vraiment essayé un grand nombre de possibilités ces deux derniers jours, mais la méthode n'est pas la bonne
En réalité, le programme ci dessous désactive la COLLISION de tout l'ensemble. avec XOR32.
La seconde partie du programme active des "Nouveaux sprites" dans un mouvement de continuité des animations des sprites dont la collision a été désactivé.
L'illusion donne l'impression que les SPRITES qui ne se détruisent plus entre eux sont sensibles au TIRS
Ca reste quand même beaucoup de travail pour un résulta très limité.
Cette piste pourrait être envisageable si l'on pouvait réactiver la COLLISION selon les SPRITES de son choix au coup par coup et à l'unité!
Si vous avez une méthode pour optimiser les lignes 830 à 870, je suis tout ouïe
Métalion...T'aurais pas une ébauche d'exemple pour la méthode dont tu parles au début stp
J'ai essayé de tirer le maximum avec mes moyens limités et voila ce que ça donne:
Le rendu est très limité et le possibilités restreignent encore plus la vitesse.
Il faudrait exploiter la piste des coordonnées X,Y dont fait référence Métalion.
Voici une vidéo du rendu Basic avec gestion des collisions "Ennemis/Tirs".
http://youtu.be/W9bi3DzVSBs
J'ai vraiment essayé un grand nombre de possibilités ces deux derniers jours, mais la méthode n'est pas la bonne
En réalité, le programme ci dessous désactive la COLLISION de tout l'ensemble. avec XOR32.
La seconde partie du programme active des "Nouveaux sprites" dans un mouvement de continuité des animations des sprites dont la collision a été désactivé.
L'illusion donne l'impression que les SPRITES qui ne se détruisent plus entre eux sont sensibles au TIRS
Ca reste quand même beaucoup de travail pour un résulta très limité.
Cette piste pourrait être envisageable si l'on pouvait réactiver la COLLISION selon les SPRITES de son choix au coup par coup et à l'unité!
Code TEXT :
10 'save"sprite.asc",a 20 SCREEN5,1:VDP(10)=0:DEFINTA-Z:BLOAD"winnie.sc5",S:COLOR=RESTORE 100 ' les variables moteur 110 X=100:Y=100 120 A=15:B=1 130 C=10:D=11:E=12:F=13 140 N=10:O=11:P=12:Q=13 150 FORZ=&H7800TO&H781F:VPOKEZ,255:NEXTZ:ONSPRITEGOSUB900 500 ONSPRITEGOSUB900:SPRITEON 510 X=X-4:IFX<1THENX=0 520 VDP(27)=VDP(27)+1AND255 530 A=AXOR32:PUTSPRITE0,(X,Y),A,0:A=AXOR32:PUTSPRITE1,(X+50,Y),0,0 540 C=CXOR32:PUTSPRITE10,(-X+VDP(27),X-VDP(27)),C,0:C=CXOR32 550 D=DXOR32:PUTSPRITE11,(-X-VDP(27),-Y),D,0:D=DXOR32 560 E=EXOR32:PUTSPRITE12,(-Y,X-VDP(27)),E,0:E=EXOR32 570 F=FXOR32:PUTSPRITE13,(X+Y,VDP(27)),F,0:F=FXOR32 800 IFSTRIG(0)THEN820 810 S=STICK(0):ONS+1GOTO510,1010,2010,3010,4010,5010,6010,7010,8010 820 PUTSPRITE1,(X+50,Y),1,0:VDP(27)=VDP(27)+1AND255 830 PUTSPRITE20,(-X+VDP(27),X-VDP(27)),10,0:PUTSPRITE20,(-X+VDP(27),X-VDP(27)),0,0 840 PUTSPRITE21,(-X-VDP(27),-Y),11,0:PUTSPRITE21,(-X-VDP(27),-Y),0,0 855 PUTSPRITE22,(-Y,X-VDP(27)),12,0:PUTSPRITE22,(-Y,X-VDP(27)),0,0 870 PUTSPRITE23,(X+Y,VDP(27)),13,0:PUTSPRITE23,(X+Y,VDP(27)),0,0 880 GOTO 810 900 SCREEN0:PRINT"collision 910 END 1000 ' haut 1010 X=X-1:IFX<1THENX=0 1020 Y=Y-8:IFY<-7THENY=-7:VDP(24)=VDP(24)+1 1030 VDP(24)=VDP(24)-1AND255:GOTO520 1040 ' 1050 ' 1060 ' 1070 ' 2000 'haut/droite 2010 X=X+4:IFX>200THENX=196 2020 Y=Y-8:IFY<-5THENY=-7:VDP(24)=VDP(24)+1 2030 VDP(24)=VDP(24)-1AND255:GOTO520 2040 ' 2050 ' 2060 ' 2070 ' 3000 'droite 3010 X=X+4:IFX>200THENX=196 3020 GOTO 520 3040 ' 3050 ' 3060 ' 3070 ' 4000 'droite/bas 4010 X=X+4:IFX>200THENX=196 4020 Y=Y+8:IFY>189THENY=190:VDP(24)=VDP(24)-1 4040 VDP(24)=VDP(24)+1AND255:GOTO520 4050 ' 4060 ' 4070 ' 5000 'bas 5010 X=X-1:IFX<1THENX=0 5020 Y=Y+6:IFY>189THENY=190:VDP(24)=VDP(24)-1 5040 VDP(24)=VDP(24)+1AND255:GOTO520 5050 ' 5060 ' 5070 ' 6000 'bas/gauche 6010 X=X-4:IFX<1THENX=0 6020 Y=Y+6:IFY>189THENY=190:VDP(24)=VDP(24)-1 6040 VDP(24)=VDP(24)+1AND255:GOTO520 6050 ' 6060 ' 6070 ' 7000 'gauche 7010 X=X-6:IFX<1THENX=0 7020 GOTO520 7040 ' 7050 ' 7060 ' 7070 ' 8000 'gauche/haut 8010 X=X-4:IFX<1THENX=0 8020 Y=Y-6:IFY<-6THENY=-7:VDP(24)=VDP(24)+1 8040 VDP(24)=VDP(24)-1AND255:GOTO520 8050 ' 8060 ' 8070 '
Si vous avez une méthode pour optimiser les lignes 830 à 870, je suis tout ouïe
Métalion...T'aurais pas une ébauche d'exemple pour la méthode dont tu parles au début stp
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie