La Place des Développeurs [EN COURS] VDP Flash Pipeline Expérimentations Quelques applications sur l'approche Flash
igal
Membre non connecté
Conseiller Municipal
Reprise du message précédent
Après avoir réfléchi je vais prendre une orientation différente concernant le saut des héros.Il existe deux façons de sauter dans les jeux vidéo.
1) Le saut ouvert.
2) Le saut prédéterminé.
1) Le saut ouvert.
Le saut que j'appelle "ouvert" consiste à laisser au joueur la possibilité de modifier la direction du héro alors qu'il est déjà dans les airs!
Un problème se pose lorsqu'on veut donner la possibilité à un second héro de sauter et donc de modifier lui aussi son saut alors qu'il est dans les airs.
Ce saut se présente actuellement en trois phases:
1) L'ascension:
Il s'agit d'un boucle qui diminue la valeur Y du héro tout en offrant la possibilité de modifier la valeur X.
L'élévation est donc dirigeable.
2) L'apesanteur:
Y n'est donc pas influé mais X est modifié selon les input du joueur.
1) La dépression:
Tout comme la phase d'ascension, la dépression est une boucle qui va influer sur Y mais en additionnant la valeur soustraire lors de l'ascension et encore une fois, le joueur à loisir d'infléchir le lieu de chute en agissant sur l''axe X à chaque cycle de cette boucle.
Toutes ces opérations ne posent aucun problème à piloter un second héro dans le même temps puisqu'il suffit de placer un GOSUB au début de chaque phase (boucle) pour permettre le déplacement dans les 8 directions possibles.
Par contre, lorsque l'on souhaite faire sauter un second héro alors qu'un des deux est déjà dans sa phase de saut (donc dans l'une trois boucles), la phase est "mise en veille" jusqu'à ce que le second héro ait accompli l'entièreté de son saut pour que "la main soit rendue" au premier héro qui "sortira de sa léthargie" pour finir l'accomplissement de ses boucles de saut.
Continuer dans cette voix m'obligerait à prévoir une multitude de combinaisons possible entre les trois phases de saut des deux héros tout en tenant compte de la boucle en cours pour chacun des joueurs.
Disons:
3 ou 6 boucles pour l'élévation, 2 boucles pour l'apesanteur, 3 ou 6 boucles pour la dépression et le tout multiplié par 2 joueurs et c'est pas fini...
Soit:
3 x 2 x 3 => 18 possibilités multipliées par 2 jours, ce qui nous donne 36 phases possibles.
A ces 36 possibilités, il faut implémenter une "chiée" de GOSUB afin de permettre l’entrelacement des mouvements à tour de rôle etc etc...
2) Le saut prédéterminé.
J'appelle le saut prédéterminé le saut que l'on retrouve dans "Vampire Killer".
Contrairement au "saut ouvert", le "saut prédéterminé" s'imbrique dans la boucle principale.
En effet, la prédétermination consiste à imbriquer simplement les phases d'élévation, apesanteur et dépression à l'intérieur du moteur principal.
Par contre, il nécessite principalement l'ajout d'un "interrupteur" qui indique si le héro est déjà dans une des phases de saut afin d'empêcher un "double" ou encore "triple" saut ainsi que quelques autres variables qui indiquent quelle phase du saut est en cours.
Le point faible étant la prise en charge de Variables supplémentaires à chaque cycle du moteur principal mais ce sera le prix à payer pour rendre possible la gestion intégrale et indépendante des deux héros simultanément.
Voila donc pour la suite du programme Edité par igal Le 29/07/2018 à 07h35
igal
Membre non connecté
Conseiller Municipal
J'ai passé quelques heures à rationaliser le processus pour en faire quelque chose de plus malléable.
Voici le contenu du sous programme de SAUT que je souhaite intégrer au moteur principale et non plus l'aborder comme un sous programme.
Ne soyez pas surpris par les formules du genre GS=GS ou encore DS=DS.
Cela me permet d'avoir une meilleur visualisation de l'ensemble des variables simplement parce que je les vois comme "classées par colonnes"
Je n'ai plus qu'à en synthétiser une formule intégrable au moteur principal
Voici le contenu du sous programme de SAUT que je souhaite intégrer au moteur principale et non plus l'aborder comme un sous programme.
Code TEXT :
12206 *******EVALUATION AVANT SAUT********* 12208 'evalue la hauteur du hero pour permettre ou refuser le saut 12270 IF F < 100 THEN RETURN 12286 '**********ELEVATION***************** 12288 'evalue le nombre de boucle pour basculer a l etape suivante 12290 IFQB=NBTHEN12570ELSEQB=QB+1 12310 GOSUB17000:T=STICK(1):ONT+1GOTO12330,12350,12370,12390,12410,12430,12450,12470,12490:GOTO12310 12330 GOTO12520 12350 GOTO12520 12370 DS=25:GS=0:E=E+4:GOSUB18000:GOTO12520 12390 DS=25:GS=0:E=E+4:GOSUB18000:GOTO12520 12410 DS=75:GS=0:E=E+4:GOSUB18000:GOTO12520 12430 GOTO12500 12450 DS=75:GS=II:E=E-4:GOSUB19000:GOTO12520 12470 DS=25:GS=II:E=E-4:GOSUB19000:GOTO12520 12490 DS=25:GS=II:E=E-4:GOSUB19000:GOTO12520 12519 'indique la hauteur globale de la mise en tampon du decors 12520 F=F-FB*2 12530 COPY(E-EA,F)-(E+AI+EB,F+FA+AW+FB),1TO(VA,VC),1 12540 COPY(DS+GS,AP)-(DS+24+GS,AC),1TO(VA+EA,VC),1,TPSET 12550 COPY(VA,VC)-(VB,VD),1 TO (E-EA,F),0 12559 'renvoie en debut de boucle d elevation 12560 GOTO12290 12566 '************APESANTEUR*************** 12567 'Pas d evaluation du nombre de boucle pour basculer a l etape suivante 12568 'Pas de IF QB 12570 GOSUB17000:T=STICK(1):ONT+1GOTO12572,12574,12576,12578,12580,12582,12584,12586,12588:GOTO12570 12572 GOTO12610 12574 GOTO12610 12576 DS=DS:GS=GS:E=E+4:GOSUB18000:GOTO12610 12578 DS=DS:GS=GS:E=E+4:GOSUB18000:GOTO12610 12580 DS=DS:GS=GS:E=E+4:GOSUB18000:GOTO12610 12582 GOTO 12610 12584 DS=DS:GS=GS:E=E-4:GOSUB19000:GOTO12610 12586 DS=DS:GS=GS:E=E-4:GOSUB19000:GOTO12610 12588 DS=DS:GS=GS:E=E-4:GOSUB19000:GOTO12610 12609 'Pas de modification de la hauteur globale du tampon du decors 12610 F=F 12620 COPY(E-EA,F)-(E+AI+EB,F+FA+AW+FB),1TO(VA,VC),1 12630 COPY(DS+GS,AP)-(DS+24+GS,AC),1TO(VA+EA,VC),1,TPSET 12640 COPY(VA,VC)-(VB,VD),1TO(E-EA,F),0 12642 'Pas de renvoi a la boucle d apesanteur 12644 'Pas de GOTO! 12656 '**********DEPRESSION**************** 12658 'evalue le nombre de boucle pour retour au moteur principal 12660 IFQB=0THENRETURNELSEQB=QB-1 12680 GOSUB17000:T=STICK(1):ONT+1GOTO12700,12720,12740,12760,12780,12800,12820,12840,12860:GOTO12680 12700 GOTO12870 12720 GOTO12870 12740 DS=25:GS=0:E=E+4:GOSUB18000:GOTO12870 12760 DS=25:GS=0:E=E+4:GOSUB18000:GOTO12870 12780 DS=75:GS=0:E=E+4:GOSUB18000:GOTO12870 12800 GOTO 12870 12820 DS=75:GS=II:E=E-4:GOSUB19000:GOTO12870 12840 DS=25:GS=II:E=E-4:GOSUB19000:GOTO12870 12860 DS=25:GS=II:E=E-4:GOSUB19000:GOTO12870 12870 COPY(E-EA,F-4)-(E+AI+EB,F+FA+AW+FB-4),1TO(VA,VC),1 12880 COPY(DS+GS,AP)-(DS+24+GS,AC),1TO(VA+EA,VC+8),1,TPSET 12890 COPY(VA,VC)-(VB,VD),1TO(E-EA,F-4),0
Ne soyez pas surpris par les formules du genre GS=GS ou encore DS=DS.
Cela me permet d'avoir une meilleur visualisation de l'ensemble des variables simplement parce que je les vois comme "classées par colonnes"
Je n'ai plus qu'à en synthétiser une formule intégrable au moteur principal
igal
Membre non connecté
Conseiller Municipal
J'ai pas mal cogité et je pense avoir trouvé la solution.
Tout d'abord il faut considérer le saut comme trois étapes distinctes.
La combinaison de ces trois étapes donne l'illusion d'un saut.
La seconde étape toute seule correspond à un survol.
La troisième toute seule correspond à une chute.
Décomposer les trois étapes de la sorte permet donc un max de scénari.
La question doit donc se poser à l'envers à savoir:
Comment faire succéder ces trois étapes sans suspendre le déroulement du moteur.
La réponse est la suivante.
Il faut utiliser des "clefs" qui permettent dimbriquer une tâche supplémentaire au moteur.
Il faut voir le system comme un jeu de poupées russes que l'on ouvre par un GOSUB pour accéder à...
1) la variable du groupe à mettre en œuvre.
Par exemple, lensemble de poupées russes à mettre en œuvre pour un saut doit être perçu de la sorte.
Sa=elevation
Sb=apesanteur
Sc=depression
Si sa=1 alors processus d'élévation à mettre en branle.
Si sa=0 alors voir sb
Si sb=1 alors processus apesanteur à mettre en branle.
Si sb=0 alors voir SC.
Si SC=1 alors processus dépression à être en branle.
Ces trois conditions positives ou négatives sont en réalité une poupée interne de profondeur 1.
La première poupée à examiner est la poupée 0.
Voici la formule qui permet de savoir si il faut l'ouvrir.
Sa+sb+sc=sd
Si SD est différent de 0 alors ouvrir la poupée de profondeur 0 pour accéder à la poupée 1 autrement passer à l'étape suivante.
Si bouton de tir actif alors ouvrir la poupée 0 pour accéder à la poupée 1.
Quelque soit la profondeur de la poupée à atteindre, le principe reste le même.
Au final, si aucun bouton n'est utilisé, deux conditions IF sont ajoutées au moteur principal.
100 if sd>0thengosub200
110 ifstrig(0)thengosub300
200 idention de la profondeur de la poupée à atteindre.
210 si sa=1 alors ouvrir la poupée 1
220 si sb=1 alors poupée 2
230 si sc=1 alors 3
300 processus pour élévation...
310 si élévation est au cycle 1 alors = cycle +1 return
La y a toute la machinerie à adapter...
Voilà dans les grandes lignes.
Tout d'abord il faut considérer le saut comme trois étapes distinctes.
La combinaison de ces trois étapes donne l'illusion d'un saut.
La seconde étape toute seule correspond à un survol.
La troisième toute seule correspond à une chute.
Décomposer les trois étapes de la sorte permet donc un max de scénari.
La question doit donc se poser à l'envers à savoir:
Comment faire succéder ces trois étapes sans suspendre le déroulement du moteur.
La réponse est la suivante.
Il faut utiliser des "clefs" qui permettent dimbriquer une tâche supplémentaire au moteur.
Il faut voir le system comme un jeu de poupées russes que l'on ouvre par un GOSUB pour accéder à...
1) la variable du groupe à mettre en œuvre.
Par exemple, lensemble de poupées russes à mettre en œuvre pour un saut doit être perçu de la sorte.
Sa=elevation
Sb=apesanteur
Sc=depression
Si sa=1 alors processus d'élévation à mettre en branle.
Si sa=0 alors voir sb
Si sb=1 alors processus apesanteur à mettre en branle.
Si sb=0 alors voir SC.
Si SC=1 alors processus dépression à être en branle.
Ces trois conditions positives ou négatives sont en réalité une poupée interne de profondeur 1.
La première poupée à examiner est la poupée 0.
Voici la formule qui permet de savoir si il faut l'ouvrir.
Sa+sb+sc=sd
Si SD est différent de 0 alors ouvrir la poupée de profondeur 0 pour accéder à la poupée 1 autrement passer à l'étape suivante.
Si bouton de tir actif alors ouvrir la poupée 0 pour accéder à la poupée 1.
Quelque soit la profondeur de la poupée à atteindre, le principe reste le même.
Au final, si aucun bouton n'est utilisé, deux conditions IF sont ajoutées au moteur principal.
100 if sd>0thengosub200
110 ifstrig(0)thengosub300
200 idention de la profondeur de la poupée à atteindre.
210 si sa=1 alors ouvrir la poupée 1
220 si sb=1 alors poupée 2
230 si sc=1 alors 3
300 processus pour élévation...
310 si élévation est au cycle 1 alors = cycle +1 return
La y a toute la machinerie à adapter...
Voilà dans les grandes lignes.
Visiteur
Vagabond
Message : 0
Impressionnant!
Personnellement j'aime bien les poupées mais je vois l'algo plus "simplement" avec une boucle sans aucune fonction qui attend ou arrête le programme :
phase_joueur : au_sol, saut_ascension, saut_descente (et saut_suspension, mais je n'ai pas compris l'intérêt)
DEBUT_BOUCLE_PRINCIPALE:
fonction COMPTEUR (entrée: compteur, sortie: compteur) ; permet de régler la vitesse du jeu, le compteur va de 0 à N par incrément de 1 à chaque unité de temps et arrivé à N:retour à 0)
fonction TEST CLAVIER/JOYSTICK (entrée: rien, sortie: direction_joueur, bouton_action)
fonction DEPLACEMENT JOUEUR (entrée: direction_joueur phase_joueur, sortie: position_joueur)
fonction SAUT JOUEUR (entrée: bouton_action phase_joueur, sortie: position_joueur phase_joueur)
fonction DEPLACEMENT ENNEMI (entrée: position_joueur, position_ennemi, etc... sortie: position_ennemi)
fonction SAUT ENNEMI (entrée: position_ennemi phase_ennemi, sortie: position_ennemi phase_ennemi)
fonction AFFICHAGE JOUEUR (entrée: position_joueur)
fonction AFFICHAGE ENNEMI (entrée: position_ennemi)
GOTO DEBUT_BOUCLE_PRINCIPALE
à l'intérieur des fonctions on réalise les actions si le compteur est inférieur à une valeur fixée, cela permet de régler la vitesse du jeu et la difficulté)
Personnellement j'aime bien les poupées mais je vois l'algo plus "simplement" avec une boucle sans aucune fonction qui attend ou arrête le programme :
phase_joueur : au_sol, saut_ascension, saut_descente (et saut_suspension, mais je n'ai pas compris l'intérêt)
DEBUT_BOUCLE_PRINCIPALE:
fonction COMPTEUR (entrée: compteur, sortie: compteur) ; permet de régler la vitesse du jeu, le compteur va de 0 à N par incrément de 1 à chaque unité de temps et arrivé à N:retour à 0)
fonction TEST CLAVIER/JOYSTICK (entrée: rien, sortie: direction_joueur, bouton_action)
fonction DEPLACEMENT JOUEUR (entrée: direction_joueur phase_joueur, sortie: position_joueur)
fonction SAUT JOUEUR (entrée: bouton_action phase_joueur, sortie: position_joueur phase_joueur)
fonction DEPLACEMENT ENNEMI (entrée: position_joueur, position_ennemi, etc... sortie: position_ennemi)
fonction SAUT ENNEMI (entrée: position_ennemi phase_ennemi, sortie: position_ennemi phase_ennemi)
fonction AFFICHAGE JOUEUR (entrée: position_joueur)
fonction AFFICHAGE ENNEMI (entrée: position_ennemi)
GOTO DEBUT_BOUCLE_PRINCIPALE
à l'intérieur des fonctions on réalise les actions si le compteur est inférieur à une valeur fixée, cela permet de régler la vitesse du jeu et la difficulté)
igal
Membre non connecté
Conseiller Municipal
Salut Sylvain:
Si je me trompe pas, c'est la voix que j'ai pris (plus ou moins).
Voici quelques explications.
La suspension est la phase intermédiaire entre [Elévation] et [Depression].
Cette phase [Apesanteur] donne pour résulta visuel un [Saut] à forme de [Cloche].
Généralement, on intègre à la phase [Apesanteur], la possibilité de se déplacer [Vers la Droite] ou [Vers la Gauche].
C'est d'ailleurs pour cette raison que j'avais [détaché] l'entièreté de la phase de [Saut] (élévation+apesanteur+depression) du moteur principal.
En repensant la chose, je suis arrivé à visualisé une solution complète permettant (en théorie) "l'entrelacement" total des éléments suivants:
Héro 1 (ou ennemi) + Héro 2 (ou ennemi) + Scrolling.
Voici en formule ce que cela donne:
Nb: J'ai pas terminé l'implantation théorique!
1) Les nouvelles variables prérequises:
2) les nouvelles commandes à ajouter au moteur principal:
Les phase d'élévation fait référence à la variable NB telle que => IFQB=NBTHENSA=1
La valeur de NB est en fait le nombre de cycles que l'on souhaite obtenir lors de l'élévation.
QB est le nombre de cycles déjà effectué.
Si le nombre de cycles actuel QB est égal au desiderata NB alors la phase d'élévation est complète et donc SA (interrupteur permettant l'ouverture d'une nouvelle couche en profondeur) est égal à UN!
A partir de là lorsque l'on repasse par le moteur principal (à chaque cycle donc), si SD est différent de ZERO (autrement dit, si une des phases [Elevation], [Apesanteur] ou encore [Dépression] ne sont pas complètement effectuées, le moteur retournera vers "ses poupées russes" à la profondeur requise afin de répéter l'opération.
Cette sous boucle en profondeur sera répétée jusqu'à ce que la (ou les) phases mises en branle(s) soient complètement terminées.
La démonstration de la complétude de ses sous boucles en profondeur est déterminée par:
SA => profondeur niveau 0 si = 1
SB => profondeur niveau 1 si = 1
SC => profondeur niveau 2 si = 1
Si n'importe laquelle de ces étapes est inaccomplie, alors SD est supérieur à 0 puisque:
SD = SA + SB + SC
Encore une fois, la seule charge supplémentaire au moteur est l'ajout des deux commandes suivantes:
Au final on obtient cette boucle par joueur (ou ennemie ou objet quelconque en réalité)
10799 T=STICK(1):ONT+1GOSUB10780,10890,11060,11250,11420,11590,11740,11910,12080:COPY(E-EA,F-FA)-(E+AI+EB,F+AW+FB),1TO(VA,VC),1:COPY(0+GS+DS,AP)-(24+GS+DS,AC),1TO(VA+EA,VC+FA),1,TPSET:COPY(VA,VC)-(VB,VD),1TO(E-EA,F-FA),0
10800 IFSD>0THEN10820
10810 IFSTRIG(1)THENIFF<100THENRETURNELSE10820
10811 GOTO 10799
Le seconde joueur ( ou ennemi quelconque) on doit ajouter:
1799 S=STICK(0):ONS+1GOSUB780,890,1060,1250,1420,1590,1740,1910,2080:COPY(ZM-ZA,ZL-ZB)-(ZM+ZG+ZC,ZL+ZH+ZD),1TO(ZV,ZX),1:COPY(0+ZK+ZI,ZE)-(24+ZK+ZI,ZF),1TO(ZV+ZA,ZX+ZB),1,TPSET:COPY(ZV,ZX)-(ZW,ZY),1TO(ZM-ZA,ZL-ZB),0
1800 IFSD>0THEN1820
1810 IFSTRIG(1)THENIFF<100THENRETURNELSE1820
1820 GOTO 1799
Ca devrait fonctionner en laissant suffisamment de ressources pour y ajouter par exemple un [ascenseur]
Si je me trompe pas, c'est la voix que j'ai pris (plus ou moins).
Voici quelques explications.
La suspension est la phase intermédiaire entre [Elévation] et [Depression].
Cette phase [Apesanteur] donne pour résulta visuel un [Saut] à forme de [Cloche].
Généralement, on intègre à la phase [Apesanteur], la possibilité de se déplacer [Vers la Droite] ou [Vers la Gauche].
C'est d'ailleurs pour cette raison que j'avais [détaché] l'entièreté de la phase de [Saut] (élévation+apesanteur+depression) du moteur principal.
En repensant la chose, je suis arrivé à visualisé une solution complète permettant (en théorie) "l'entrelacement" total des éléments suivants:
Héro 1 (ou ennemi) + Héro 2 (ou ennemi) + Scrolling.
Voici en formule ce que cela donne:
Nb: J'ai pas terminé l'implantation théorique!
1) Les nouvelles variables prérequises:
Code TEXT :
10792 SA=0:SB=0:SC=0:SD=SA+SB+SC 10794 AA=0:AB=2 10796 CA=F-4
2) les nouvelles commandes à ajouter au moteur principal:
Code TEXT :
10800 SI UN CYCLE DE SAUT EST DEJA EN COURS ALORS*********** 10800 IFSD>0THEN10820 10802 SI TIR ALORS SI HERO PLUS HAUT QUE LIGNE 100 ALORS**** 10810 IFSTRIG(1)THENIFF<100THENRETURNELSE10820 SI SA EST TERMINE ALORS ALLER VERS APESANTEUR********* 10820 IFSA=1THEN1860 INCREMENTATION DE LA BOUCLE ELEVATION ET ************* 10830 QB=QB+1 DECREMENTATION VARIABLE LATITUDE DU HERO************** 10840 F=F-FB*2 INCREMENTATION TERMINEE ALORS SA=1******************** 10850 IFQB=NBTHENSA=1 COPY DES DIFFERENTES PHASES D ANIMATION DES SAUTS***** 10852 COPY(E-EA,F)-(E+AI+EB,F+FA+AW+FB),1TO(VA,VC),1 CE COPY EST COMPATIBLE avec ELEVATION ET APESANTEUR 10854 COPY(DS+GS,AP)-(DS+24+GS,AC),1TO(VA+EA,VC),1,TPSET ****************************************************** 10856 COPY(VA,VC)-(VB,VD),1TO(E-EA,F),0 SI DEPLACCEMENT H TERMINE ALORS ALLER VERS DEPRESSION* 10860 IFSB=1THEN1890 INTCREMENTATION DE LA BOUCLE APESANTEUR*************** 10870 AA=AA+1 SI FACE A DROITE VA 0 DROITE AUTREMENT VA GAUCHE 10870 IFGS=0THENE=E+4ELSEE=E-4 INCREMENTATION TERMINEE ALORS SB=1******************** 10880 IFAA=ABTHENSB=1 COPY DES DIFFERENTES PHASES D ANIMATION DES SAUTS***** 10872 COPY(E-EA,F)-(E+AI+EB,F+FA+AW+FB),1TO(VA,VC),1 CE COPY EST COMPATIBLE avec ELEVATION ET APESANTEUR 10874 COPY(DS+GS,AP)-(DS+24+GS,AC),1TO(VA+EA,VC),1,TPSET ****************************************************** 10876 COPY(VA,VC)-(VB,VD),1TO(E-EA,F),0 SI DEPRESSION TERMINEE ALORS SD=0********************* 18890 IFSC=1THENSD=0 AJOUT DES VARIABLES CA=F-4,CB=FB-4 ET CC=VC+8********* 18900 CA=F-4:CB=FB-4:CC=VC+8 COPY DES DIFFERENTES PHASES D ANIMATION DES SAUTS***** 12870 COPY(E-EA,F-4)-(E+AI+EB,F+FA+AW+FB-4),1TO(VA,VC),1 **************************************************** 12880 COPY(DS+GS,AP)-(DS+24+GS,AC),1TO(VA+EA,VC+8),1,TPSET ****************************************************** 12890 COPY(VA,VC)-(VB,VD),1TO(E-EA,F-4),0
Les phase d'élévation fait référence à la variable NB telle que => IFQB=NBTHENSA=1
La valeur de NB est en fait le nombre de cycles que l'on souhaite obtenir lors de l'élévation.
QB est le nombre de cycles déjà effectué.
Si le nombre de cycles actuel QB est égal au desiderata NB alors la phase d'élévation est complète et donc SA (interrupteur permettant l'ouverture d'une nouvelle couche en profondeur) est égal à UN!
A partir de là lorsque l'on repasse par le moteur principal (à chaque cycle donc), si SD est différent de ZERO (autrement dit, si une des phases [Elevation], [Apesanteur] ou encore [Dépression] ne sont pas complètement effectuées, le moteur retournera vers "ses poupées russes" à la profondeur requise afin de répéter l'opération.
Cette sous boucle en profondeur sera répétée jusqu'à ce que la (ou les) phases mises en branle(s) soient complètement terminées.
La démonstration de la complétude de ses sous boucles en profondeur est déterminée par:
SA => profondeur niveau 0 si = 1
SB => profondeur niveau 1 si = 1
SC => profondeur niveau 2 si = 1
Si n'importe laquelle de ces étapes est inaccomplie, alors SD est supérieur à 0 puisque:
SD = SA + SB + SC
Encore une fois, la seule charge supplémentaire au moteur est l'ajout des deux commandes suivantes:
Code TEXT :
10800 SI UN CYCLE DE SAUT EST DEJA EN COURS ALORS*********** 10800 IFSD>0THEN10820 10802 SI TIR ALORS SI HERO PLUS HAUT QUE LIGNE 100 ALORS**** 10810 IFSTRIG(1)THENIFF<100THENRETURNELSE10820
Au final on obtient cette boucle par joueur (ou ennemie ou objet quelconque en réalité)
10799 T=STICK(1):ONT+1GOSUB10780,10890,11060,11250,11420,11590,11740,11910,12080:COPY(E-EA,F-FA)-(E+AI+EB,F+AW+FB),1TO(VA,VC),1:COPY(0+GS+DS,AP)-(24+GS+DS,AC),1TO(VA+EA,VC+FA),1,TPSET:COPY(VA,VC)-(VB,VD),1TO(E-EA,F-FA),0
10800 IFSD>0THEN10820
10810 IFSTRIG(1)THENIFF<100THENRETURNELSE10820
10811 GOTO 10799
Le seconde joueur ( ou ennemi quelconque) on doit ajouter:
1799 S=STICK(0):ONS+1GOSUB780,890,1060,1250,1420,1590,1740,1910,2080:COPY(ZM-ZA,ZL-ZB)-(ZM+ZG+ZC,ZL+ZH+ZD),1TO(ZV,ZX),1:COPY(0+ZK+ZI,ZE)-(24+ZK+ZI,ZF),1TO(ZV+ZA,ZX+ZB),1,TPSET:COPY(ZV,ZX)-(ZW,ZY),1TO(ZM-ZA,ZL-ZB),0
1800 IFSD>0THEN1820
1810 IFSTRIG(1)THENIFF<100THENRETURNELSE1820
1820 GOTO 1799
Ca devrait fonctionner en laissant suffisamment de ressources pour y ajouter par exemple un [ascenseur]
igal
Membre non connecté
Conseiller Municipal
igal
Membre non connecté
Conseiller Municipal
Salut Sylvain.
Comme toutes les histoires d'amour, c'est compliqué lol.
Utilisant du basic, je me contente de la commande SET SCROLL propre au msx2plus.
Nb: j'ai longtemps rêvé d'une solution clef en main du genre... Une routine assembleur paramétrable depuis quelques valeurs à entrer dans un petit listing en basic..
Cela me permettrait de rendre accessible certaines de mes expérimentations aux processeurs de ms 2.
D'autant qu'un simple msx2plus ne suffit pas puisqu'il faut que ce msx embarque la capacité de numériser comme le nms8280 puisque c'est la base du vdp flash pipeline
Les graphismes sont ceux de AXELAY un bijou signé Konami sur super Nintendo.
Jai passé plus de dix heures à extraire des saisies d'écran d'une séquence vidéo HD sur YouTube.
La partie en rose sera transparente et permettra la superimpose d'un scrool multi directionnel en fond d'écran
Le reste sera prédécoupé et stocké sous forme de bribes qu'il suffira de charger par COPY.
@Jipe: j'ai souvent supprimé des postes en les relisant de peur d'être pris pour un fou lol
(fou de msx )
Comme toutes les histoires d'amour, c'est compliqué lol.
Utilisant du basic, je me contente de la commande SET SCROLL propre au msx2plus.
Nb: j'ai longtemps rêvé d'une solution clef en main du genre... Une routine assembleur paramétrable depuis quelques valeurs à entrer dans un petit listing en basic..
Cela me permettrait de rendre accessible certaines de mes expérimentations aux processeurs de ms 2.
D'autant qu'un simple msx2plus ne suffit pas puisqu'il faut que ce msx embarque la capacité de numériser comme le nms8280 puisque c'est la base du vdp flash pipeline
Les graphismes sont ceux de AXELAY un bijou signé Konami sur super Nintendo.
Jai passé plus de dix heures à extraire des saisies d'écran d'une séquence vidéo HD sur YouTube.
La partie en rose sera transparente et permettra la superimpose d'un scrool multi directionnel en fond d'écran
Le reste sera prédécoupé et stocké sous forme de bribes qu'il suffira de charger par COPY.
@Jipe: j'ai souvent supprimé des postes en les relisant de peur d'être pris pour un fou lol
(fou de msx )
igal
Membre non connecté
Conseiller Municipal
Voici une autre approche VDPFP avec buffering des décors sur la droite et sur la gauche du héro simultanément.
A la différence de l'approche habituelle qui consiste à "buffériser" une seule direction du scroll (habituellement la droite) et qui de facto rend impossible le scrolling dans le sens inverses et donc empêche un retour sur ses pas, cette technique rend possible le scrolling dans les deux sens
En effet, pour permettre un scrolling dans les deux sens, il faut impérativement avoir "stocké" les décors de "droite <et> gauche" simultanément quelque part!
Avant d'aller plus loin dans les explications, voici en image, la mise en pratique de la technique.
L'image panoramique tout en bas:
Il s'agit du panorama de l'image source en l’occurrence un stage de Rayman.
Nb: Il est prévu que le fond soit en Color Zéro pour "superimposer" un décors de fond en arrière plan
Juste au dessus:
Une première étape consiste à découper le niveau en block de 256X212.
Nb: J'ai décidé arbitrairement que le Héro apparaîtra sur la page tout à droite nommée "Page Primaire".
Nb2: Si le premier [Input] est la direction [Droite] alors X (le héro) s'affichera tel que X=128+largeur quelconque du Sprite.
Nb3: Si le premier [Input] est la direction [Gauche] alors X (le héro) s'affichera tel que X=128-largeur quelconque du Sprite.
Encore plus haut (Les images numérotées 0,1, 2, etc...):
Nous entrons dans le vif du sujet
Ici, il est nécessaire de [Déconstruire] les décors de telle sorte à ce que chaque page à crescendo contienne les [Décors Droite+ Décors Gauche] de la page sur laquelle se trouve à l'instant [T] le héro!
Concrètement:
Le héro héro prend naissance sur la page [Primaire] avec premier [Input Droite]!
L'image à VDPFP est donc la page 7 qui contient => D1 (décors devant scrollés à droite) mais aussi G8 (décors disparaissant à la gauche de l'écran)
En conclusion:
La déconstruction d'une mappe nécessite le double d'images qu'à son original soit 8 pages à flasher pour 4 pages de large à l'origine de la mappe.
Une page Primaire désignée arbitrairement est primordiale afin de débuter la déconstruction des décors.
La déconstruction se fait ainsi:
Page 0 contient G1 / D8
Page 1 contient G2 / D7
Page 2 contient G3 / D6
Page 3 contient G4 / D5
Page 4 contient G5 / D4
Page 5 contient G6 / D3
Page 6 contient G7 / D2
Page 7 contient G8 / D1
J'essaierai de mettre cela en pratique dans les semaines qui viennent et poster une vidéo en fonctionnement avec la super impose en arrière plan
Voici l'image d'arrière plan à utiliser en super-impose.
Edité par igal Le 01/12/2018 à 18h00
A la différence de l'approche habituelle qui consiste à "buffériser" une seule direction du scroll (habituellement la droite) et qui de facto rend impossible le scrolling dans le sens inverses et donc empêche un retour sur ses pas, cette technique rend possible le scrolling dans les deux sens
En effet, pour permettre un scrolling dans les deux sens, il faut impérativement avoir "stocké" les décors de "droite <et> gauche" simultanément quelque part!
Avant d'aller plus loin dans les explications, voici en image, la mise en pratique de la technique.
L'image panoramique tout en bas:
Il s'agit du panorama de l'image source en l’occurrence un stage de Rayman.
Nb: Il est prévu que le fond soit en Color Zéro pour "superimposer" un décors de fond en arrière plan
Juste au dessus:
Une première étape consiste à découper le niveau en block de 256X212.
Nb: J'ai décidé arbitrairement que le Héro apparaîtra sur la page tout à droite nommée "Page Primaire".
Nb2: Si le premier [Input] est la direction [Droite] alors X (le héro) s'affichera tel que X=128+largeur quelconque du Sprite.
Nb3: Si le premier [Input] est la direction [Gauche] alors X (le héro) s'affichera tel que X=128-largeur quelconque du Sprite.
Encore plus haut (Les images numérotées 0,1, 2, etc...):
Nous entrons dans le vif du sujet
Ici, il est nécessaire de [Déconstruire] les décors de telle sorte à ce que chaque page à crescendo contienne les [Décors Droite+ Décors Gauche] de la page sur laquelle se trouve à l'instant [T] le héro!
Concrètement:
Le héro héro prend naissance sur la page [Primaire] avec premier [Input Droite]!
L'image à VDPFP est donc la page 7 qui contient => D1 (décors devant scrollés à droite) mais aussi G8 (décors disparaissant à la gauche de l'écran)
En conclusion:
La déconstruction d'une mappe nécessite le double d'images qu'à son original soit 8 pages à flasher pour 4 pages de large à l'origine de la mappe.
Une page Primaire désignée arbitrairement est primordiale afin de débuter la déconstruction des décors.
La déconstruction se fait ainsi:
Page 0 contient G1 / D8
Page 1 contient G2 / D7
Page 2 contient G3 / D6
Page 3 contient G4 / D5
Page 4 contient G5 / D4
Page 5 contient G6 / D3
Page 6 contient G7 / D2
Page 7 contient G8 / D1
J'essaierai de mettre cela en pratique dans les semaines qui viennent et poster une vidéo en fonctionnement avec la super impose en arrière plan
Voici l'image d'arrière plan à utiliser en super-impose.
Edité par igal Le 01/12/2018 à 18h00
igal
Membre non connecté
Conseiller Municipal
Voici un pack contenant toutes les images à VDPFP ainsi que le Background à afficher en arrière plan par le biais de la Superimpose.
Rayman VDPFP 001.zip
Nb: La partie en Noir doit être considérée comme transparente. La partie Gris foncé est perçu comme du Noir pour la palette MSX
Voici les images à VDPFP:
0.BMP
1.BMP
2.BMP
3.BMP
4.BMP
5.BMP
6.BMP
7.BMP
Voici l'image à superimposer:
BackGrnd.BMP
Voici l'image à afficher sur MSX en Screen 8, Screen 10 ou encore Screen 12.
Primaire:
Edité par igal Le 01/12/2018 à 17h58
Rayman VDPFP 001.zip
Nb: La partie en Noir doit être considérée comme transparente. La partie Gris foncé est perçu comme du Noir pour la palette MSX
Voici les images à VDPFP:
0.BMP
1.BMP
2.BMP
3.BMP
4.BMP
5.BMP
6.BMP
7.BMP
Voici l'image à superimposer:
BackGrnd.BMP
Voici l'image à afficher sur MSX en Screen 8, Screen 10 ou encore Screen 12.
Primaire:
Edité par igal Le 01/12/2018 à 17h58
igal
Membre non connecté
Conseiller Municipal
Voici un mode hybride puisqu'il combine le VDPFP ainsi que le chargement de bribes par pas de 4 pixels permettant un scrolling Droite <= => Gauche la gestion des sauts.
Les bribes sont larges de 4 pixels de largeur et 106 pixels de hauteur.
Cela signifie qu'il faut donc 64 bribes (X 4pixels de larges) pour scroller les 256 pixels de large.
Les bribes faisant 106 pixels de hauteur, il faut donc un second pack de 64 bribes pour couvrir une zone totale de 256X212.
Au final, chaque page nécessite 128 bribes.
@ suivre
Edit:
Une petite mise à jour:
Edité par igal Le 20/12/2018 à 20h21
Les bribes sont larges de 4 pixels de largeur et 106 pixels de hauteur.
Cela signifie qu'il faut donc 64 bribes (X 4pixels de larges) pour scroller les 256 pixels de large.
Les bribes faisant 106 pixels de hauteur, il faut donc un second pack de 64 bribes pour couvrir une zone totale de 256X212.
Au final, chaque page nécessite 128 bribes.
@ suivre
Edit:
Une petite mise à jour:
Edité par igal Le 20/12/2018 à 20h21
igal
Membre non connecté
Conseiller Municipal
En gros, le principe est le même que celui présenté dans la vidéo ci dessous mais sans le scrolling.
Evidemment, à la différence de la vidéo ce dessous, les bribes à charger sont celles qui se trouvent [Juste à droite] ou [Juste à gauche] du héro selon la direction que ce même héro prend.
Au delà de cette astuce relativement simple, la "grande astuce" est de charger ses mêmes bribes en tampon sur la page "cachée" et ainsi construire sur cette page "le tampon exact" qui se trouve en arrière plan du héro.
De la sorte, on arrive à générer un tampon de la page complète dans un espace réduit
J'espère que c'est assez clair pour tout l'monde
Voici la vidéo démontrant la gestion des bribes droite <= => gauche chargées en temps réel.
voici la nouvelle mouture des images 0 et 1 destinées à être affichées en Screen 8, 10 ou 12.
Edité par igal Le 20/12/2018 à 20h36
Evidemment, à la différence de la vidéo ce dessous, les bribes à charger sont celles qui se trouvent [Juste à droite] ou [Juste à gauche] du héro selon la direction que ce même héro prend.
Au delà de cette astuce relativement simple, la "grande astuce" est de charger ses mêmes bribes en tampon sur la page "cachée" et ainsi construire sur cette page "le tampon exact" qui se trouve en arrière plan du héro.
De la sorte, on arrive à générer un tampon de la page complète dans un espace réduit
J'espère que c'est assez clair pour tout l'monde
Voici la vidéo démontrant la gestion des bribes droite <= => gauche chargées en temps réel.
voici la nouvelle mouture des images 0 et 1 destinées à être affichées en Screen 8, 10 ou 12.
Edité par igal Le 20/12/2018 à 20h36
igal
Membre non connecté
Conseiller Municipal
Bon finalement après avoir décortiqué le chlimblic, il n'y a même pas à charger de bribes puisqu'il suffit de buffériser judicieusement les parties du décors recouvertes par le héro + un Segment à sa droite si le Héro va à droite ou encore un Segment à sa gauche si le Héro va à Gauche.
Le nombre de copies se résume ainsi:
1) Copie d'un segment de largeur égale au déplacement souhaité depuis la page 0 vers la page 1. [08 pixels X 45 pixels]
2) Re-centralisation du Bloc Buffer en pratiquant une copie donc la largeur est égale à celle du héro. [32 pixels X 45 pixels]
3) Copie du Buffer vers le Bloc de travail. [32 pixels X 45 pixels]
4) Copie du Héro vers le Bloc de travail avec la transparence. [32 pixels X 45 pixels]
5) Copie résulta final du bloc de travail vers la page visible. [32 pixels X 45 pixels]
[= 130 pixels X 45 pixels réparties sur 5 copies]
Soit environ un neuvième d'écran copié à chaque déplacement du héro.
Ca fait pas mal d'opérations d'autant qu'à cela, il faut ajouter le support d'au moins 1 sprites placé sous les pieds du héro (afin de déterminer ses coordonnées et permettre le support des collisions) ainsi que quelques sprites qui seront les ennemis.
Les gros avantages sont les suivants:
1) Décors et Héro sont VDPFP.
2) Le héro est très détaillé avec de belles animations.
3) Un sprite réel sous la forme d'un trait noir horizontal est placé sous les pieds du Héro tel que X,Y.
4) Les ennemis sont de vrais sprites qui peuvent entrer facilement en collision avec le héro ou son "arme spritée" elle aussi
Voici le détail en image ce qui sera plus parlant.
Edité par igal Le 23/12/2018 à 20h05
Le nombre de copies se résume ainsi:
1) Copie d'un segment de largeur égale au déplacement souhaité depuis la page 0 vers la page 1. [08 pixels X 45 pixels]
2) Re-centralisation du Bloc Buffer en pratiquant une copie donc la largeur est égale à celle du héro. [32 pixels X 45 pixels]
3) Copie du Buffer vers le Bloc de travail. [32 pixels X 45 pixels]
4) Copie du Héro vers le Bloc de travail avec la transparence. [32 pixels X 45 pixels]
5) Copie résulta final du bloc de travail vers la page visible. [32 pixels X 45 pixels]
[= 130 pixels X 45 pixels réparties sur 5 copies]
Soit environ un neuvième d'écran copié à chaque déplacement du héro.
Ca fait pas mal d'opérations d'autant qu'à cela, il faut ajouter le support d'au moins 1 sprites placé sous les pieds du héro (afin de déterminer ses coordonnées et permettre le support des collisions) ainsi que quelques sprites qui seront les ennemis.
Les gros avantages sont les suivants:
1) Décors et Héro sont VDPFP.
2) Le héro est très détaillé avec de belles animations.
3) Un sprite réel sous la forme d'un trait noir horizontal est placé sous les pieds du Héro tel que X,Y.
4) Les ennemis sont de vrais sprites qui peuvent entrer facilement en collision avec le héro ou son "arme spritée" elle aussi
Voici le détail en image ce qui sera plus parlant.
Edité par igal Le 23/12/2018 à 20h05
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie