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
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
@ Eric: Il est cool ton scrolling.
Peut être une solution le XBASIC
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
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
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 :
Edité par
igal
Le 08/02/2014 à 11h26
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-------------------
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
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
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
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
igal
Membre non connecté
Conseiller Municipal
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
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 Edité par igal Le 08/02/2014 à 15h25
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
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 Edité par igal Le 08/02/2014 à 15h25
ericb59
Membre non connecté
Conseiller Municipal
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
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
ericb59
Membre non connecté
Conseiller Municipal
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.
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.
igal
Membre non connecté
Conseiller Municipal
Maggoo :
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 :-)
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 ...
VDP(27)=VDP(27)+1AND255
et bien ça fait des sauts de 8 pixels ...
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 )
ericb59
Membre non connecté
Conseiller Municipal
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.
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.
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
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)
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
Merci à tous pour ces précisions
@EricB59: tu as tout à fait raison sur la praticité de SET SCROOL
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
@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:
Merci de vôtre aide Edité par igal Le 09/02/2014 à 12h13
@EricB59: tu as tout à fait raison sur la praticité de SET SCROOL
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
@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 Edité par igal Le 09/02/2014 à 12h13
ericb59
Membre non connecté
Conseiller Municipal
igal :
@EricB59: tu as tout à fait raison sur la praticité de SET SCROOL
Le fait est que j'utilise la valeur de VDP(27) pour le déplacement "pseudo aléatoire" des ennemis.
@EricB59: tu as tout à fait raison sur la praticité de SET SCROOL
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
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
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
igal
Membre non connecté
Conseiller Municipal
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
Si vous avez une autre idée Edité par igal Le 09/02/2014 à 15h09
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
Si vous avez une autre idée Edité par igal Le 09/02/2014 à 15h09
ericb59
Membre non connecté
Conseiller Municipal
- 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....
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....
Je vais le mettre en GRAS comme ça peut être que vous le verrez cette fois-ci ...
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
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