La Place des Développeurs [EN COURS] VDP Flash Pipeline Expérimentations Quelques applications sur l'approche Flash
igal
Membre non connecté
Conseiller Municipal
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
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:
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
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 :
Edité par
igal
Le 04/03/2018 à 11h32
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
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
http://msxvillage.fr/forum/topic.php?id=507&pt=2
regarde mowgli.zip et schtroumps.zip
igal
Membre non connecté
Conseiller Municipal
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:
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
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
igal
Membre non connecté
Conseiller Municipal
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.
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 :
Edité par
igal
Le 10/03/2018 à 17h23
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
SveN
Membre non connecté
Villageois
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 !!!
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
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
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
Edité par TurboSEB Le 11/03/2018 à 01h55
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
Edité par TurboSEB Le 11/03/2018 à 01h55
MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
igal
Membre non connecté
Conseiller Municipal
igal
Membre non connecté
Conseiller Municipal
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
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
Visiteur
Vagabond
Message : 0
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 )
- 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!
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 )
- 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
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
En tout cas, ça fait plaisir de partager des idées.
Bonne après midi à tous
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
En tout cas, ça fait plaisir de partager des idées.
Bonne après midi à tous
Visiteur
Vagabond
Message : 0
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)
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)
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie