MSX Village forum

La Place des Développeurs [EN COURS] VDP Flash Pipeline Expérimentations Quelques applications sur l'approche Flash

igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 04/03/2018 à 11h19
Salut à tous.

Après avoir abouti mon projet de "scroller" [Droite <=> Gauche] une infinité de pages vidéo par le biais du VDP Flash Pipeline, j'ai voulu mettre en application la possibilité d'un "jeu" avec un déroulement à la "USAS" ou les pages sont "Remplacées" et non pas "scrollées".

Pour faire plaisir à ma fille, je suis partie sur une mappe de "Super Mario Bros" mais à mesure de mes avancées, j'ai pas pu m'empêcher de flanquer le héro de "Caveman Ninja" sur ces décors complètement décalés :fou

Voici comment se présente la chose:

La première "image Vidéo" ALPHA est plaquée en Page Visible [ZERO]


Toutes les autres "images vidéo" sont plaquées en page cachées [UN]


A partir de là, toutes les vidéos plaquées en page [UN] sont copiées en partie seulement depuis les coordonnées (0,0)-(255,171),1 TO (0,0),0
Ce qui à pour conséquence de "Copier/Coller" les graphismes du "Back Ground" en lieu et place de l'ancienne Page [ZERO].
Nb: De nombreux jeux Super Nintendo ont une approche "visuelle" similaire ce qui permet de les "imiter superficiellement" sans trop de difficultés.

Dans la vidéo ci dessous, j'ai volontairement placé les "Animations cachées en Page [UN]" pour les afficher en Page visible [ZERO].
Cela permet de visualiser ce qui se passe dans le Bloc de travail en temps réel et donc corriger plus aisément les éventuelles erreurs.

Que ce soit en chargeant une page par [Bload"image",s] ou encore par un [VDP Flash], je n'arrive pas à obtenir la transparence en pourtour du héro :(
Faudra que je trouve la solution à ce problème :(

Voici la vidéo:


Voici le Code:
Code CSS :
 
9 'SAUVEGARDE AU FORMAT ASCII
10 'save"EDEN009.asc",a
19 'Mode explicatif
20 CLS:LOCATE 10,4 : PRINT "Commencez par lancer la video de l'image Prima
30 LOCATE 10,6 : PRINT "Vous centrerez l'image avec les touches du clavier
40 LOCATE 10,8 : PRINT "Puis appuyez sur la barre d espace
50 LOCATE 10,10: PRINT "               Appuyez sur une touche pour commencer
59 'Attente d un input quelconque du clavier
60 IF INKEY$ = "" THEN60
98 'Ajustement vertical du "VDP FLASH PIPELINE
99 'Mode graphique en 256 couleurs
100 SCREEN 8
109 'Couleurs du contour d ecran en Blanc
110 COLOR,,255
119 ' Flash permettant l ajustement de la page Prima
120 COPY SCREEN
128 'Boucle d ajustement des variables pour SET ADJUST (X,Y)
129 ' ON STRIG permet de sortir de la boucle par appui sur la barre d espace
130 STRIG(0) ON : ON STRIG GOSUB 198 : SET ADJUST (X,Y) : S=STICK(0):ONS+1GOSUB 140,150,160,160,160,170,180,180,180:GOTO130
139 'Flash en boucle [STATIQUE]
140 COPYSCREEN:RETURN
149 'Flash si direction [HAUT]
150 COPYSCREEN:IFY=8THENRETURNELSEY=Y+1:RETURN
159 'Flash si direction [DROITE]
160 COPYSCREEN:IFX=8THENRETURNELSEX=X+1:RETURN
169 'Flash si direction [BAS]
170 COPYSCREEN:IFY=-7THENRETURNELSEY=Y-1:RETURN
179 'Flash si direction [GAUCHE]
180 COPYSCREEN:IFX=-7THENRETURNELSEX=X-1:RETURN
197 'Augmente les cycles CPU et VDP de 20%
198 VDP (10) = 0
199 'Variables diverses 
200 XS = 4 ' Variable des deplacements Horizontaux
210 YS = 4 ' Variable des deplacements verticaux
220 D = 1 ' Variable [ DROITE ] actif ou pas
230 G = 0 ' Variable [ GAUCHE] actif ou pas
240 GR = 0 ' [ HERO FACE VERS LA DROITE] (+156 FACE VERS LA GAUCHE)
250 X = XS*20 ' Variable de Position horizontale initiale du [ HERO ]
260 Y = YS*33 ' Variable de Position verticale initiale du [ HERO ]
270 SH = 0 ' Variable [ SAUT ] actif ou pas
280 BH = 0 ' indique le nombre de [BOUCLES SAUTS]. Se parametre en ligne 2000
290 DR = 0 ' Variable d animation du [HERO]
299 'Extinction du VDP 
300 DEFUSR =&H41 : A = USR (0)
309 'RS 232 => FLASH IMAGE + ou -
310 SETPAGE1:COPYSCREEN:SETPAGE0
319 'Copie du masque de jeu vers la page [ ZERO ]
320 COPY (0,0)-(255,171),1 TO (0,0),0
329 'Attente que le VDP termine sa COPIE en page [ ZERO ]
330 IF VDP (-2) AND 1 THEN 330
339 'Allumage du VDP
340  DEFUSR =&H44 : A = USR (0)
899 'Boucle de Deplacement du [ HERO ] 
900 S = STICK (0) : ONS+1 GOSUB 1000,1100,1200,1300,1400,1500,1600,1700,1800 : GOTO 900
998 '********************STATIQUE************************
999 'Si [Gauche] actif alors deplacer la source image [HERO] GR de 156 pixels
1000 MH = 5 :IF G = 1 THEN GR = 156 ELSE GR = 0
1011 'Si la [Barre Espace utilisee alors => 2000 
1012 IF STRIG (0) THEN GOSUB 2000
1017 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1018 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),0
1020 COPY (0+GR,176)-(24+GR,207),1 TO (107+8,172+4),0,PSET
1022 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y-YS),0
1023 'Fin de boucle [STATIQUE]
1024 RETURN
1098 '*******************HAUT***************************
1099 'Si le nombre de [CYCLES de SAUT BH] atteint [0] alors 3000
1100 MH = 10: IF G = 1 THEN GR = 156 ELSE GR = 0
1107 'Verifie la limite du Plafond [HAUT]
1108 IF Y <  1 THEN RETURN
1111 'Si la [Barre Espace utilisee alors => 2000 
1112 IF STRIG (0) THEN GOSUB 2000
1113 'Permet l animation du HERO par incrementation de 25 pixels
1114 DR = DR + 25 : IF DR = 100 THEN DR = 0
1115 'Desincremente Y pour monter
1116 'Y = Y - YS
1117 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1118 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),0
1120 COPY (0+GR+DR,176)-(24+GR+DR,207),1 TO (107+8,172+4),0,PSET
1122 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y-YS),0
1123 'Fin de la boucle [HAUT]
1124 RETURN
1198 '*******************HAUT DROITE*********************
1199 '[DROITE] est actif [GAUCHE] est desactive
1200 MH = 10 : D = 1 : G = 0 
1207 'Si Y est inférieur a [UN] alors retour a la boucle
1208 IF Y < 1 THEN RETURN
1209 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1210 IF X>240 THEN COPY (X-XS,Y-YS) - (X+32,Y+36),1 TO (X-XS,Y-YS),0 : X=0 : GOTO 300
1211 'Si la [BARRE ESPACE] utilisee alors => 2000 
1212 IF STRIG (0) THEN GOSUB 2000
1213 'Permet l animation du [HERO] par incrementation de 25 pixels
1214 DR = DR + 25 : IF DR = 100THEN DR = 0
1215 'Valorisation X et Y
1216  X = X + XS ': Y = Y - YS
1217 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1218 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),1
1220 COPY (DR,176)-(DR+24,207),1 TO (107+8,172+4),1,PSET
1222 COPY (107,172)-(107+36,172+40),1 TO (X-XS,Y-YS),0
1223 'Fin de la boucle [HAUT DROITE]
1224 RETURN
1298 '*********************DROITE**************************
1299 '[DROITE] est actif [GAUCHE] est desactive
1300 MH = 5 : D = 1 : G = 0
1307 'Si la [BARRE ESPACE] utilisee alors => 2000
1308 IF STRIG (0) THEN GOSUB 2000
1309 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1310 IF X>240 THEN COPY (X-XS,Y-YS) - (X+32,Y+36),1 TO (X-XS,Y-YS),0 : X=0 : GOTO 300
1313 'Permet l animation du [HERO] par incrementation de 25 pixels
1314 DR = DR + 25 : IF DR = 100THEN DR = 0
1315 'Valorisation X et Y
1316 X = X + XS : 
1317 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1318 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),0
1320 COPY (DR,176)-(DR+24,207),1 TO (107+8,172+4),0,PSET
1322 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y-YS),0
1323 'Fin de la boucle [DROITE]
1324 RETURN
1398 '**********************BAS DROITE*********************
1399 '[DROITE] est actif [GAUCHE] est desactive
1400 MH = 2 : D = 1 : G = 0 
1401 ' Verifie la limite du seuil du sol [BAS]
1402 IF Y > 130 THEN RETURN
1409 'Permet l animation du [HERO] par incrementation de 25 pixels
1410 DR = DR + 25 : IF DR = 100THEN DR = 0
1411 'Valorisation X et Y
1412 X = X + XS : Y = Y + YS
1415 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1416 IF X>240 THEN COPY(X-XS,Y-YS)-(X+32,Y+36),1TO(X-XS,Y-YS),0: X=0 : GOTO 300
1417 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1418 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),1
1420 COPY (DR,176)-(DR+24,207),1 TO (107+8,172+4),1,PSET
1422 COPY (107,172)-(107+36,172+40),1 TO (X-XS,Y-YS),0
1429 'Fin de la boucle [BAS DROITE]
1430 RETURN
1498 '************************BAS*****************************
1499 'Si [Gauche] actif alors deplacer la source image [HERO] GR de 156 pixels
1500 MH = 2 : IF G = 1 THEN GR = 156 ELSE GR = 0
1501 ' Verifie la limite du seuil du sol [BAS]
1502 IF Y > 130 THEN RETURN
1509 'Permet l animation du [HERO] par incrementation de 25 pixels
1510 DR = DR + 25 : IF DR = 100THEN DR = 0
1511 'VALORISATION Y
1512 Y = Y + YS
1517 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1518 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),0
1520 COPY (DR+GR,176)-(DR+24+GR,207),1 TO (107+8,172+4),0,PSET
1522 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y-YS),0
1529 'Fin de la boucle [BAS]
1530 RETURN
1598 '*********************BAS GAUCHE***********************
1599 '[GAUCHE] est actif [DROITE] est desactive
1600 MH = 2 : G=1 : D = 0 
1601 'Verifie la limite du seuil du sol [BAS]
1602 IF Y > 130 THEN RETURN
1603 'Permet l animation du [HERO] par incrementation de 25 pixels
1604 DR = DR + 25 : IF DR = 100THEN DR = 0
1611 'Incremente X et Y permettant la diagonale [BAS GAUCHE]
1612 Y = Y + YS : X = X - XS
1615 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1616 IFX<1THENCOPY(X-XS,Y-YS)-(X+32,Y+36),1TO(X-XS,Y-YS),0:X=240:GOTO300
1617 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1618 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),0
1620 COPY (DR+156,176)-(DR+24+156,207),1 TO (107+8,172+4),0,PSET
1622 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y-YS),0
1629 'Fin de la boucle [BAS GAUCHE]
1630 RETURN
1698 '**********************Gauche*****************************
1699 '[GAUCHE] est actif [DROITE] est desactive
1700 MH = 5 : G = 1 : D = 0 
1703 'Permet l animation du [HERO] par incrementation de 25 pixels
1704 DR = DR + 25 : IF DR = 100THEN DR = 0
1707 'Si la [BARRE ESPACE] utilisee alors => 2000
1708 IF STRIG (0) THEN GOSUB 2000
1709 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1710 IF X<1 THEN COPY(X-XS,Y-YS) - (X+32,Y+36),1 TO (X-XS,Y-YS),0 : X=240 : GOTO 300
1711 'Desincremente X permettant le deplacement vers la gauche
1712 X = X - XS
1717 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1718 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),0
1720 COPY (DR+156,176)-(DR+24+156,207),1 TO (107+8,172+4),0,PSET
1722 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y-YS),0
1729 'Fin de la Boucle [GAUCHE]
1730 RETURN
1798 '**********************HAUT GAUCHE**********************
1799 '[GAUCHE] est actif [DROITE] est desactive
1800 MH = 10 : G = 1: D = 0
1801 'Si Y est inférieur a [UN] alors retour a la boucle
1802 IF Y < 1THEN RETURN
1809 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1810 IFX<1THENCOPY(X-XS,Y-YS)-(X+32,Y+36),1TO(X-XS,Y-YS),0:X=240:GOTO300
1811 'Si la [BARRE ESPACE] utilisee alors => 2000 
1812 IF STRIG (0) THEN GOSUB 2000
1813 'Permet l animation du [HERO] par incrementation de 25 pixels
1814 DR = DR + 25 : IF DR = 100THEN DR = 0
1815 'Desincremente X et Y permettant la diagonale [HAUT GAUCHE]
1816 X = X - XS :' Y = Y + YS
1817 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1818 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),0
1820 COPY (DR+156,176)-(DR+24+156,207),1 TO (107+8,172+4),0,PSET
1822 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y-YS),0
1829 'Fin de la boucle [HAUT GAUCHE]
1830 RETURN
1998 '******************SAUT NUANCE*************************
1999 ' Si le [HERO] est trop haut alors RETURN
2000 IF Y < 100 THEN RETURN
2001 'Si le nombre de [CYCLES de SAUT BH] atteint [MH] alors 2100
2002 IF BH = MH THEN 2100 ELSE BH = BH + 1
2021 'Boucle de [SAUT PHASE MONTANTE]
2022 S=STICK(0):ONS+1GOTO 2030,2040,2050,2060,2064,2066,2068,2070,2080:GOTO2022
2029 '[STATIQUE]
2030 GOTO2082
2039 '[HAUT]
2040 GOTO2082
2049 '[HAUT DROITE]/Pieds elances droite
2050 DR = 25 : GR = 0 : X = X+4 : GOTO2082
2059 '[DROITE]/Pieds elances droite
2060 DR = 25 : GR = 0 : X = X+4 : GOTO2082
2063 '[DOITE BAS]/Pieds elances droite
2064 DR = 75 : GR = 0 : X = X+4 : GOTO2082
2065 '[BAS]
2066 GOTO2082
2067 '[BAS GAUCHE]/ Pieds elances gauche
2068 DR = 75 : GR = 156 : X = X-4 : GOTO2082
2069 '[GAUCHE]/Pieds elances gauche
2070 DR = 25 : GR = 156 : X = X-4 : GOTO2082
2079 '[GAUCHE HAUT]/Pieds elances gauche
2080 DR = 25 : GR = 156 : X = X-4 : GOTO2082
2082 Y = Y - 8
2084 COPY (X-XS,Y)-(X+36,Y+40),1 TO (107,172),0
2086 COPY (DR+GR,176)-(DR+24+GR,207),1 TO (107+8,172),0,PSET
2088 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y),0
2090 GOTO2002
2100 IF BH = 0 THEN 3000 ELSE BH = BH - 1
2109 'Boucle de [SAUT PHASE DESCENDANTE]
2110 S=STICK(0):ONS+1GOTO2120,2130,2140,2150,2160,2170,2180,2190,2200:GOTO2110
2119 '[STATIQUE]
2120 GOTO 2210
2129 '[HAUT]
2130 GOTO 2210
2139 '[HAUT DROITE]/Pieds elances droite
2140 DR = 25 : GR = 0 : X = X+4 : GOTO 2210
2149 '[DOITE]/Pieds elances droite
2150 DR = 25 : GR = 0 : X = X+4 : GOTO 2210
2159 '[DROITE BAS]/Pieds elances
2160 DR = 75 : GR = 0 : X = X+4 : GOTO 2210
2169 '[BAS]
2170 GOTO 2210
2179 '[BAS GAUCHE]/Pieds elances gauche
2180 DR = 75 : GR = 156 : X = X-4 : GOTO 2210
2189 '[GAUCHE]/Pieds elances gauche
2190 DR = 25 : GR = 156 : X = X-4 : GOTO 2210
2199 '[HAUT GAUCHE]/Pieds elances gauche
2200 DR = 25 : GR = 156 : X = X-4 : GOTO 2210
2210 'Y=Y+8
2220 COPY (X-XS,Y-YS)-(X+36,Y+40),1 TO (107,172),0
2230 COPY (DR+GR,176)-(DR+24+GR,207),1 TO (107+8,172+8),0,PSET
2240 COPY (107,172)-(107+36,172+40),0 TO (X-XS,Y-YS),0
2250 Y=Y+8:GOTO 2100
3000 XS = 4 : YS = 4 : RETURN

Edité par igal Le 04/03/2018 à 11h32


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: 10731

Le 04/03/2018 à 14h57
pour la transparence il faut utiliser l'instruction COPY avec un TPSET :)


:noel
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 04/03/2018 à 15h14
Merci beaucoup Jipe, ca fonctionne parfaitement avec TPSET :top


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: 10731

Le 04/03/2018 à 17h27
je remonte un post qui peut t'être utile
http://msxvillage.fr/forum/topic.php?id=507&pt=2
regarde mowgli.zip et schtroumps.zip ;)


:noel
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 07/03/2018 à 21h45
Voici l'ébauche de la prochaine mouture.



Les avancées sont les suivantes:
1) Toutes les valeurs ont été remplacées par des variables de sorte à pouvoir modeler le moteur à sa guise.
2) La qualité des images est corrigée en procédant de la facon suivante:
a) Je prépare l'arrière plan en 256 X 212
b) Je fais rentrer les 8 sprites dans les cases déterminées.
c) Je {Taille la zone de travail] en 320 X 240
d) Je [Redimensionne l'image] en 1280 X 960 en choisissant l'option [Proche voisin] et non pas [Meilleur Qualité]
Au final, les étapes a,b,c et d permettent de flasher une image "nette" avec un contenu affichable en 256 X 212 parfaitement centrée "dans le VDP".
3) Transition des pages pendant les sauts
4) Le Flash ne jure plus grâce au "bords blancs"

A venir:
1) correction d'un bug mineur d'affichage
2) support d'un second joueur "Ninja" T=STICK(1) !
3) déplacement en profondeur "Haut" "Bas" tout en conservant le "Saut" (a la facon de King of Dragon)
4) Saut en "cloche" au lieu de saut en "pyramide"

Pour le Fun, voici le listing provisoire:
Code CSS :
 
9 'SAUVEGARDE AU FORMAT ASCII
10 'save"EDEN016.asc",a
19 'Mode explicatif
20 CLS:LOCATE 10,4 : PRINT "Commencez par lancer la video de l'image Prima
30 LOCATE 10,6 : PRINT "Vous centrerez l'image avec les touches du clavier
40 LOCATE 10,8 : PRINT "Puis appuyez sur la barre d espace
50 LOCATE 10,10: PRINT "               Appuyez sur une touche pour commencer
59 'Attente d un input quelconque du clavier
60 IF INKEY$ = "" THEN60
98 'Ajustement vertical du "VDP FLASH PIPELINE
99 'Mode graAOique en 256 couleurs
100 SCREEN 8
109 'Couleurs du contour d ecran en Blanc
110 COLOR,,255
119 ' Flash permettant l ajustement de la page Prima
120 COPY SCREEN
128 'Boucle d ajustement des variables pour SET ADJUST (X,Y)
129 ' ON STRIG permet de sortir de la boucle par appui sur la barre d espace
130 STRIG(0) ON : ON STRIG GOSUB 198 : SET ADJUST (X,Y) : S=STICK(0):ONS+1GOSUB 140,150,160,160,160,170,180,180,180:GOTO130
139 'Flash en boucle [STATIQUE]
140 COPYSCREEN:RETURN
149 'Flash si direction [HAUT]
150 COPYSCREEN:IFY=8THENRETURNELSEY=Y+1:RETURN
159 'Flash si direction [DROITE]
160 COPYSCREEN:IFX=8THENRETURNELSEX=X+1:RETURN
169 'Flash si direction [BAS]
170 COPYSCREEN:IFY=-7THENRETURNELSEY=Y-1:RETURN
179 'Flash si direction [GAUCHE]
180 COPYSCREEN:IFX=-7THENRETURNELSEX=X-1:RETURN
197 'Augmente les cycles CPU et VDP de 20%
198 VDP (10) = 0
199 'Variables HERO 
200 XA = 4 ' Marge Gauche du debut du cube
202 YA = 4 ' Marge Haute du debut du cube
204 XB = 4 ' Marge droite de fin du cube
206 YB = 4 ' Marge Basse de fin du cube
207 AO = 176 ' Point Haut du hero
208 AB = 207 ' Point Bas du Hero
210 AH = 25 ' Largeur du Hero
211 AV = 32 ' Hauteur du Hero
212 DR = 0 ' Variable d animation du [HERO]
214 IH = 156 ' Inversion Horizontale de l image du Hero
216 GR = 0 ' 1 = Face Hero vers la Droite: 0 Face Hero vers la Gauche
218 Y = YA*33 ' Position PRIMA [ HERO ]
220 X = XA*20 ' Position PRIMA [ HERO ]
222 D = 1 ' Variable [ DROITE ] actif ou pas
224 G = 0 ' Variable [ GAUCHE] actif ou pas
226 SB = 0 ' indique [SAUTS BOUCLE] la boucle du saut
228 MB = 0 ' indique [MAXIMA BOUCLE] a atteindre
229 ' Zone jouable
230 DA = 0 
232 DB = 255
234 DC = 0
236 DD = 171
238 ' Zone tampon
240 TA = 107
242 TB = TA+XA+AH+XB
244 TC = 172
246 TD = TC+YA+AV+YB
299 'EXBinction du VDP 
300 DEFUSR =&H41 : A = USR (0)
309 'RS 232 => FLASH IMAGE + ou -
310 SETPAGE1:COPYSCREEN:SETPAGE0
319 'Copie du masque de jeu vers la page [ ZERO ]
320 COPY (DA,DC)-(DB,DD),1 TO (DA,DC),0
329 'Attente que le VDP termine sa COPIE en page [ ZERO ]
330 IF VDP (-2) AND 1 THEN 330
339 'Allumage du VDP
340  DEFUSR =&H44 : A = USR (0)
899 'Boucle de Deplacement du [ HERO ]
900 S = STICK (0) : ONS+1 GOSUB 1000,1100,1200,1300,1400,1500,1600,1700,1800 : GOTO 900
998 '********************STATIQUE************************
999 'MB definit le nombre de boucle saut maximum.
1000 MB = 5 :IF G = 1 THEN GR = IH ELSE GR = 0
1011 'Si la [Barre Espace utilisee alors => 2000 
1012 IF STRIG (0) THEN GOSUB 2000
1017 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1018 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1020 COPY (0+GR+DR,AO)-(24+GR+DR,AB),1 TO (TA+XA,TC+YA),0,TPSET
1022 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1023 'Fin de boucle [STATIQUE]
1024 RETURN
1098 '*******************HAUT***************************
1099 'MB definit le nombre de boucle saut maximum.
1100 MB = 10: IF G = 1 THEN GR = IH ELSE GR = 0
1107 'Verifie la limite du Plafond [HAUT]
1108 IF Y <  1 THEN RETURN
1111 'Si la [Barre Espace utilisee alors => 2000 
1112 IF STRIG (0) THEN GOSUB 2000
1113 'Permet l animation du HERO par incrementation de 25 pixels
1114 DR = DR + 25 : IF DR = 100 THEN DR = 0
1115 'Desincremente Y pour monter
1116 'Y = Y - YA
1117 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1118 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1120 COPY (0+GR+DR,AO)-(24+GR+DR,AB),1 TO (TA+XA,TC+YA),0,TPSET
1122 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1123 'Fin de la boucle [HAUT]
1124 RETURN
1198 '*******************HAUT DROITE*********************
1199 'MB definit le nombre de boucle saut maximum.
1200 MB = 10 : D = 1 : G = 0 
1207 'Si Y est inférieur a [UN] alors retour a la boucle
1208 IF Y < 1 THEN RETURN
1209 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1210 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOTO 300
1211 'Si la [BARRE ESPACE] utilisee alors => 2000 
1212 IF STRIG (0) THEN GOSUB 2000
1213 'Permet l animation du [HERO] par incrementation de 25 pixels
1214 DR = DR + 25 : IF DR = 100THEN DR = 0
1215 'Valorisation X et Y
1216  X = X + XA ': Y = Y - YA
1217 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1218 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1220 COPY (DR,AO)-(DR+24,AB),1 TO (TA+XA,TC+YA),0,TPSET
1222 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1223 'Fin de la boucle [HAUT DROITE]
1224 RETURN
1298 '*********************DROITE**************************
1299 'MB definit le nombre de boucle saut maximum.
1300 MB = 5 : D = 1 : G = 0
1307 'Si la [BARRE ESPACE] utilisee alors => 2000
1308 IF STRIG (0) THEN GOSUB 2000
1309 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1310 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOTO 300
1313 'Permet l animation du [HERO] par incrementation de 25 pixels
1314 DR = DR + 25 : IF DR = 100THEN DR = 0
1315 'Valorisation X et Y
1316 X = X + XA 
1317 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1318 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1320 COPY (DR,AO)-(DR+24,AB),1 TO (TA+XA,TC+YA),0,TPSET
1322 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1323 'Fin de la boucle [DROITE]
1324 RETURN
1398 '**********************BAS DROITE*********************
1399 'MB definit le nombre de boucle saut maximum.
1400 MB = 2 : D = 1 : G = 0 
1401 ' Verifie la limite du seuil du sol [BAS]
1402 IF Y > 130 THEN RETURN
1409 'Permet l animation du [HERO] par incrementation de 25 pixels
1410 DR = DR + 25 : IF DR = 100THEN DR = 0
1411 'Valorisation X et Y
1412 X = X + XA : Y = Y + YA
1415 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1416 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOTO 300
1417 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1418 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1420 COPY (DR,AO)-(DR+24,AB),1 TO (TA+XA,TC+YA),0,TPSET
1422 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1429 'Fin de la boucle [BAS DROITE]
1430 RETURN
1498 '************************BAS*****************************
1499 'MB definit le nombre de boucle saut maximum.
1500 MB = 2 : IF G = 1 THEN GR = IH ELSE GR = 0
1501 ' Verifie la limite du seuil du sol [BAS]
1502 IF Y > 130 THEN RETURN
1509 'Permet l animation du [HERO] par incrementation de 25 pixels
1510 DR = DR + 25 : IF DR = 100THEN DR = 0
1511 'VALORISATION Y
1512 Y = Y + YA
1517 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1518 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1520 COPY (DR+GR,AO)-(DR+24+GR,AB),1 TO (TA+XA,TC+YA),0,TPSET
1522 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1529 'Fin de la boucle [BAS]
1530 RETURN
1598 '*********************BAS GAUCHE***********************
1599 'MB definit le nombre de boucle saut maximum.
1600 MB = 2 : G=1 : D = 0 
1601 'Verifie la limite du seuil du sol [BAS]
1602 IF Y > 130 THEN RETURN
1603 'Permet l animation du [HERO] par incrementation de 25 pixels
1604 DR = DR + 25 : IF DR = 100THEN DR = 0
1611 'Incremente X et Y permettant la diagonale [BAS GAUCHE]
1612 Y = Y + YA : X = X - XA
1615 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1616 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 :GOTO300
1617 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1618 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1620 COPY (DR+IH,AO)-(DR+24+IH,AB),1 TO (TA+XA,TC+YA),0,TPSET
1622 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1629 'Fin de la boucle [BAS GAUCHE]
1630 RETURN
1698 '**********************Gauche*****************************
1699 'MB definit le nombre de boucle saut maximum.
1700 MB = 5 : G = 1 : D = 0 
1703 'Permet l animation du [HERO] par incrementation de 25 pixels
1704 DR = DR + 25 : IF DR = 100THEN DR = 0
1707 'Si la [BARRE ESPACE] utilisee alors => 2000
1708 IF STRIG (0) THEN GOSUB 2000
1709 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1710 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOTO 300
1711 'Desincremente X permettant le deplacement vers la gauche
1712 X = X - XA
1717 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1718 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1720 COPY (DR+IH,AO)-(DR+24+IH,AB),1 TO (TA+XA,TC+YA),0,TPSET
1722 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1729 'Fin de la Boucle [GAUCHE]
1730 RETURN
1798 '**********************HAUT GAUCHE**********************
1799 'MB definit le nombre de boucle saut maximum.
1800 MB = 10 : G = 1: D = 0
1801 'Si Y est inférieur a [UN] alors retour a la boucle
1802 IF Y < 1THEN RETURN
1809 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1810 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 :GOTO300
1811 'Si la [BARRE ESPACE] utilisee alors => 2000 
1812 IF STRIG (0) THEN GOSUB 2000
1813 'Permet l animation du [HERO] par incrementation de 25 pixels
1814 DR = DR + 25 : IF DR = 100THEN DR = 0
1815 'Desincremente X et Y permettant la diagonale [HAUT GAUCHE]
1816 X = X - XA :' Y = Y + YA
1817 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1818 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1820 COPY (DR+IH,AO)-(DR+24+IH,AB),1 TO (TA+XA,TC+YA),0,TPSET
1822 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1829 'Fin de la boucle [HAUT GAUCHE]
1830 RETURN
1998 '******************SAUT NUANCE*************************
1999 ' Si le [HERO] est trop haut alors RETURN
2000 IF Y < 100 THEN RETURN
2001 'Si le nombre de [CYCLES de SAUT SB] atteint [MB] alors 2100
2002 IF SB = MB THEN 2100 ELSE SB = SB + 1
2021 'Boucle de [SAUT PHASE MONTANTE]
2022 S=STICK(0):ONS+1GOTO 2030,2040,2050,2060,2064,2066,2068,2070,2080:GOTO2022
2029 '[STATIQUE]
2030 GOTO2081
2039 '[HAUT]
2040 GOTO2081
2049 '[HAUT DROITE]/Pieds elances droite
2050 DR = 25 : GR = 0 : X = X+4 : GOTO2081
2059 '[DROITE]/Pieds elances droite
2060 DR = 25 : GR = 0 : X = X+4 : GOTO2081
2063 '[DOITE BAS]/Pieds elances droite  
2064 DR = 75 : GR = 0 : X = X+4 : GOTO2081
2065 '[BAS]
2066 GOTO2081
2067 '[BAS GAUCHE]/ Pieds elances gauche
2068 DR = 75 : GR = IH : X = X-4 : GOTO2081
2069 '[GAUCHE]/Pieds elances gauche
2070 DR = 25 : GR = IH : X = X-4 : GOTO2081
2079 '[GAUCHE HAUT]/Pieds elances gauche
2080 DR = 25 : GR = IH : X = X-4 : GOTO2081
2081 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOSUB 4000
2082 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOSUB 4000
2083 Y = Y - YB*2
2084 COPY (X-XA,Y)-(X+AH+XB,Y+YA+AV+YB),1 TO (TA,TC),0
2086 COPY (DR+GR,AO)-(DR+24+GR,AB),1 TO (TA+XA,TC),0,TPSET
2088 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y),0
2090 GOTO2002
2100 IF SB = 0 THEN 3000 ELSE SB = SB - 1
2109 'Boucle de [SAUT PHASE DESCENDANTE]
2110 S=STICK(0):ONS+1GOTO2120,2130,2140,2150,2160,2170,2180,2190,2200:GOTO2110
2119 '[STATIQUE]
2120 GOTO 2220
2129 '[HAUT]
2130 GOTO 2220
2139 '[HAUT DROITE]/Pieds elances droite
2140 DR = 25 : GR = 0 : X = X+4 : GOTO 2220
2149 '[DOITE]/Pieds elances droite
2150 DR = 25 : GR = 0 : X = X+4 : GOTO 2220
2159 '[DROITE BAS]/Pieds elances
2160 DR = 75 : GR = 0 : X = X+4 : GOTO 2220
2169 '[BAS]
2170 GOTO 2220
2179 '[BAS GAUCHE]/Pieds elances gauche
2180 DR = 75 : GR = IH : X = X-4 : GOTO 2220
2189 '[GAUCHE]/Pieds elances gauche
2190 DR = 25 : GR = IH : X = X-4 : GOTO 2220
2199 '[HAUT GAUCHE]/Pieds elances gauche
2200 DR = 25 : GR = IH : X = X-4 : GOTO 2220
2220 COPY (X-XA,Y-YA)-(X+AH+XB,Y+YA+AV+YB),1 TO (TA,TC),0
2230 COPY (DR+GR,AO)-(DR+24+GR,AB),1 TO (TA+XA,TC+8),0,TPSET
2240 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
2242 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOSUB 4000
2244 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOSUB 4000
2250 Y = Y + YB*2 : GOTO 2100
3000 RETURN:'XA = 4 : YA = 4 : RETURN
3999 'EXBinction du VDP 
4000 DEFUSR =&H41 : A = USR (0)
4009 'RS 232 => FLASH IMAGE + ou -
4010 SETPAGE1:COPYSCREEN:SETPAGE0
4019 'Copie du masque de jeu vers la page [ ZERO ]
4020 COPY (DA,DC)-(DB,DD),1 TO (DA,DC),0
4029 'Attente que le VDP termine sa COPIE en page [ ZERO ]
4030 IF VDP (-2) AND 1 THEN 4030
4039 'Allumage du VDP
4040  DEFUSR =&H44 : A = USR (0)
4050 RETURN



A suivre :)

Edit: Voici en images comment se traduit les points a,b,c et d:

L'image impaire qui s'affiche en page 1:
Elle contient le Tampon de la zone jouable, les "animes" de deux heros ainsi que les "blocs de travail" permettant de transformer les "animes" en pseudo sprites!


L'image Paire qui s'affiche en page visible 0:
Elle contient l'entièreté des décors c'est a dire les zones jouables mais aussi les zone que le héro ne peut pas atteindre et qui ne sont là que pour remplir l'écran comme de nombreux jeux.
Edité par igal Le 08/03/2018 à 09h22


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

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 10/03/2018 à 17h16
Salut à tous.

Voici une vidéo avec les avancées émulées sur BlueMSX, ce qui explique pourquoi certaines sont visibles tant dis que d'autres nécessitent un volontaire pour tester sur du Hardware.



1) Dorénavant, les sauts sont "paraboliques" et non "pyramidales".
2) Le tableau de bord est ajouté (sans les variables à afficher pour le moment)
3) Trois couches se superposent avec le support de la transparence.
a) Le décor et tableau de bord sont COPYSCREEN sur la Page UN puis COPY sur la page ZERO avec l'option TPSET
b) L'image contenant le HERO (sur fond noir) ainsi que les décors de Background sont COPYSCREEN en page 1,ce qui devrait laisser transparaître ce qui est NOIR.
c) Un film d'animation avec des nuages qui défilent "devraient être visible" en couche 3 sur un vrai MSX.
pour cela, je commence par COPYSCREEN en page UN puis je COPY l'intégralité de l'image vers la Page ZERO avec l'option .TPSET
En amont, j'ai préparé ces dessins en choisissant le NOIR pour la partie translucide et le GRIS TRES FONCE pour le tableau de bord et tout autre partie de l'image devant être sombre mais pas transparente!

Sur cette BlueMsx, on ne peut voir que les deux couches supérieurs. Pour voir défiler les nuages du fond (en lieu et place de ce qui à l'air d'être noir), il faut un vrai MSX.

Pour faire ces testes, n'ayant pas de module émulé RS232, voici comment je gère la superposition des 3 couches:
1) Je sors du décors lorsque la bonne page est affichée par le périphérique Multimédia. (Image X sans les héros)
2) J'appuie sur "F" pour COPYSCREEN l'image suivante contenant le même décors que précédemment ainsi que les héros.
3) Je lance la lecture vidéo des nuages (ou autre) qui doit se faire sur la couche la plus profonde.

Code CSS :
 
9 'SAUVEGARDE AU FORMAT ASCII
10 'save"EDEN020.asc",a
15 DEFINT A-Z
19 'Mode explicatif
20 CLS:LOCATE 10,4 : PRINT "Commencez par lancer la video de l'image Prima
30 LOCATE 10,6 : PRINT "Vous centrerez l'image avec les touches du clavier
40 LOCATE 10,8 : PRINT "Puis appuyez sur la barre d espace
50 LOCATE 10,10: PRINT "               Appuyez sur une touche pour commencer
59 'Attente d un input quelconque du clavier
60 IF INKEY$ = "" THEN60
98 'Ajustement vertical du "VDP FLASH PIPELINE
99 'Mode graAOique en 256 couleurs
100 SCREEN 8
109 'Couleurs du contour d ecran en Blanc
110 COLOR,,255
119 ' Flash permettant l ajustement de la page Prima
120 COPY SCREEN
128 'Boucle d ajustement des variables pour SET ADJUST (X,Y)
129 ' ON STRIG permet de sortir de la boucle par appui sur la barre d espace
130 IF VDP (-2) AND 1 THEN 130 ELSE STRIG(0) ON : ON STRIG GOSUB 198 : SET ADJUST (X,Y) : S=STICK(0):ONS+1GOSUB 140,150,160,160,160,170,180,180,180:GOTO130
139 'Flash en boucle [STATIQUE]
140 COPYSCREEN:RETURN
149 'Flash si direction [HAUT]
150 COPYSCREEN:IFY=8THENRETURNELSEY=Y+1:RETURN
159 'Flash si direction [DROITE]
160 COPYSCREEN:IFX=8THENRETURNELSEX=X+1:RETURN
169 'Flash si direction [BAS]
170 COPYSCREEN:IFY=-7THENRETURNELSEY=Y-1:RETURN
179 'Flash si direction [GAUCHE]
180 COPYSCREEN:IFX=-7THENRETURNELSEX=X-1:RETURN
197 'Augmente les cycles CPU et VDP de 20%
198 VDP (10) = 0
199 'Variables HERO 
200 XA = 4 ' Marge Gauche du debut du cube
202 YA = 4 ' Marge Haute du debut du cube
204 XB = 4 ' Marge droite de fin du cube
206 YB = 4 ' Marge Basse de fin du cube
207 AO = 176 ' Point Haut du hero
208 AB = 207 ' Point Bas du Hero
210 AH = 25 ' Largeur du Hero
211 AV = 32 ' Hauteur du Hero
212 DR = 0 ' Variable d animation du [HERO]
214 IH = 156 ' Inversion Horizontale de l image du Hero
216 GR = 0 ' 1 = Face Hero vers la Droite: 0 Face Hero vers la Gauche
218 Y = YA*34 ' Position PRIMA [ HERO ]
220 X = XA*20 ' Position PRIMA [ HERO ]
222 D = 1 ' Variable [ DROITE ] actif ou pas
224 G = 0 ' Variable [ GAUCHE] actif ou pas
226 SB = 0 ' indique [SAUTS BOUCLE] la boucle du saut
228 MB = 0 ' indique [MAXIMA BOUCLE] a atteindre
229 ' Zone Visualisee
230 DA = 0 
232 DB = 255
234 DC = 0
236 DD = 171
238 ' Zone tampon
240 TA = 128-XA-(AH/2)
242 TB = TA+XA+AH+XB
244 TC = 172
246 TD = TC+YA+AV+YB
298 'Flash de la Page 0 
299 'RS 232 => FLASH IMAGE + ou -
300 COPYSCREEN
345 IF INKEY$<>"f"THEN 345
348 'Flash de la Page 1
349 'Extinction du VDP 
400 DEFUSR =&H41 : A = USR (0)
409 'RS 232 => FLASH IMAGE + ou -
410 SETPAGE1:COPYSCREEN:SETPAGE0
419 'Copie du masque de jeu vers la page [ ZERO ]
420 'COPY (DA,DC+40)-(DB,DD),1 TO (DA,DC+40),0
429 'Attente que le VDP termine sa COPIE en page [ ZERO ]
430 IF VDP (-2) AND 1 THEN 430
439 'Allumage du VDP
440  DEFUSR =&H44 : A = USR (0)
899 'Boucle de Deplacement du [ HERO ]
900 S = STICK (0) : ONS+1 GOSUB 1000,1100,1200,1300,1400,1500,1600,1700,1800 : GOTO 900
998 '********************STATIQUE************************
999 'MB definit le nombre de boucle saut maximum.
1000 MB = 5 :IF G = 1 THEN GR = IH ELSE GR = 0
1011 'Si la [Barre Espace utilisee alors => 2000 
1012 IF STRIG (0) THEN GOSUB 2000
1017 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1018 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1020 COPY (0+GR+DR,AO)-(24+GR+DR,AB),1 TO (TA+XA,TC+YA),0,TPSET
1022 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1023 'Fin de boucle [STATIQUE]
1024 RETURN
1098 '*******************HAUT***************************
1099 'MB definit le nombre de boucle saut maximum.
1100 MB = 10: IF G = 1 THEN GR = IH ELSE GR = 0
1107 'Verifie la limite du Plafond [HAUT]
1108 IF Y < YA*24 THEN RETURN
1111 'Si la [Barre Espace utilisee alors => 2000 
1112 IF STRIG (0) THEN GOSUB 2000
1113 'Permet l animation du HERO par incrementation de 25 pixels
1114 DR = DR + 25 : IF DR = 100 THEN DR = 0
1115 'Desincremente Y pour monter
1116 Y = Y - YA
1117 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1118 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1120 COPY (0+GR+DR,AO)-(24+GR+DR,AB),1 TO (TA+XA,TC+YA),0,TPSET
1122 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1123 'Fin de la boucle [HAUT]
1124 RETURN
1198 '*******************HAUT DROITE*********************
1199 'MB definit le nombre de boucle saut maximum.
1200 MB = 10 : D = 1 : G = 0 
1207 'Si Y est inférieur a [UN] alors retour a la boucle
1208 IF Y < YA*24 THEN RETURN
1209 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1210 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOSUB 4000
1211 'Si la [BARRE ESPACE] utilisee alors => 2000 
1212 IF STRIG (0) THEN GOSUB 2000
1213 'Permet l animation du [HERO] par incrementation de 25 pixels
1214 DR = DR + 25 : IF DR = 100THEN DR = 0
1215 'Valorisation X et Y
1216  X = X + XA : Y = Y - YA
1217 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1218 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1220 COPY (DR,AO)-(DR+24,AB),1 TO (TA+XA,TC+YA),0,TPSET
1222 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1223 'Fin de la boucle [HAUT DROITE]
1224 RETURN
1298 '*********************DROITE**************************
1299 'MB definit le nombre de boucle saut maximum.
1300 MB = 5 : D = 1 : G = 0
1307 'Si la [BARRE ESPACE] utilisee alors => 2000
1308 IF STRIG (0) THEN GOSUB 2000
1309 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1310 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOSUB 4000
1313 'Permet l animation du [HERO] par incrementation de 25 pixels
1314 DR = DR + 25 : IF DR = 100THEN DR = 0
1315 'Valorisation X et Y
1316 X = X + XA 
1317 'Mise en Tampon [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1318 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1320 COPY (DR,AO)-(DR+24,AB),1 TO (TA+XA,TC+YA),0,TPSET
1322 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1323 'Fin de la boucle [DROITE]
1324 RETURN
1398 '**********************BAS DROITE*********************
1399 'MB definit le nombre de boucle saut maximum.
1400 MB = 2 : D = 1 : G = 0 
1401 ' Verifie la limite du seuil du sol [BAS]
1402 IF Y > YA*33 THEN RETURN
1409 'Permet l animation du [HERO] par incrementation de 25 pixels
1410 DR = DR + 25 : IF DR = 100THEN DR = 0
1411 'Valorisation X et Y
1412 X = X + XA : Y = Y + YA
1415 'Si [X] est superieur a "240" alors [X] est egal a "0" et GOTO 300 
1416 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOSUB 4000
1417 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1418 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1420 COPY (DR,AO)-(DR+24,AB),1 TO (TA+XA,TC+YA),0,TPSET
1422 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1429 'Fin de la boucle [BAS DROITE]
1430 RETURN
1498 '************************BAS*****************************
1499 'MB definit le nombre de boucle saut maximum.
1500 MB = 2 : IF G = 1 THEN GR = IH ELSE GR = 0
1501 ' Verifie la limite du seuil du sol [BAS]
1502  IF Y > YA*33 THEN RETURN
1509 'Permet l animation du [HERO] par incrementation de 25 pixels
1510 DR = DR + 25 : IF DR = 100THEN DR = 0
1511 'VALORISATION Y
1512 Y = Y + YA
1517 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1518 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1520 COPY (DR+GR,AO)-(DR+24+GR,AB),1 TO (TA+XA,TC+YA),0,TPSET
1522 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1529 'Fin de la boucle [BAS]
1530 RETURN
1598 '*********************BAS GAUCHE***********************
1599 'MB definit le nombre de boucle saut maximum.
1600 MB = 2 : G=1 : D = 0 
1601 'Verifie la limite du seuil du sol [BAS]
1602 IF Y > YA*33 THEN RETURN
1603 'Permet l animation du [HERO] par incrementation de 25 pixels
1604 DR = DR + 25 : IF DR = 100THEN DR = 0
1611 'Incremente X et Y permettant la diagonale [BAS GAUCHE]
1612 Y = Y + YA : X = X - XA
1615 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1616 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOSUB 4000
1617 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1618 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1620 COPY (DR+IH,AO)-(DR+24+IH,AB),1 TO (TA+XA,TC+YA),0,TPSET
1622 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1629 'Fin de la boucle [BAS GAUCHE]
1630 RETURN
1698 '**********************Gauche*****************************
1699 'MB definit le nombre de boucle saut maximum.
1700 MB = 5 : G = 1 : D = 0 
1703 'Permet l animation du [HERO] par incrementation de 25 pixels
1704 DR = DR + 25 : IF DR = 100THEN DR = 0
1707 'Si la [BARRE ESPACE] utilisee alors => 2000
1708 IF STRIG (0) THEN GOSUB 2000
1709 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1710 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOSUB 4000
1711 'Desincremente X permettant le deplacement vers la gauche
1712 X = X - XA
1717 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1718 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1720 COPY (DR+IH,AO)-(DR+24+IH,AB),1 TO (TA+XA,TC+YA),0,TPSET
1722 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1729 'Fin de la Boucle [GAUCHE]
1730 RETURN
1798 '**********************HAUT GAUCHE**********************
1799 'MB definit le nombre de boucle saut maximum.
1800 MB = 10 : G = 1: D = 0
1801 'Si Y est inférieur a [UN] alors retour a la boucle
1802 IF Y < YA*24 THEN RETURN
1809 'Si le bord [GAUCHE] est atteint alors aller flasher en ligne 300
1810 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOSUB 4000
1811 'Si la [BARRE ESPACE] utilisee alors => 2000 
1812 IF STRIG (0) THEN GOSUB 2000
1813 'Permet l animation du [HERO] par incrementation de 25 pixels
1814 DR = DR + 25 : IF DR = 100THEN DR = 0
1815 'Desincremente X et Y permettant la diagonale [HAUT GAUCHE]
1816 X = X - XA : Y = Y - YA
1817 'Mise en Tampon du [Back ground]/[Hero]=> Puis affiche tout en page [ZERO]
1818 COPY (X-XA,Y-YA)-(X+AH+XB,Y+AV+YB),1 TO (TA,TC),0
1820 COPY (DR+IH,AO)-(DR+24+IH,AB),1 TO (TA+XA,TC+YA),0,TPSET
1822 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
1829 'Fin de la boucle [HAUT GAUCHE]
1830 RETURN
1998 '******************SAUT NUANCE*************************
1999 ' Si le [HERO] est trop haut alors RETURN
2000 IF Y < 100 THEN RETURN
2001 'Si le nombre de [CYCLES de SAUT SB] atteint [MB] alors 2100
2002 IF SB = MB THEN 2091 ELSE SB = SB + 1
2021 'Boucle de [SAUT PHASE MONTANTE]
2022 S=STICK(0):ONS+1GOTO 2030,2040,2050,2060,2064,2066,2068,2070,2080:GOTO2022
2029 '[STATIQUE]
2030 GOTO2081
2039 '[HAUT]
2040 GOTO2081
2049 '[HAUT DROITE]/Pieds elances droite
2050 DR = 25 : GR = 0 : X = X+4 : GOTO2081
2059 '[DROITE]/Pieds elances droite
2060 DR = 25 : GR = 0 : X = X+4 : GOTO2081
2063 '[DOITE BAS]/Pieds elances droite  
2064 DR = 75 : GR = 0 : X = X+4 : GOTO2081
2065 '[BAS]
2066 GOTO2081
2067 '[BAS GAUCHE]/ Pieds elances gauche
2068 DR = 75 : GR = IH : X = X-4 : GOTO2081
2069 '[GAUCHE]/Pieds elances gauche
2070 DR = 25 : GR = IH : X = X-4 : GOTO2081
2079 '[GAUCHE HAUT]/Pieds elances gauche
2080 DR = 25 : GR = IH : X = X-4 : GOTO2081
2081 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOSUB 4000
2082 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOSUB 4000
2083 Y = Y - YB*2
2084 COPY (X-XA,Y)-(X+AH+XB,Y+YA+AV+YB),1 TO (TA,TC),0
2086 COPY (DR+GR,AO)-(DR+24+GR,AB),1 TO (TA+XA,TC),0,TPSET
2088 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y),0
2090 GOTO2002
2091 S=STICK(0):ONS+1GOTO 2092,2092,2093,2093,2093,2092,2093,2093,2093:GOTO2091
2092 GOTO 2095 
2093 X = X + 4 : GOTO 2095
2094 X = X - 4 : GOTO 2095
2095 COPY (X-XA,Y)-(X+AH+XB,Y+YA+AV+YB),1 TO (TA,TC),0
2096 COPY (DR+GR,AO)-(DR+24+GR,AB),1 TO (TA+XA,TC),0,TPSET
2097 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y),0
2098 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOSUB 4000
2099 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOSUB 4000
2100 IF SB = 0 THEN 3000 ELSE SB = SB - 1
2109 'Boucle de [SAUT PHASE DESCENDANTE]
2110 S=STICK(0):ONS+1GOTO2120,2130,2140,2150,2160,2170,2180,2190,2200:GOTO2110
2119 '[STATIQUE]
2120 GOTO 2220
2129 '[HAUT]
2130 GOTO 2220
2139 '[HAUT DROITE]/Pieds elances droite
2140 DR = 25 : GR = 0 : X = X+4 : GOTO 2220
2149 '[DOITE]/Pieds elances droite
2150 DR = 25 : GR = 0 : X = X+4 : GOTO 2220
2159 '[DROITE BAS]/Pieds elances
2160 DR = 75 : GR = 0 : X = X+4 : GOTO 2220
2169 '[BAS]
2170 GOTO 2220
2179 '[BAS GAUCHE]/Pieds elances gauche
2180 DR = 75 : GR = IH : X = X-4 : GOTO 2220
2189 '[GAUCHE]/Pieds elances gauche
2190 DR = 25 : GR = IH : X = X-4 : GOTO 2220
2199 '[HAUT GAUCHE]/Pieds elances gauche
2200 DR = 25 : GR = IH : X = X-4 : GOTO 2220
2220 COPY (X-XA,Y-YA)-(X+AH+XB,Y+YA+AV+YB),1 TO (TA,TC),0
2230 COPY (DR+GR,AO)-(DR+24+GR,AB),1 TO (TA+XA,TC+8),0,TPSET
2240 COPY (TA,TC)-(TB,TD),0 TO (X-XA,Y-YA),0
2242 IF X>240 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=4 : GOSUB 4000
2244 IF X<4 THEN COPY (X-XA,Y-YA) - (X+AH+XB,Y+AV+YB),1 TO (X-XA,Y-YA),0 : X=240 : GOSUB 4000
2250 Y = Y + YB*2 : GOTO 2100
3000 RETURN:'XA = 4 : YA = 4 : RETURN
3998 'Flash de l image 0 sur la page 0
3999 'RS 232 => FLASH IMAGE + ou -
4000 SETPAGE1:COPYSCREEN:COPY(0,0)-(255,211),1TO(0,0),0,TPSET:SETPAGE0:SETVIDEO2,0,0
4009 'attente de l image impaire
4010 IF INKEY$<>"f"THEN 4010
4018 'Flash de l image 1 en page 1
4019 'Extinction du VDP 
4020 DEFUSR =&H41 : A = USR (0)
4029 'RS 232 => FLASH IMAGE + ou -
4030 SETPAGE1
4039 'VDP Flash
4040 COPYSCREEN
4049 'Retour en page 0
4050 SETPAGE0
4059 'Attente que le VDP termine sa COPIE en page [ ZERO ]
4060 IF VDP (-2) AND 1 THEN 4060
4069 'Allumage du VDP
4070 DEFUSR =&H44 : A = USR (0)
4079 'Retour
4080 RETURN

Edité par igal Le 10/03/2018 à 17h23


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

Villageois

Rang

Avatar

Groupe : compte ++

Inscrit le : 22/11/2011 à 21h14

Messages: 865

Le 10/03/2018 à 19h20
T'es toujours aussi cinglé l'ami (J'ai mis le MSX de côté mais je consulte régulièrement le site .. notamment les expérimentations d'Igal) !! ehehe.
Je ne sais pas ce qu'en pensent les autres membres mais, pour moi, ça reste impressionnant !!!


Philips.NMS.8245/50/80, Sony.F1XV/HBF-700D, Pana.FSA1FX/A1WX(x2)/A1GT, OCM, GR8BIT.... et ...
   
TurboSEB Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 08/08/2010 à 20h57

Messages: 5886

Le 11/03/2018 à 01h51
IGAL EST EXCEPTIONNEL, c'est quelqu'un qui ne se donne pas de limites, qui cherche et QUI TROUVE :| je suis très honoré et fière de l'avoir rencontré en vrai :glass

Ce qui m'a le plus Bluffé, c'est quand il a réussi à "digitaliser", mais sans digitaliseur avec 3 lignes de codes en basic, alors que tout le monde lui disait que c'était impossible :heink
Edité par TurboSEB Le 11/03/2018 à 01h55



MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 11/03/2018 à 16h44
Merci pour les compliments..J'ai les chevilles qui enflent :D

Tout ca reste plus du concept que de la réalisation!


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 22h54

Messages: 3345

Le 11/03/2018 à 17h15
C'est vrai qu'impossible n'est pas Igal ^^
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 14/07/2018 à 11h41
Salut à tous.

Juste quelques mots pour vous dire que je vais essayer d'implémenter des ennemis au déroulement des scènes.

Principes élémentaires:
A) Le héro est toujours présent.
B) L'ennemi n'est pas forcément présent.
C) Si le [Héro] atteint la [Butée] Droite, il apparaît à [Gauche] de la page suivante et l'[Ennemi] apparaîtra à [Droite]
D) Si le [Héro] atteint la [Butée] Gauche, il apparaît à [Droite] de la page suivante et l'[Ennemi] apparaîtra à [Gauche]
E) Si le [Héro] atteint le [Butée] Haut, il apparaît en [Bas] de la page suivante et l'[ennemi] apparaîtra en [Haut]
F) Si le [Héro] atteint le [Butée] Bas, il apparaît en [Haut] de la page suivante et l'[ennemi] apparaîtra en [Bas]
G) L'ennemi veut toujours atteindre le Héro.
H) L'ennemi modifie son comportement en fonction des actions [STICK (0)] du héro. (ici réside l'apparente pseudo intelligence artificielle)

Les Variables de positionnement du héro sont les suivantes:
X => Longitude
Y => Latitude
Les Variables de positionnement de l'ennemi sont les suivantes:
XX => Longitude
YY => Latitude

Boucle principale incluant Hero et Ennemi:
10 S = STICK (0) : ONS+1 GOSUB 100,200,300,400,500,600,700,800,900
20 IF X = XX THEN END ELSE IF Y = YY THEN 1000 : ' Si collision héro avec ennemi alors 1000
30 IF X < XX THEN XX = XX - 4 ELSE XX = XX + 4 : 'Si Héro à droite alors déplacement de l'ennemi à droite. Si il est à gauche alors déplacement à gauche.
40 IF Y < YY THEN YY = YY - 4 ELSE YY = YY + 4 : 'Si Héro en Haut alors déplacement de l'ennemi vers le Haut. Si il est en Bas alors déplacement vers le Bas.
50 GOTO 10
100 'Statique.
200 'Haut
300 'Haut Droite
400 'Droite
500 'Droite Bas
600 'Bas
700 'Bas Gauche
800 'Gauche
900 'Gauche Haut
1000 'Mort du Héro

Le héro pouvant "Sauter", il peut donc éviter l'ennemi si ce dernier arrive de [Droite], [Droite Bas], [Bas], [Bas Gauche], [Gauche].
Forcément, si l'ennemi arrive de [Haut Gauche], [Haut], [Haut Droite], le héro ne peut pourra pas sauter par dessus l'ennemi.

I) Une variable "Aléatoire/pseudo-aléatoire" doit être intégrée au comportement de l'ennemi afin d'éviter la redondance de ses mouvements.
L'idée est d'obtenir une interaction relative à [STICK (0)] sans pour autant tomber dans une répétition totale du comportement.


J'attends vos idées concernant mon approche en général et surtout concernant les lignes 20, 30 et 40 de l'ébauche.
Est ce la bonne approche?
Faut il déplacer ces lignes 20, 30 et 40 pour les intégrer aux lignes 100, 200, 300 etc?

Bonne journée à tous :)


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Visiteur

Vagabond

Rang

Avatar

Message : 0

Le 15/07/2018 à 11h00
Salut Igal,
Voici mes commentaires ;
- tout d'abord, ligne 20 il y a 'THEN END' qui ne va pas à mon avis. Il suffit de faire 20 IF X = XX AND Y = YY THEN 1000
- je ne comprends pas comment le héro peut sauter alors qu'il peut se déplacer vers le haut. Conceptuellement cela n'a pas l'air très logique, mais cela dépend de l'angle de vue (je n'ai pas regardé ta map dans les précédents messages :siffle )
- pour commencer la programmation de la partie gameplay je pense que c'est la bonne approche. Pour moi il ne faut pas déplacer les lignes de la gestion de l'ennemi et les déplacements du joueur.
- je pense que la partie aléatoire pourrait être d'introduire un retard plus ou moins important par rapport à la prise en compte de la direction du héro. C'est à dire une valeur entre 0 et 3 par exemple à tirer au sort avec un RAND qui indique dans quelle direction l'ennemi se déplace en enregistrant les 4 dernières positions du héro ;
0 => l'ennemi se déplace vers la position actuelle du héro
1 => l'ennemi se déplace vers la position n-1 du héro
2 => l'ennemi se déplace vers la position n-2 du héro
3 => l'ennemi se déplace vers la position n-3 du héro
Mais la chose important à mettre en place est la notion de direction de l'ennemi. il ne faut pas faire simplement XX+ ou - 4 et/ou YY+/- 4 mais déterminer une direction calculée en fonction de la droite passant par la position de l'ennemi à la position* du héro. (position n, n-1, n-2, voir calculer la future position du héro s'il va dans la même direction donc n+1...).

Ne pas oublier qu'il pourra éventuellement y avoir plusieurs ennemis, donc mettre en tableau les variables de gestion des ennemis avec en indice le numéro de l'ennemi.

Voilà pour quelques idées ^^ .

Bonne continuation! ;)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 15/07/2018 à 14h24
Salut Sylvain.

Merci pour ta contribution :)

C'est bien vu pour AND qui doit parfaitement convenir à la situation.

Pour la suite, tout d'abord, je précise encore une fois que je vais essayer d'implémenter un seul ennemi par page et pour cause, je suis en BASIC et animer deux personnages risque d'être le maximum acceptable dans cette circonstance.

Concernant les déplacements du héro:
Actuellement, le héro peut [Grand Saut Vertical] [Saut moyen Droite] [Saut Moyen Gauche] mais aussi [Monter Verticale], [monter Droite] et enfin [Monter Gauche].
Pour garder le tout cohérent, j'ai intégré des variables empêchant le héro de "taper la tête au plafond en sautant" ou encore "sortir du haut de l'écran en marchand".
Tout cela fonctionne correctement. Pour faire simple, on a les mêmes possibilités de déplacement qu'un jeu du genre "King Of Dragons".

Ces précisions apportés, je reviens sur tes idées:

1) Intégrer "la vivance" de l'ennemi a la même boucle que le héro devrait m'éviter une flopée de GOSUB, RETURN à chaque "Frame".

2) Concernant la "Droite" menant à l'ennemi:
Pour faire au plus simple avec des moyens très limités et ne nécessitant pas beaucoup de ressources , j'étais parti de l'idée suivante:
[Si le héro apparaît à droite], c'est qu'il se dirige vers la gauche.
[Si le héro apparaît à Gauche], c'est qu'il se dirige vers la Droite.
[Si le héro apparaît en Haut], c'est qu'il se dirige vers le Bas.
[Si le héro apparaît en Bas], c'est qu'il se dirige vers le Haut.

Partant de ce principe, l'ennemi est placé à l'opposé de la position d'apparition du héro.
Dans la pratique:
Si la [Direction Droite] est appuyée au moment du chargement de la nouvelle page, le héro apparaît à [Gauche] et l'ennemi à [Droite].
Si la [Direction Gauche] est appuyée au moment du chargement de la nouvelle page, le héro apparaît à [Droite] et l'ennemi à [Gauche].
Si la [Direction Haut] est appuyée au moment du chargement de la nouvelle page, le héro apparaît à [Bas] et l'ennemi à [Haut].
Si la [Direction Bas] est appuyée au moment du chargement de la nouvelle page, le héro apparaît à [Haut] et l'ennemi à [Bas].

Toutes ces "conditions imposées" permettent de "prédéterminer" intelligemment la position d'apparition de l'ennemi et implique automatiquement que:
XX - 4 => Trace la ligne horizontale la plus directe depuis l'ennemi vers le Héro.
YY - 4 => Trace la ligne Verticale la plus directe depuis l'ennemi vers le Héro.
Ces deux variable sont "revalorisées" à chaque cycle, et ne nécessitent donc pas de "prédéterminer" la direction "pseudo intentionnelle" du Héro puisque quoi qu'il advienne, l'ennemi se dirigera inexorablement vers le Héro ;) (enfin je crois lol)

Sachant que le [Héro] se trouve (logiquement) à l'opposé de là ou il veut se rendre, dès le départ, l'ennemi apparaît donc Naturellement à l'intersection "supposée" de la direction que le héro veut atteindre.
De ce fait, l'ennemi devrait se retrouver naturellement dès le départ sur la bonne (relativement bonne) trajectoire.

Par contre, pour le coté aléatoire, j'ai pas vraiment compris ton explication. Faut que je regarde ce que signifie la commande RAND :gne

En tout cas, ça fait plaisir de partager des idées.

Bonne après midi à tous :tchin


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Visiteur

Vagabond

Rang

Avatar

Message : 0

Le 15/07/2018 à 14h40
Pour RAND en fait je voulais parler du "random", mais ça fait un moment que je n'ai plus fait de Basic MSX.
C'est donc RND() qu'il faut utiliser pour obtenir un nombre au hasard.

la plupart du temps on fait R=RND(-TIME) qui donne un nombre au hasard entre 0.0000 et 1.0000, le -TIME étant juste un façon d'ajouter du hasard (c'est la 'graine' pour que RND soit un peu plus aléatoire). Si on veut un nombre entre 0 et 3 par exemple, on multiplie par 3 ce nombre et on conserve la partie entière, cela donne ;

R=INT(RND(-TIME) * 3)


   
6502man Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 19/08/2013 à 18h14

Messages: 815

Le 17/07/2018 à 16h05
Le BASIC des MSX2 est très puissants pour tout ce qui est graphique comparativement à d'autres machines 8 bits.

Et Igal nous le prouve avec ces expérimentations :) Edité par 6502man Le 17/07/2018 à 16h11


Site web    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie