MSX Village forum

La Place des Développeurs [EN COURS] SPRITES sur MSX. Mieux comprendre le SPRITE sur MSX.

igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 12/02/2014 à 00h51

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é :oups

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







Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5485

Le 12/02/2014 à 08h11
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 !



banniere-ericb59e
Site web    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 12/02/2014 à 08h34
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.

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

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 13/02/2014 à 19h28
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 :p

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 :top
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 ;)


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie