MSX Village forum

La Place des Développeurs [RESOLU] VDP(27) le Scrolling hardware Horizontal Comment alimenter de nouveaux décors VDP (27)?

igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 08/02/2014 à 11h25

Reprise du message précédent

@Jipe: Pas mal la combine pour remplir de graphisme le BAS de l'écran (c'est de l'Overscan MSX ?)
Pour le moment, j'ai juste plaqué n'importe quoi, mais par la suite, j'attaquerai la partie graphique pure :D

@ Eric: Il est cool ton scrolling. :top
Peut être une solution le XBASIC :moue
Dommage que VDP(27) ne puisse pas être utilisé tel quel.
VDP(27) me permet d'animer les ENNEMIS volants. Cela influe de façon "visiblement aléatoire" sur le déplacement horizontal de certains sprites.
VDP(24) me permet d'animer les ENNEMIS rampants. Cela influe de façon cohérente sur le déplacement vertical de tous les Sprites Rampants.

De mon coté, j'ai continué à chercher toujours avec le même moteur à savoir VDP(27)=VDP(27)+1
J'ai pu implanter 4 SPRITES (ennemis) animés et avec un comportement pseudo intelligent :oups

Dans la vidée suivante,
1) je dirige le HERO avec le SPRITE BLANC.
2) Je TIRE en multidirectionnel en MARRON CLIGNOTANT.
3) j'ai ajouté 4 ennemis INTELLIGENTS qui réagissent selon mon comportement :top

Il me reste à implanter la COLLISION du HERO contre les ENNEMIS ainsi que la destruction par mes TIRS.
Faut que je trouve un exemple simple à adapter selon mes besoins. Si vous avez une idée!


http://youtu.be/UXV-3OdZI8c

Code TEXT :
10 'DEFUSR=&HD000:A=USR(0):FORP=0TO10:NEXT:POKE&HFD9F,201:SAVE"vdp27.asc",a
20 VDP(10)=(0):WIDTH80:SCREEN5,2:COLOR 15,1,1:SETPAGE0,0:CLS:DEFINTA-Z
30 '
40 '            Chargement ecran des niveaux en page 3
50 '
60 SETPAGE0,3:BLOAD"fondw.sc5",S
70 '
80 '            Chargement ecran des "sprites" en page 2
90 '
100 SETPAGE0,1:BLOAD"winnie.sc5",S
110 COLOR=RESTORE
120 '
130 ' -----------INSERTION DES MUSIQUES ET SONS----------
140 GOTO 1530
150 'DEFUSR=&HD000:A=USR(0):'STOP LA MUSIQUE
160 DEFUSR=&HD000:A=USR(0):POKE&HCFFF,30:A=USR2(0):' MUSIQUE STAGE 6
170 '
180 '            Cr‚ation d'un sprite pour masque en page 0
190 '
200 SETPAGE0,0
210 FORI=&H7800TO&H781F:VPOKEI,255:NEXTI
220 'PUTSPRITE0,(100,100),7,0
230 '
240 '            Initialisation des varibles
250 '
260 V=3
270 C=0:X=100:Y=80:D=52:A=0:N=1:M=0
280 '
290 '              Mise en place d‚cors
300 '
310 GOSUB 1440
320 COPY(0,161)-(255,199),0TO(0,192),0:' Overscan
330 '
340 '              Sprites ennemis statiques
350 '
360 'ONSPRITEGOSUB1090
370 'PUTSPRITE5,(150,100),1,0:PUTSPRITE6,(180,75),1,0:PUTSPRITE7,(180,125),1,0
380 'PUTSPRITE8,(200,150),1,0:PUTSPRITE9,(200,50),1,0:putsprite10,(100,100),1,0
390 'SPRITE ON
400 '
410 '              Boucle du moteur principale
420 '
430 S=STICK(0):ONS+1GOSUB510,570,640,710,770,840,910,980,1040
440 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X,X),9,0
450 PUTSPRITE3,(-X,-Y),15,0:PUTSPRITE4,(-Y,X),8,0:PUTSPRITE5,(VDP(27),X),1,0
460 GOTO 430
470 '
480 '
490 '              SP gestion mouvement: STATIQUE
500 '
510 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),3,0
520 IFX<1THENX=0:'N=N-1:GOSUB1380
530 VDP(27)=VDP(27)+1AND255:X=X-1:RETURN
540 '
550 '              SP gestion mouvement: HAUT
560 '
570 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X,Y-50),3,0
580 IFY<-6THENY=-7:VDP(24)=VDP(24)+1
590 IFX<1THENX=0:'N=N-1:GOSUB1380
600 VDP(24)=VDP(24)-1AND255:Y=Y-6:X=X-1:VDP(27)=VDP(27)+1AND255:RETURN
610 '
620 '              SP gestion mouvement: HAUT/DROITE
630 '
640 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y-50),3,0
650 IFY<-6THENY=-7:VDP(24)=VDP(24)+1
660 IFX>200THENX=196:N=N+1:GOSUB1400
670 VDP(24)=VDP(24)-1AND255:Y=Y-6:X=X+4:VDP(27)=VDP(27)+1AND255:RETURN
680 '
690 '              SP gestion mouvement: DROITE
700 '
710 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),3,0
720 IFX>200THENX=196:N=N+1:GOSUB1400
730 VDP(27)=VDP(27)+1AND255:X=X+4:RETURN
740 '
750 '              SP gestion mouvement: DROITE/BAS
760 '
770 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y+50),3,0
780 IFY>189THENY=190:VDP(24)=VDP(24)-1
790 IFX>200THENX=196:N=N+1:GOSUB1400
800 VDP(24)=VDP(24)+1AND255:Y=Y+6:X=X+4:VDP(27)=VDP(27)+1AND255:RETURN
810 '
820 '              SP gestion mouvement: BAS
830 '
840 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X,Y+50),3,0
850 IFY>189THENY=190:VDP(24)=VDP(24)-1
860 IFX<1THENX=0:'N=N-1:GOSUB1380
870 VDP(24)=VDP(24)+1AND255:Y=Y+6:X=X-1:VDP(27)=VDP(27)+1AND255:RETURN
880 '
890 '              SP gestion mouvement: BAS/GAUCHE
900 '
910 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X-50,Y+50),3,0:'THEND=0
920 IFY>189THENY=190:VDP(24)=VDP(24)-1
930 IFX<1THENX=0:'N=N-1:GOSUB1380
940 VDP(24)=VDP(24)+1AND255:Y=Y+6:X=X-4:VDP(27)=VDP(27)+1AND255:RETURN
950 '
960 '              SP gestion mouvement: GAUCHE
970 '
980 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X-50,Y),3,0:'THEND=0
990 IFX<1THENX=0:'N=N-1:GOSUB1380
1000 VDP(27)=VDP(27)+1AND255:X=X-6:RETURN
1010 '
1020 '              SP gestion mouvement: GAUCHE/HAUT
1030 '
1040 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y+50),3,0:'THEND=0
1050 IFY<-6THENY=-7:VDP(24)=VDP(24)+1
1060 IFX<1THENX=0:'N=N-1:GOSUB1380
1070 VDP(24)=VDP(24)-1AND255:Y=Y-6:X=X-4:VDP(27)=VDP(27)+1AND255:RETURN
1080 '
1090 '                Collisions
1100 '
1110 IF P=10THEN1260  ' si trou -> SP tombe
1120 COPY(X,Y)-(X+34,Y+50),2TO(0,0),3
1130 COPY(D,A)-(D+25,A+37),1TO(4,4),3,TPSET
1140 COPY(0,0)-(34,50),3TO(X,Y),0
1150 POKE&HFD9F,201
1160 PSET(INT((X+15)/16),202+INT((Y+4)/16)),15:B=P*6:F=P*5
1170 COPY(240,191)-(255,206),1TO((INT((X+15)/16))*16,(INT((Y+36)/16))*16),2
1180 COPY(208,P*16-112)-(223,P*16-97),1TO(C*16+32,196),0
1190 POKE&HFD9F,201:POKE&HFDA0,&H6:POKE&HFDA1,&HD0:POKE&HFD9F,&HC3
1200 POKE&HCFFF,82:A=USR2(0)
1210 C=C+1
1220 GOTO 430
1230 '
1240 '              SP chute dans le trou
1250 '
1260 FORI=0TO36STEP2
1270 COPY(X,Y)-(X+34,Y+50),2TO(0,0),3
1280 COPY(D,A)-(D+25,A+37-I),1TO(4,4+I),3,TPSET
1290 COPY(0,0)-(34,50),3TO(X,Y),0
1300 A=A+38:IFA=190THENA=38
1310 B=I+40:POKE&HCFFF,70:A=USR2(0)
1320 IFPLAY(0)=-1THEN1320
1330 NEXT
1340 M=0:N=0
1350 LINE(32,196)-(255,212),1,BF
1360 V=V-1:IFV=0THEN1380
1370 GOTO 270
1380 SCREEN0:PRINT"                GAME OVER
1390 GOTO1390  
1400 '
1410 '              SP Mise en place du d‚cor
1420 '
1430 COPY(0,200)-(15,211),0TO(M*16,200),3
1440 COPY(N*16,200)-(15+N*16,211),3TO(0,200),0
1450 POKE&HCFFF,69:A=USR2(0)
1460 FORI=0TO15:FORJ=0TO11:P=POINT(I,J+200):COPY(P*16,191)-(15+P*16,206),1TO(I*16,J*16),0
1470 NEXTJ:NEXTI
1480 COPY(0,0)-(256,192),0TO(0,0),2
1490 M=N
1500 'BEEP
1510 RETURN
1520 GOTO 1520
1530 '---------DEBUT DE SALAMANDER DEMO MODIFIE----------------
1540 'POKE&HFBB1,1: 'EMPECHE CONTROL+STOP
1550 BLOAD"1.006":DEFUSR4=&HD600:' CHARGE LE PLAYER ?
1560 BLOAD"1.007":U=USR4(1):' CHARGE SONS ET MUSIQUES
1570 BLOAD"1.008":U=USR4(2):' CHARGE SONS ET MUSIQUES
1580 BLOAD"1.009":U=USR4(3):' CHARGE SONS ET MUSIQUES
1590 BLOAD"1.010":U=USR4(4):' CHARGE SONS ET MUSIQUES
1600 BLOAD"1.011":FORT=0TO2000:NEXT
1610 DEFUSR=&HD000:A=USR(0): 'PREREQUIS ARRET LA MUSIQUE
1620 DEFUSR2=&HD003:' PREREQUIS FONCTION INCONNUE
1630 POKE&HFD9F,201
1640 POKE&HFDA0,&H6:POKE&HFDA1,&HD0:POKE&HFD9F,&HC3
1650 ' LISTE COMPLETE DES MUSIQUES ET SONS DANS POKE SALAMANDER
1660 '
1670 DEFUSR=&HD000:A=USR(0):POKE&HCFFF,32:A=USR2(0):' MUSIQUE STAGE 6
1680 'POKE&HCFFF,67:A=USR2(0):' EXPLOSION D'ENNEMI MOYENNE
1690 '
1700 'DEFUSR=&HD000:A=USR(0):FORP=0TO10:NEXT:POKE&HFD9F,201:'PERMET ACCES DISK MAIS ARRETER MUSIQUE AVANT
1710 GOTO 150:' RETOUR A L ANIMATION
1720 '
1730 '---------FIN DE SALAMANDER DEMO MODIFIE-------------------

Edité par igal Le 08/02/2014 à 11h26


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10337

Le 08/02/2014 à 11h35
je vois que tu as plein de collision sans effets apparents

il faut initialiser les collisions

10 ON SPRITE GOSUB 1000
20 SPRITE ON

si on veux couper

100 SPRITE OFF

1000 programme ex: explosion
1010 return


:noel
Site web    
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10337

Le 08/02/2014 à 11h48
pour oter le doute de j'y passe j'y passe pas

voici une astuce que j'utilise pour "debugger mes programmes"

dans le programme d'avant intercale

1005 END

si le programme rend la main c'est que l'on est bien rentré dans la sous routine des collisions


:noel
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5485

Le 08/02/2014 à 12h43
Pourquoi tu t'acharnes avec les VDP(27) etc...
le set scroll fait mieux :hum Edité par ericb59 Le 08/02/2014 à 12h43


banniere-ericb59e
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 08/02/2014 à 14h24
SET SCROLL semble nécessiter l'utilisation de XBASIC pour ne pas être atrocement long.

Avec le XBASIC, c'est propre mais trop long pour un Shoot them up. Par contre, ça semble être parfait pour un jeu d'aventure comme Zelda :top

En plus, XBASIC devant être préchargé en mémoire, la bande SON Salamander ne peut pas fonctionner.

Je pense que le problème doit se poser avec beaucoup de chargeur audio qui vont se chevaucher avec le Xbasic.

Je continue à chercher à tâtons, on sait jamais :moue Edité par igal Le 08/02/2014 à 15h25


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 08/02/2014 à 16h13
non, tu te trompes.
Set scroll NE PEUX PAS être utilisé avec xbasic.

La routine que j'ai mise dans bloc turbo (xbasic) c'est l'instruction COPY pour afficher la suite du level... Tu peux enlever les instructions turbo pour voir si c'est beaucoup plus lent ou pas...

Tu peux remplacer le set scroll par ton instruction vdp si tu veux, mais dans ce tu n'auras pas les caches sur les bords d'ecran.


Pour faire un scroll plus rapide, il faut faire scroller plus de pixels à la fois. Edité par ericb59 Le 08/02/2014 à 16h14


banniere-ericb59e
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5485

Le 08/02/2014 à 16h56
tous les scrolls que tu as présenté ici en video ne sont pas des scroll à 1 pixel.
Là où tu as mis VDP(27)=VDP(27)+1AND255
ca fait un saut de 8 pixels
quand tu mets VDP(27)=VDP(27)+2AND255
ca faut un saut de 16 pixels...

Rajoute par exemple une ligne dans la boucle principale avec ça dedans : k$=input$(1)
pour mieux te rendre compte, tu devras appuyer sur une touche de clavier pour chaque boucle, tu verras que ça ne fait pas un scroll de 1 pixel comme tu le crois.


banniere-ericb59e
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 08/02/2014 à 20h22
Maggoo :
ericb59 :
Dans le code que je t'ai mis plus haut j'ai mis :

VDP(27)=VDP(27)+1AND255



et bien ça fait des sauts de 8 pixels ... :hum




C'est normal parce que le registre 26 (VDP(27) en basic) ne stocke que 6 des 9 bits utlise pour le scroll horizontal. Les 3 autres bits sont dans le registre 27 (VDP(28) en basic)



Voir http://primrosebank.net/computers/mtx/projects/mtxplus/V9958-Technical-manual_v1.0.pdf



Donc mieux vaut utiliser la fonctione set scroll ou mettre les 2 registres a jour via:



x=x+1 and 255

vdp(27)=x/8:vdp(28)=(x and 7)



CQFD :-)




Salut Magoo.



J'ai pas pu appliquer ta commande avec succès.



Voici ce que cela donne.



http://youtu.be/QMDh3d8KxWQ



J'ai l'impression qu'il faut soustraire X/8 à VDP(27) et non l'incrémenter!



J'ai essayé avec une vériable spécifique pour VDP27 telle que: Z=Z-1and255 ensuite j'ai appliqué cette valeur à VDP27 telle que => VDP(27)=z/8

Comme je l'ai pensé, le SCROOL parait bon cependant, j'arrive pas à synchroniser VDP27 et VDP28 de sorte à ce que VDP27 soit sollicité tous les 1/8 de VDP28!

Soit il est actionné 1 pixel trop tot, soit 1 pixel trop tard!



voici le résultat en appliquant une soustraction Z/8 à VDP(27)



http://youtu.be/qva1KPxaShk



@Eric, t'es arrivé à appliqué la formule de Magoo telle qu'il la donné? (pas de SET SCROOL :p )


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 08/02/2014 à 20h36
je pense que pour appliquer ce que dit magoo il faut calculer et envoyer les données sur les registres vdp en binaire.

de toute facon ca n'a pas grand intéret, car le scroll à 1 pixel fait avec cette methode ne sera pas plus,rapide qu'avec Set scroll.



banniere-ericb59e
Site web    
z80 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 17/05/2013 à 22h52

Messages: 956

Le 08/02/2014 à 21h40
De mémoire tu dois avoir une variable qui est la coordonnée X de ton scrolling. Disons qu'elle s'appelle X.
VDP(27) = X/8: VDP(28)= X and 7
Est identique a:
setscroll X


TurboR GT (1Mo), CANON V20! ( en kit, modif 2+ en cours) :top
Pas encore retrouvés: V9990, Grafx9000, SUNRISE IDE 2x CF, SUNRISE MOONSOUND, FM PAC, MUSIC MODULE, NMS8280, SD SNATCHER,... :\'(
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 09/02/2014 à 11h50
Merci à tous pour ces précisions :top

@EricB59: tu as tout à fait raison sur la praticité de SET SCROOL :top

Le fait est que j'utilise la valeur de VDP(27) pour le déplacement "pseudo aléatoire" des ennemis.

A ce sujet, j'ai fait fondre mon cerveau à comprendre le fonctionnement des SPRITES :fou

@Jipe: J'ai repris le fonctionnement tel que tu l'a décris plus haut à savoir:
10 ON SPRITE GOSUB 1000
15 SPRITE ON
20 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:' Le SPRITE 0 est le HERO en couleur 11et le SPRITE 1 est le TIR en couleur 0.
30 PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0: PUTSPRITE3,(-X-VDP(27),-Y),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0: 'Les SPRITES 2, 3 , 4 et 5 sont les vaisseaux ennemis qui se déplacent pseudo aléatoirement et donc se croisent par moment!
100 SPRITE OFF
1000 END:' Doit être remplacé par un programme d'explosions etc...
1010 RETURN

Mon problème actuel, c'est que TOUT se "collisionne" instantanément et je peux donc pas jouer!

Ma question est double puisque Concrètement:
1) Comment faire pour que seules les COLLISIONS entre mon HERO et les VAISSEAUX mène à un sous programme => Explosion HERO!
2) Comment faire pour que la COLLISION de mon TIR contre les VAISSEAUX mène à un sous programme => Explosion ENNEMIS!

Voici le Listing Actuel:
Code TEXT :
 
10 'DEFUSR=&HD000:A=USR(0):FORP=0TO10:NEXT:POKE&HFD9F,201:SAVE"vdp27.asc",a
20 VDP(10)=(0):WIDTH80:SCREEN5,2:COLOR 15,1,1:SETPAGE0,0:CLS:DEFINTA-Z
30 '
40 '            Chargement ecran des niveaux en page 3
50 '
60 SETPAGE0,3:BLOAD"fondw.sc5",S
70 '
80 '            Chargement ecran des "sprites" en page 2
90 '
100 SETPAGE0,1:BLOAD"winnie.sc5",S
110 COLOR=RESTORE
120 '
130 ' -----------INSERTION DES MUSIQUES ET SONS----------
140 GOTO 1790
150 'DEFUSR=&HD000:A=USR(0):'STOP LA MUSIQUE
160 DEFUSR=&HD000:A=USR(0):POKE&HCFFF,30:A=USR2(0):' MUSIQUE STAGE 6
170 '
180 '            Cr‚ation d'un sprite pour masque en page 0
190 '
200 SETPAGE0,0
210 FORI=&H7800TO&H781F:VPOKEI,255:NEXTI
220 'PUTSPRITE0,(100,100),7,0
230 '
240 '            Initialisation des varibles
250 '
260 V=3
270 C=0:X=100:Y=80:D=52:A=0:N=1:M=0
280 '
290 '              Mise en place d‚cors
300 '
310 GOSUB 1700
320 COPY(0,0)-(255,31),0TO(0,192),0:' Overscan
330 '
340 '              Sprites ennemis statiques
350 '
360 'ONSPRITEGOSUB1090
370 'PUTSPRITE6,(150,100),3,0:PUTSPRITE7,(180,75),3,0:PUTSPRITE8,(180,125),3,0
380 'PUTSPRITE9,(200,150),3,0:PUTSPRITE10,(200,50),3,0:PUTSPRITE11,(100,100),3,0
390 'SPRITE ON
400 '
410 '              Boucle du moteur principale inutile
420 '
430 'S=STICK(0):ONS+1GOTO510,570,640,710,770,840,910,980,1040:GOTO430
440 '
450 '
460 '              SP gestion mouvement: STATIQUE
470 '
480 '
490 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
500 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
510 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
520 IFX<1THENX=0
530 VDP(27)=VDP(27)+1AND255:X=X-4
540 'K$=INPUT$(1)
550 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO490
560 '
570 '              SP gestion mouvement: HAUT
580 '
590 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
600 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
610 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
620 IFY<-6THENY=-7:VDP(24)=VDP(24)+1
630 IFX<1THENX=0:'N=N-1:GOSUB1380
640 VDP(24)=VDP(24)-1AND255:Y=Y-6:X=X-1:VDP(27)=VDP(27)+1AND255
650 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO590
660 '
670 '              SP gestion mouvement: HAUT/DROITE
680 '
690 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
700 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
710 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
720 IFY<-6THENY=-7:VDP(24)=VDP(24)+1
730 IFX>200THENX=196:N=N+1:GOSUB1660
740 VDP(24)=VDP(24)-1AND255:Y=Y-6:X=X+4:VDP(27)=VDP(27)+1AND255
750 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO690
760 '
770 '              SP gestion mouvement: DROITE
780 '
790 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
800 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
810 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
820 IFX>200THENX=196:N=N+1:GOSUB1660
830 VDP(27)=VDP(27)+1AND255:X=X+4
840 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO790
850 '
855 '
860 '              SP gestion mouvement: DROITE/BAS
870 '
880 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
890 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
900 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
910 IFY>189THENY=190:VDP(24)=VDP(24)-1
920 IFX>200THENX=196:N=N+1:GOSUB1660
930 VDP(24)=VDP(24)+1AND255:Y=Y+6:X=X+4:VDP(27)=VDP(27)+1AND255
940 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO880
950 '
960 '              SP gestion mouvement: BAS
970 '
980 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
990 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
1000 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
1010 IFY>189THENY=190:VDP(24)=VDP(24)-1
1020 IFX<1THENX=0:'N=N-1:GOSUB1380
1030 VDP(24)=VDP(24)+1AND255:Y=Y+6:X=X-1:VDP(27)=VDP(27)+1AND255
1040 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO980
1050 '
1060 '              SP gestion mouvement: BAS/GAUCHE
1070 '
1080 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
1090 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
1100 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
1110 IFY>189THENY=190:VDP(24)=VDP(24)-1
1120 IFX<1THENX=0:'N=N-1:GOSUB1380
1130 VDP(24)=VDP(24)+1AND255:Y=Y+6:X=X-4:VDP(27)=VDP(27)+1AND255
1140 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO1080
1150 '
1160 '              SP gestion mouvement: GAUCHE
1170 '
1180 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
1190 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
1200 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
1210 IFX<1THENX=0:'N=N-1:GOSUB1380
1220 VDP(27)=VDP(27)+1AND255:X=X-6
1230 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO1180
1240 '
1250 '              SP gestion mouvement: GAUCHE/HAUT
1260 '
1270 IFSTRIG(0)THENPOKE&HCFFF,11:A=USR2(0):PUTSPRITE1,(X+50,Y),11,0
1280 PUTSPRITE0,(X,Y),11,0:PUTSPRITE1,(X,Y),0,0:PUTSPRITE2,(-X+VDP(27),X-VDP(27)),9,0
1290 PUTSPRITE3,(-X-VDP(27),-VDP(27)),15,0:PUTSPRITE4,(-Y,X-VDP(27)),8,0:PUTSPRITE5,(X+Y,VDP(27)),6,0
1300 IFY<-6THENY=-7:VDP(24)=VDP(24)+1
1310 IFX<1THENX=0:'N=N-1:GOSUB1380
1320 VDP(24)=VDP(24)-1AND255:Y=Y-6:X=X-4:VDP(27)=VDP(27)+1AND255
1330 S=STICK(0):ONS+1GOTO490,590,690,790,880,980,1080,1180,1270:GOTO1270
1340 '
1350 '                Collisions
1360 '
1370 IF P=10THEN1520  ' si trou -> SP tombe
1380 COPY(X,Y)-(X+34,Y+50),2TO(0,0),3
1390 COPY(D,A)-(D+25,A+37),1TO(4,4),3,TPSET
1400 COPY(0,0)-(34,50),3TO(X,Y),0
1410 POKE&HFD9F,201
1420 PSET(INT((X+15)/16),202+INT((Y+4)/16)),15:B=P*6:F=P*5
1430 COPY(240,191)-(255,206),1TO((INT((X+15)/16))*16,(INT((Y+36)/16))*16),2
1440 COPY(208,P*16-112)-(223,P*16-97),1TO(C*16+32,196),0
1450 POKE&HFD9F,201:POKE&HFDA0,&H6:POKE&HFDA1,&HD0:POKE&HFD9F,&HC3
1460 POKE&HCFFF,82:A=USR2(0)
1470 C=C+1
1480 GOTO 430
1490 '
1500 '              SP chute dans le trou
1510 '
1520 FORI=0TO36STEP2
1530 COPY(X,Y)-(X+34,Y+50),2TO(0,0),3
1540 COPY(D,A)-(D+25,A+37-I),1TO(4,4+I),3,TPSET
1550 COPY(0,0)-(34,50),3TO(X,Y),0
1560 A=A+38:IFA=190THENA=38
1570 B=I+40:POKE&HCFFF,70:A=USR2(0)
1580 IFPLAY(0)=-1THEN1580
1590 NEXT
1600 M=0:N=0
1610 LINE(32,196)-(255,212),1,BF
1620 V=V-1:IFV=0THEN1640
1630 GOTO 270
1640 SCREEN0:PRINT"                GAME OVER
1650 GOTO1650  
1660 '
1670 '              SP Mise en place du d‚cor
1680 '
1690 COPY(0,200)-(15,211),0TO(M*16,200),3
1700 COPY(N*16,200)-(15+N*16,211),3TO(0,200),0
1710 POKE&HCFFF,69:A=USR2(0)
1720 FORI=0TO15:FORJ=0TO11:P=POINT(I,J+200):COPY(P*16,191)-(15+P*16,206),1TO(I*16,J*16),0
1730 NEXTJ:NEXTI
1740 COPY(0,0)-(256,192),0TO(0,0),2
1750 M=N
1760 'BEEP
1770 RETURN
1780 GOTO 1780
1790 '---------DEBUT DE SALAMANDER DEMO MODIFIE----------------
1800 'POKE&HFBB1,1: 'EMPECHE CONTROL+STOP
1810 BLOAD"1.006":DEFUSR4=&HD600:' CHARGE LE PLAYER ?
1820 BLOAD"1.007":U=USR4(1):' CHARGE SONS ET MUSIQUES
1830 BLOAD"1.008":U=USR4(2):' CHARGE SONS ET MUSIQUES
1840 BLOAD"1.009":U=USR4(3):' CHARGE SONS ET MUSIQUES
1850 BLOAD"1.010":U=USR4(4):' CHARGE SONS ET MUSIQUES
1860 BLOAD"1.011":FORT=0TO2000:NEXT
1870 DEFUSR=&HD000:A=USR(0): 'PREREQUIS ARRET LA MUSIQUE
1880 DEFUSR2=&HD003:' PREREQUIS FONCTION INCONNUE
1890 POKE&HFD9F,201
1900 POKE&HFDA0,&H6:POKE&HFDA1,&HD0:POKE&HFD9F,&HC3
1910 ' LISTE COMPLETE DES MUSIQUES ET SONS DANS POKE SALAMANDER
1920 '
1930 DEFUSR=&HD000:A=USR(0):POKE&HCFFF,32:A=USR2(0):' MUSIQUE STAGE 6
1940 'POKE&HCFFF,67:A=USR2(0):' EXPLOSION D'ENNEMI MOYENNE
1950 '
1960 'DEFUSR=&HD000:A=USR(0):FORP=0TO10:NEXT:POKE&HFD9F,201:'PERMET ACCES DISK MAIS ARRETER MUSIQUE AVANT
1970 GOTO 150:' RETOUR A L ANIMATION
1980 '
1990 '---------FIN DE SALAMANDER DEMO MODIFIE-------------------




Merci de vôtre aide :oups Edité par igal Le 09/02/2014 à 12h13


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10337

Le 09/02/2014 à 11h57
en fait dans le gosub c'est toi qui détermine si les coordonnées de ton vaisseau sont sur une zone de coordonnée d'ennemi et les autres ne sont pas traités


:noel
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5485

Le 09/02/2014 à 12h03
igal :




@EricB59: tu as tout à fait raison sur la praticité de SET SCROOL :top



Le fait est que j'utilise la valeur de VDP(27) pour le déplacement "pseudo aléatoire" des ennemis.







La Valeur de VDP(27) que tu utilise pour tes sprites est une valeur comprise en 0 et 255.

Cette valeur n'est pas spécifique à VDP(27)



x=x+1AND255:SET SCROLL x,0,0,0



X varie entre 0 et 25. C'est la même chose que ton VDp(27). Tu peux donc aussi utiliser cette variable X pour tes sprites.





igal :


Mon problème actuel, c'est que TOUT se "collisionne" instantanément et je peux donc pas jouer!



Ma question est double puisque Concrètement:

1) Comment faire pour que seules les COLLISIONS entre mon HERO et les VAISSEAUX mène à un sous programme => Explosion HERO!

2) Comment faire pour que la COLLISION de mon TIR contre les VAISSEAUX mène à un sous programme => Explosion ENNEMIS!



Merci de vôtre aide :oups






En Basic tu n'as aucun moyen (à ma connaissance) de connaitre quels sont les sprites qui sont entré en collision (C'est nul je sais :@ ) !

Tu sais juste que des Sprite se chevauchent c'est tout...



Tu peux eventuellement définir 1 ou plusieurs sprites qui sont EXCLUS de la routine de collision.



Sinon, pour déterminer qui est entré en collision, il faut repérer les coordonnées de chaque sprite et extrapoler pour déterminer qui est qui ! Edité par ericb59 Le 09/02/2014 à 12h03


banniere-ericb59e
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 09/02/2014 à 15h01
J'ai trouvé une solution bancale (comme d'habitude):

En fait, il faut remplir 2 conditions pour une collision:

1) Le SPRITE doit être NON transparent.
2) Le SPRITE doit toucher un autre SPRITE.

La solution 1 consiste à attribuer la couleur ZERO aux SPRITES que l'on souhaite empêcher d'entrer en COLLISION (entre eux).
Pb: Soit ZERO est transparent et donc les ennemis sont invisible ce qui est sert à rien, ou alors, on COLORISE la couleur ZERO pour la rendre visible!
Le problème c'est que les SPRITES colorisés en ZERO auraient tous la même couleurs à savoir tous BLANC, tous BLEU etc etc...
En plus de quoi, vous pourrez pas le détruire avec votre TIR ni en COLLISION avec le HERO...Donc mauvaise solution!

La solution 2 consiste à empêcher la coexistence simultanée de plus d'un ennemi.
Il suffit pour cela d'attribuer le même identifiant à chaque SPRITE ennemi de sorte à ce que de facto, ils ne peuvent JAMAIS entrer en COLLISION entre eux.
L'avantage est qu'il peuvent quand même entrer en COLLISION avec le HERO en lui attribuant un identifiant autre!

Chaque SPRITE à est identifié par un chiffre tel que => PUTSPRITE identifiant,(Longitude,Latitude),Couleur,Je sais pas quoi

On se retrouve avec la commande suivante:

10 ON SPRITE GOSUB 1000
20 SPRITE ON
30 PUTSPRITE 0,(X,Y),11,0: ' il s'agit du HERO
40 PUTSPRITE 1,(X,50,Y),11,0: ' il s'agit du TIR qui reste sur la même longitude que le HERO mais décalé de 50 pixels à sa droite par X+50.
50 PUTSPRITE 2,(x+50,y+25),2,0:'il s'agit de l'ENNEMI 2 en couleur 2 et position pseudo hasardeuse
60 PUTSPRITE 2,(x-24,y+40),7,0: 'il s'agit de l'ENNEMI 2 en couleur 7 et position pseudo hasardeuse
70 PUTSPRITE 2,(x+15,y-15),4,0: 'il s'agit de l'ENNEMI 2 en couleur 4 et position pseudo hasardeuse
80 PUTSPRITE 2,(x+40,y+25),9,0: 'il s'agit de l'ENNEMI 2 en couleur 9 et position pseudo hasardeuse
90 X=x+1and255:Y=X: ' Incrémentation des Variables X et Y
100 GOTO 30: ' Retour à l'affichage du premier Sprite.
1000 END: ' fin du programme (Peut contenir le sous programme avec Explosions etc..)

L'inconvénient de cette méthode est que les SPRITES identifié en 2 sont en réalité UN seul et unique SPRITE.
Puisque ce dernier doit s'afficher à différents endroits, on obtient un effet de clignotement du à l'affichage par intermittence à chaque Longitude/Latitude Différente :oups

Si vous avez une autre idée :sick Edité par igal Le 09/02/2014 à 15h09


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 09/02/2014 à 17h05
- Tu peux créer des sprites colorés, sans détection de collision Pour cela il faut utilisé le bit B5 dans la chaine de création du sprite.
Voir par exemple le bouquin MSX-BASIC 2.0 de SONY page 172.

- Ce que tu appel "identifiant" dans ton PUT SPRITE n'est pas indentifiant, mais le numéro du plan sur lequel tu veux afficher ton sprite.
PUT SPRITE <numero de plan>,(x,y),<couleur>,<numero de motif de sprite>
Tu ne peux mettre qu'un seul sprite par Plan. C'est pour cela que tes sprites clignotent si tu mets plusieurs sprites différents sur un même plan.


Je ne sais pas si tu as remarqué comment ça se passe dans les jeux style shoot them up.

Le joueur à la maitrise totale de son sprite. Par contre les ennemis ont tous un chemin préprogrammé pour traverser l'écran.
Ce chemin tu peux le stocker sous la forme d'un tableau de coordonnées X,Y

Supposons un ennemi qui traverse l'écran de droite à gauche par saut de 2 pixels. Cela fait 256/2= 128 positions X
et autant de positions Y que tu peux stocker dans un DIM E(128,128)

Tu remplis le tableau E avec les cordonnées X,Y de ton ennemis et tu te sert de ce tableau pour l'afficher.
Avec une variable 'N' qui s'incrémente dans ta boucle principale pour déterminer où on en est du tableau...

10 DIM E(128,128)
20 ' On rempli le tableau avec des coordonnées qui sont par exemple dans des DATA
30 'boucle
40 N=n+1
50 put sprite 1,(E(n,n),E(n,n)),1,1
60 goto 40

Pour simplifier les choses, tu fais en sorte que les différents ennemis que tu veux afficher simultanément à l'écran aient des chemins qui ne se croisent pas, pour éviter
qu'ils entre en collision.

Ainsi si tu détecte une collision. Celle-ci à forcément lieu soit entre ton tir et un ennemis, soit entre toi et un ennemis.
Il te suffit alors de comparer la position X,Y du joueur, avec la position X,Y de l'ennemis pour être sur.

Y a plus qu'à programmer ça !
Sachant qu'en basic, on ne pourras pas faire en même temps des masses de tests car cela ralentit fortement les procédure....







banniere-ericb59e
Site web    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 09/02/2014 à 18h26
Je vais le mettre en GRAS comme ça peut être que vous le verrez cette fois-ci ... :s

Dans les expressions VDP(xx)=VDP(xx) + ... : "AND255" NE SERT A RIEN !!!!
1 AND 255 = 1
2 AND 255 = 2

Et d'ailleurs, n'importe quel nombre AND 255 est égal à lui-même.

A enlever donc, cela ralenti inutilement l'interprétation du BASIC.

Et je confirme ce que les autres ont déjà écrit : la seule solution pour connaitre les sprites qui sont en collision est de tester chaque coordonnées de chaque sprite pour trouver quelle paire est en collision.

Tu vas donc te heurter très rapidement (si ce n'est pas déjà fait au niveau de l'alimentation du décor) aux limites du BASIC. C'est lent, beaucoup trop lent pour ce que tu veux faire. Cela ne sert à rien de l'ignorer et d'espérer des solutions qui n'existent pas ... Un shoot'em up rapide avec double scrolling, animation intelligente des ennemis et tout le toutim, ce n'est PAS possible en BASIC, ou alors au prix de forts ralentissements. Edité par Metalion Le 09/02/2014 à 18h57


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)
   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie