msx logo

Maire-adjoint du
msx village france

msxosaure banniere

Traducteur sur

msx osaure accueilMSXosaure menu hautMSXosaure menu hautMSXosaure menu hautMSXosaure menu haut
 
 
 
Programmation
  SCR1.0
 
 

 Réalisation d'un petit jeu en Basic. Le jeu: SCR1.0, est un petit jeu d'échelle à la lode Runner/King's Valley et se veut surtotu un didacticiel pour la programmation de graphismes et autres astuces en mode SCREEN1.

Dans un premier temps il faut bien définir le programme, bien qu'en basic il soit plus facile de modifier un programme à posteriori. 

1. Création des sprites.

Pour le jeu on va faire 6 sprites de 8x8, screen1,0 oblige :
 4 pour le héros : face, coté1, dos, coté2
 2 méchants (fantôme et crâne)

Comme chacun sait les sprites sont constitués de points « allumés » et de points transparents. On attribue la valeur 0 au points transparents et 1 aux points allumés on se retrouve avec un code binaire de 8 bits (un octet). Pour nous faciliter la tache on traduit ce code binaire en décimale ou en hexadécimale :

Correspondance sur 4 bits:

 Exemple:


Pour les décimales il faut multiplier le premier quartet par 16 et lui additionner la valeur du deuxième quartet. Pour des raisons pratiques je lui préfère la représentation hexadécimale plus facile à manipuler.

On peut attaquer le programme :

1 'save"jeuscr1.bas"
5 KEY 1,"SCREEN0"+CHR$(13)
10 SCREEN1,0:COLOR11,1,1:WIDTH32:KEY OFF
20 LOCATE5,6:PRINT"MSXcaf‚ pr‚sente..."
50 '
51 ' Création sprites
52 '
60 FOR I=1TO6:A$=""
70 FOR J=1TO8: READ B$:A$=A$+CHR$(VAL("&H"+B$)):NEXTJ
80 SPRITE$(I)=A$:NEXTI
100 '
101 ' Data sprites
102 '
110 DATA 66,FF,DB,66,99,FF,7E,3C
120 DATA 36,6F,ED,F6,F9,FF,5E,3C
130 DATA 3C,7E,FF,FF,FF,BF,4E,3C
140 DATA 6C,F6,B7,6F,9F,FF,7A,3C
150 DATA 7C,FE,FE,BA,92,FE,FE,AA
160 DATA 3C,7E,DB,99,Ef,66,3C,34
200 '
201 ' Affichage sprites
202 '
210 FOR I=1TO6:PUT SPRITE I,(30+I*16,80+I*2),8,I:NEXTI
5000 '
5010 GOTO5000


La ligne 1 permet une sauvegarde rapide par F4 (list) + 1,
La ligne 5 permet de revenir au screen 0 et d’éviter de travailler sur l’écran de jeu, ce qui n’est pas très pratique.
La ligne 210 permet l’affichage des sprites pour vérifier les erreurs.

On charge les données du sprite dans une chaîne avant de les attribuer au N° du sprite, ce qui le charge en mémoire vidéo (Vidéo ram) dans la Table de générations des sprites (TGS). Vu que grâce à l’instruction VPOKE on peut écrire directement dans la Vidéo ram et que la TGS démarre à l’adresse 14366 (3800H en hexadécimale) on peut écrire les lignes 60 à 80 comme suit :

60 FOR I=1TO6*8
70 READ B$: VPOKE &H3807+I,(VAL("&H"+B$))
80 NEXT I


On stocke un octet par adresse, il faut 8 octets pour faire un sprite 8x8, (32 pour un 16x16) l’adresse du sprite N°1 est 3808H (3820H en 16x16), 3800H étant l’adresse du N°0 (Que je garde libre pour des raisons qui me sont propres). C’est censément plus rapide et plus court à écrire et autant se familiariser avec les VPOKE avant l’étape suivante.

 

2. Redéfinition des caractères.

On a 15 caractères à redéfinir, cela suffira pour le jeu. Les caractères redéfinis sont choisis en dehors des caractères d'imprimerie et des caractères graphiques de la première partie.
On sépare les objet en plusieurs catégories un groupe obstacle, un groupe décor actif ou non et intermédiaire pouvant interagir avec les mouvements du personnage.

 Leur répartition n'est pas optimum, mais dépend pour beaucoup de l'interaction avec le(s) personnage(s) et de l'évolution possible du jeu. Il est toutefois préférable de prendre des caractères faciles à taper, ce n'est pas le cas ici .
On doit aussi considérer la possibilité de couleur de chaque éléments, les objets à ramasser sont dans le même groupe car ils seront de la même couleur.

Place au programme:
...
200 '
201 ' generation des decors
202 '
210 FOR I=1TO15:READ A
215 LOCATE 2*I,10:PRINTCHR$(A/8)
220 FOR J=0TO7:READ B$:VPOKEA+J,(VAL("&H"+B$)):NEXTJ
230 NEXTI
250 '
251 ' Data decors
252 '
260 DATA 1920,ff,01,01,01,ff,08,08,08
265 DATA 1928,ff,01,01,01,ff,08,08,08
270 DATA 1856,ff,01,01,01,ff,08,08,08
280 DATA 1792,ff,42,ff,42,ff,42,ff,42
290 DATA 1536,10,10,18,3F,EC,18,08,08
300 DATA 1728,00,00,00,3E,3E,00,36,36
310 DATA 1736,00,00,7E,24,7E,24,7E,24
320 DATA 1744,00,00,20,60,14,0E,1E,0E
325 DATA 1752,00,00,0E,0A,5E,B8,70,60
326 DATA 1760,00,00,18,0C,0E,12,22,40
327 DATA 1768,00,38,7C,44,5C,54,44,7C
328 DATA 1776,00,00,00,28,7C,7c,38,10
329 DATA 1784,00,3E,3A,1C,08,14,3A,3E
330 DATA 1984,1C,3E,55,55,55,55,55,7F
340 DATA 1496,29,29,46,80,03,0C,10,26
350 '
351 ' charge couleurs
352 '
355 FOR I=0TO12:READ A:READ A$:VPOKEA,(VAL("&H"+A$)):NEXTI
360 '
361 ' Data couleurs
362 '
390 DATA 8215,41,8216,E1,8219,B1,8220,51,8221,E6,8222,F8,8223,C1
395 DATA 8198,E1,8199,E1,8192,41,8193,41,8194,41,8195,41
...


La ligne 215 permet de visionner la transformation des caractères ainsi que leur mise en couleur en live, on peut voir que c'est assez rapide.
Les Data sont réunis par éléments avec en premier l'adresse de départ du graphisme du caractères et les 8 lignes le redéfinissant à suivre. On peut voir que les Hexa peuvent s'écrire aussi bien en minuscule qu'en majuscule.
Pour la couleur en premier la zone et en 2 la couleur d'écriture sur le fond (F8: blanc sur rouge).
On colore aussi des caractères graphiques du premier niveau ainsi que les chiffre pour égayer le tout.

Voilà on a tout les éléments pour réaliser un vrai petit King's Valley. 

 

3. Initialisation du programme, mise en place du décor.

Il faut d’abord prendre connaissance des variables nécessaires au jeu, c’est facile une fois le jeu fini, mais il est toujours préférable de tenir un tableau de variable ou de prendre des variables significatives.


Au début du jeu le niveau est à 0 et les vies sont à 3.
On initialise les sauts conditionnels n’évoluant pas dans le jeu.
Puis on met le décor en place en deux étapes par le biais de sous-programmes qu’on pourra aller rechercher plus facilement:
1-le fond au début du jeu.
2-la mise en place des niveaux.
Chaque niveau est initialisé par le biais d’un ON L GOTO puis le lancement de l’affichage du niveau.
Listing:

500 '
501 ' Initialisation jeu
502 '
510 MA=225:MB=241:GOSUB4000
530 ON SPRITE GOSUB 7000:ON STRIG GOSUB 9000:ONKEY GOSUB 30000,30010
550 GOSUB 6000
555 GOTO 555
...

...
6000 '
6001 ' mise en place niveau
6002 '
6010 C=0:ONNGOTO6030
6030 X=24:Y=56:P=1:D=168:E=56:FD=0:FE=0:F=192:G=32:RESTORE20000:GOTO6110
...
6100 '
6101 ' mise en place décor
6102 '
6110 FORI=1TO17:READ A$:LOCATE3,I:PRINTA$:NEXTI:LOCATE16,20:PRINTN:RETURN
...

...
30000 N=N+1:GOTO6000
30010 N=N-1:GOTO6000


A chaque passage de niveau on rappellera simplement la ligne 6000 par un GOSUB avec les lignes suivantes qui seront étoffées au fil de la création des niveaux.
Les sauts ON KEY servent à la programmation et vont nous permettre de passer d’un niveau à l’autre pour les tests.
Pour les autres les lignes sont vides pour l’instant.

Le premier niveau est un niveau test permettant de tester toutes les fonctions du jeu et se présente comme suit.
C’est évidemment plus parlant dans le programme, avec de beaux caractères redéfinis.

 

4. Mouvement du personnage principal

Celui-ci sera commandé par le biais du clavier, petit rappel sur les diverses commandes possibles et les infos retournées suivant les directions données au palonnier ou au flèches du clavier.

On entre dans le vif du sujet, il va falloir faire correspondre les mouvements du sprites avec les décors. Pour faciliter la chose et pour la rapidité, celui-ci se déplacera de 8 en 8 points, ce qui correspond à la taille d’un caractère.
Le tableau suivant donne les rapports entre les diverses modes de coordonnées d’affichage :
- en bleu : les coordonnées utilisées par LOCATE par exemple.
- en rouge : les coordonnées utilisées par PUT SPRITE
- en vert : les emplacements mémoires ou sont stockés les caractères affichés, lus par VPEEK.

Pour pouvoir gérer les déplacements il faut faire correspondre les coordonnées du personnage avec les adresses mémoires des caractères affichés.
Si on se réfère au tableau, en largeur quand X progresse de 8 on avance d’une « case » mémoire soit X/8 , quand Y progresse de 8 on avance de 32 cases soit Y*4. On crée une variable V qui sera égale à 6144 (adresse de départ) + X/8 + Y*4. On la rappellera pour les différents tests avec VPEEK.

 Pour la première étape on ne s’occupe que des éléments liés au mouvement :
Murs (240 et 241) et portes (248) qu’on ne peut traverser,
Passages (232) au travers desquels on peut passer mais préserve de la chute
Echelle (224) préserve de la chute et permettent de grimper et descendre.

Etape 1 : la pesanteur, le héros tombe quand il n’est pas au dessus d’un obstacle (<224) ou pas sur une échelle (<>224)
600 '
601 ' Boucle principale
602 '
610 DX=0:V=6144+(X/8)+Y*4:S=STICK(0):STRIG(0)ON
620 IF VPEEK(V+32)<224 AND VPEEK(V)<>224 THEN 810

800 GOTO 820
810 P=1:Y=Y+8
820 PUTSPRITE0,(X,Y-1),10,P

2000 GOTO 610


Etape 2 : déplacements latéraux, le héros peut se déplacer à droite et à gauche s’il n’y a pas d’obstacle(<240).DX est remis à zéro en 610 pour éviter au sprite de continuer son mouvement si on n'appuie plus sur la touche correspondante.

630 IF S=3THENP=2:IFVPEEK(V+1)<240THENDX=8
640 IF S=7THENP=4:IFVPEEK(V-1)<240THENDX=-8
645 X=X+DX


Etape 3 : grimper une échelle, s’il est sur une échelle(=224) et s’il n’y a pas d’obstacle au dessus(<240).

650 IF S=1 AND VPEEK(V)=224 AND VPEEK(V-32)<240THEN Y=Y-8:P=3:GOTO 820


Etape 4 : descendre une échelle ou traverser un passage, s’il n’y a pas d’obstacle en dessous…

660 IF S=5 AND VPEEK(V+32)<240 THEN 810

Les déplacement sont pour l’instant très rapides, mais ça va se calmer…
A noter que la chute du personnage à l’étape1 empêche le personnage de se déplacer en sautant directement à la ligne820, cela faisant partie du jeu.
La dernière étape est un peu particulière, le seul cas où le personnage peut « descendre » est quand il ne tombe pas et qu’il est sur une échelle ou au dessus d’un passage.

 

 5. Interaction avec les objets

Le personnage se promène à sa guise dans le niveau, maintenant on va lui permettre de s’emparer des objets et de s’en servir. Pour s’en emparer on devra presser la flèche « bas » ensuite il faut distinguer 2 genres de bonus, ceux à effets immédiats et ceux dont on se servira par le biais de la barre espace.
On détecte, toujours avec VPEEK(V) si le personnage est sur un bonus (entre 215 et 224) touche « bas » et on saute ou sous programme.
Le ON GOTO sélectionne l’objet correspondant.
Comme on ne peut posséder qu’un objet à utiliser à la fois on teste C avant. Pour le sablier et la glue on teste si il y en a déjà un en cours. Pour la vie on incrémente et on affiche.
Alors qu’on efface l'objet au niveau du héros en le remplaçant par un élément du décor avec VPOKE V,187, le bonus correspondant est affiché en bas dans la zone prévue, qu'on peut définir en appliquant le tableau des cases mémoires.




670 IF S=5 AND VPEEK(V)<224 AND VPEEK(V)>215 THEN H=VPEEK(V):GOSUB8010

8000 ' 8001 ' ITEM 8002 '
8010 ON H-215 GOTO8030,8040,8050,8060,8065,8070,8080,8090 8020 RETURN
8030 IFC=0THENVPOKEV,187:VPOKE6804,H:C=1:RETURNELSERETURN
8040 IFC=0THENVPOKEV,187:VPOKE6804,H:C=2:RETURNELSERETURN
8050 IFC=0THENVPOKEV,187:VPOKE6804,H:C=3:RETURNELSERETURN
8060 IFC=0THENVPOKEV,187:VPOKE6804,H:C=4:RETURNELSERETURN
8065 IFC=0THENVPOKEV,187:VPOKE6804,H:C=5:RETURNELSERETURN
8070 IFU>0THEN8020ELSEVPOKEV,187:VPOKE6808,H:U=60-N:RETURN
8080 VPOKEV,187:L=L+1:LOCATE9,20:PRINTL:RETURN
8090 IFR>0THEN8020ELSEVPOKEV,187:VPOKE6806,H:R=80-N:FD=FD/2:FE=FE/2:RETURN

Pour la glu on lance un compte à rebours (U=60-N) durant lequel le crâne sera immobilisé.
Pour le Sablier on lance un compte à rebours (R=60-N)durant lequel la vitesse du fantôme sera divisée par 2 (FD=FD/2:FE=FE/2).
A noter que la durée de ces compteurs dépendent du niveau (...-N) dans lequel on est. Plus on avance, plus il sont courts.

C’est bien beau tout ça mais il faut maintenant pouvoir utiliser ces bonus.
Pour cela il faut déjà connaître leur rôle :
C=1 - Le mur (216), crée un bloc devant le personnage.
C=2 - L’échelle (217) crée un élément échelle devant le personnage.
C=3 - La pelle (218) crée (creuse) un passage en dessous du personnage.
C=4 - La clef (219) ouvre la porte devant le personnage.
C=5 - La pioche creuse un trou devant le personnage.

Les fonction ON STRIG GOSUB et STRIG(0)ON nous envoie à la ligne 9000 lorsqu'on appuie sur la barre espace, c’est là que tout va se passer.
On teste dans un premier temps si le sprite est dans la bonne position à droite ou à gauche ou si on est en possession d’une pelle. Puis on se dirige vers les différentes actions par le biais, une nouvelle fois, d’un ON GOTO.


9000 IF P=2 OR P= 4 OR C=3 THEN9010 ELSE 9020
9010 IFDX=0 THEN ON C GOTO 9030,9050,9070,9090,9110
9020 RETURN
9030 IF VPEEK(V-P+3)=187 THEN VPOKE(V-P+3),240:VPOKE6804,32:C=0
9040 RETURN
9050 IF VPEEK(V-P+3)=187 THEN VPOKE(V-P+3),224:VPOKE6804,32:C=0
9060 RETURN
9070 IF VPEEK(V+32)=240 THEN VPOKE(V+32),232:VPOKE6804,32:C=0
9080 RETURN
9090 IF VPEEK(V+1)=248 THEN VPOKE(V+1),187:VPOKE6804,32:C=0
9100 RETURN
9110 IF VPEEK(V-P+3)=240 THEN VPOKE(V-P+3),187:VPOKE6804,32:C=0
9120 RETURN

Le VPEEK(V-P+3) permet de tester si la voie est libre devant le personnage. Explication : On doit tester la case précédente (V-1) si le personnage est tourné à gauche (le numéro du sprite est alors P=4) on a bien V-4+3=V-1. De même, on doit tester la case suivante (V+1) si le personnage est tourné à droite (le numéro du sprite est alors P=2) on a bien V-2+3=V+1. Une petite astuce qui évite de refaire à chaque fois 2 tests pour les 2 positions. Pour la pelle la situation est plus simple.
Après, il suffit d’appliquer l’élément voulu à ce même endroit tout en pensant à réinitialiser C et en effaçant le bonus affiché en bas.
J’en profite pour rappeler qu’on ne peut pas agir (creuser) sur les éléments du pourtour car ce sont les caractères 241 qui le compose.

 

 
 

6. Déplacement des monstres.

a) Le fantôme

Il se déplace comme une balle qui rebondit dans la zone de jeu et traverse les murs. Sa vitesse de déplacement est définie par FD et FE au début du niveau, elle est divisée par 2 quand on prend un sablier.
Le listing :

1000 '
1001 ' Fantome
1002 '
1010 IFR=0THEN1020ELSEIFR=1THENR=0:VPOKE 6806,32:FD=FD*2:FE=FE*2ELSER=R-1
1020 IF D<25ORD>215 THENFD=-FD
1030 IF E<9ORE>135THENFE=-FE
1040 D=D+FD:E=E+FE
1050 PUTSPRITE1,(D,E),8,5

En 1010 c’est l’effet sablier Si R=0 tout se passe normalement, sinon on lance le décompte. Quand le compteur arrive à 1 on remet R à 0 pour que tout rentre dans l’ordre, on efface le sablier dans les options, on multiplie par 2 la vitesse du fantôme divisée par 2 lors de la prise du sablier.
En 1020 et 1030, on inverse la valeur de déplacement correspondante quand le sprite dépasse la limite en largeur ou hauteur. Il faut toutefois se rappeler que les coordonnées du sprite correspondent au coin supérieur gauche de celui-ci.
Dans le cas de définition de valeur, on peut se passer de la fonction IF…THEN en jouant avec les équations.
Petite parenthèse :
Quand une comparaison est vraie elle renvoie la valeur -1 sinon elle renvoie 0, par exemple :
A=1 :B=2
PRINT (A=A)
-1
PRINT (A=B)
0
PRINT (A

b) Le crâne

Les mouvements du crâne sont plus complexes. Il se déplace de 1 en 1 et ne peut pas traverser les murs, il faudra donc faire une comparaison entre la position du sprite et le décor au bon moment. Il poursuit notre héros sans relâche il faudra comparer aussi les coordonnée du sprite crâne par rapport aux coordonnées du sprite héros. Puis le sablier le stoppe un certain temps.
Le listing :

1100 '
1101 ' Crane
1102 '
1105 IFU=0THEN1110ELSEIFU=1THENU=0:VPOKE6808,32ELSEU=U-1:GOTO 1190
1110 IFFMOD8=0ANDGMOD8=0THEN1115ELSE1180
1115 W=6144+(F/8)+G*4
1120 IFF=XTHENCF=0ELSEIFF


La ligne 1105 correspond au mode “glu” et fonctionne comme le sablier du fantôme si ce n’est qu’il saute directement à l’affichage du sprite.
En 1110, le crâne se déplaçant de 1 en 1 on ne joue sur ses coordonnées que quand celles-ci tombent sur un multiple de 8 (FMOD8 et GMOD8=0). De ce fait il est important que les coordonnées de départ soient des multiples de 8.
En 1115 le W du crâne est l’équivalent du V du héros.
En 1120 et 1130 on détermine comment le crâne doit se déplacer suivant la position du héros puis s’il n’y a pas d’obstacle (VPEEK(W)<240)
En 1140 quand le sprite doit se déplacer en diagonale (CG et CF différent de 0), on vérifie si il n’y a pas d’obstacle dans le coin, sinon on privilégie le déplacement vertical (DF=0). On peut faire mieux mais cela ralentit trop le jeu.

Une nouvelle fois on peut se passer des IF…THEN pour les lignes 1120 à 1140 :

1120 CF=1*(F

Dans ce cas le gain de place est flagrant. Il n’y a pas à s’occuper de la valeur 0 celle-ci étant celle par défaut quand une condition n’est pas remplie pour 1 ou -1.
En 1140 on remet CF à 0 en lui ôtant sa valeur si les conditions concernées sont remplies : CF+CF*(-1)*(-1)*(-1) sinon CF est égal à lui même: CF=CF+CF*(0).
Le jeu a déjà bien avancé et heureusement car l'animation a bien ralenti elle aussi.

 

 

7. La défaite et la victoire.

a) la défaite.

Le héros meurt quand il entre en contact avec un monstre ou qu’il rencontre un piège. Il est aussi préférable d’ajouter une option « suicide » dans ce type de jeu car on peut rester bloqué. Ceci se fera par le biais de la touche F1.

Pour les collisions de sprite le ON SPRITE GOSUB nous renvoie à la ligne 7000, il faut y ajouter un STRIG ON en début ou fin de la boucle principale pour la détection soit activée :

2000 SPRITE ON:GOTO 610

Ensuite il faut déterminer si c’est bien une collision entre un monstre et notre héros. 4 cas peuvent se présenter :
Crâne/Fantôme
Crâne/Héros
Fantôme/Héros
Crâne/Fantôme/Héros
Le quatrième cas restant exceptionnel, nous permet de ne faire qu’une seule vérification : Crâne/Fantôme qui sera le seul cas de collision ou il n’y aura pas de mort du héros, ceci pour éviter de ralentir trop le programme quand il y aura collision de sprite.
Le fait que les sprites aient la même taille (8x8) facilite les calculs. Un petit schéma s’impose quand même :



On voit que quand les coordonnées verticales (G) du crâne sont comprises entre E-8 et E+8 et que dans le même temps les coordonnées horizontales (F) du crâne comprises entre D-8 et D+7, il ne se passe rien et que c’est dans le cas contraire que le héros perd une vie.
Cette méthode ne prend pas en compte les cas en diagonales qui serait trop lourd à gérer mais fonctionne correctement en dehors du cas de la rencontre des 3 sprites.
Le listing :

7000 '
7001 ' Collision
7002 '
7020 SPRITE OFF
7030 IF G < E+9 AND G > E-9 AND F < D+8 AND F > D-9THEN7050 ELSE9500
7050 RETURN

On prend une petite marge de sécurité…

la ligne 9500 ce sera la mise à mort du héros avec perte d’une vie.

9500 L=L-1:LOCATE9,20:PRINTL:
9510 LOCATE19,20:PRINT" "
9520 FORI=0TO5:FORJ=1TO4:PUTSPRITE0,(X,Y-1),10,J:FORK=1TO50:NEXTK:NEXTJ:NEXTI
9580 IFL=0THEN GOTO9900
9590 GOSUB6000:RETURN

Bien sur on retire une vie, on efface les options en 9510 et on déclenche une petite animation qui fait tourner le héros sur lui-même en 9520 ; coup de chance les numéros des sprites ont été bien choisis pour l’occasion.
On vérifie si les vies sont à 0 pour aller au Game Over sinon on recharge le niveau (gosub6000)
On revient avec un RETURN car initialement on était arrivé là par ON SPRITE GOSUB et il n’est jamais très bon d’en laisser à « trainer ».

Avant d’aller voir le Game Over il faut prendre en compte les autres cas de perte d’une vie :
Le piège : il suffit de vérifier si le héros passe dessus, juste après l’affichage du sprite :

830 IF VPEEK(V)=192 THEN GOSUB9500

il faut penser à mettre GOSUB car on revient avec un RETURN

Le suicide: il suffit de changer la valeur de ON KEY GOSUB :

530 ON SPRITE GOSUB 7000:ON STRIG GOSUB 9000:ONKEY GOSUB 9500


Voilà maintenant on peut passer au GAME OVER:

9900 LOCATE3,20:PRINT" GAME OVER !!!!!!!! ":N=0

9920 IFSTRIG(0)=-1 THEN9930 ELSE9920

9930 GOSUB4000

9990 RETURN

Rien de bien extraordinaire, on marque GAME OVER à l’endroit souhaité, on remet le niveau à 0.
Une attente d’appui sur la barre espace et un retour à l’initialisation du décor.

b) la victoire.

Ou plutôt la fin du niveau, celui-ci s’achève quand le héros a franchi la porte et atteint le bord droit de l’écran. Il suffit de vérifier la position en X du héros dans la boucle principale.

1900 IFX=232THENN=N+1:C=0:U=0:R=0:LOCATE19,20:PRINT" ":GOSUB6000

On incrémente d’un niveau on remet les options à 0 et on charge le niveau suivant.

 

 

8. Finalisation.

a) Petit effet…

Vous avez peut-être remarqué les deux variables MA et MB initialisées en ligne 510 et absentes du programmes. Il s’agit d’un petit effet que j’ai ajouté par la suite, c’est l’avantage du basic de pouvoir revenir facilement sur un programme.

510 MA=225:MB=241:GOSUB4000

610 DX=0:SWAPMA,MB:VPOKE8216,MA:V=6144+(X/8)+Y*4:S=STICK(0):STRIG(0)ON:KEY(1)ON

En ajoutant, au début de la boucle principale, un SWAP qui permet d’échanger les deux valeurs chaque fois que le programme passe dessus, suivi d’un VPOKE adéquat on obtient un petit effet intéressant et qui n’altère presque pas la vitesse de jeu. Je vous laisse deviner…ou expérimenter.

b) Mise en place des niveaux : Optimisation…

J’ai intégré les paramètre des ennemis dans les datas et je les rappelle lors de la mise en place du décor. Cela prends moins de place.
J’ai déplacé X qui est toujours à 24 au départ et enlevé Y qui garde la même valeur qu’à la sortie du niveau précédent.
Dans le listing ci-dessous l’écran de présentation du jeu, où le fantôme est immobile et le crâne enfermé et où apparaît le nom du jeu .
J’ai laissé les mise en place des autres niveaux que j’ai créé pour donner un aperçu du gain de place par ligne.


6000 '
6010 ' mise en place niveaux
6020 '
6030 C=0:ONNGOTO6060,6070,6080,6090,6100
6040 Y=56:RESTORE20010:GOTO6830
6050 'RESTORE21360:GOTO6830
6060 RESTORE20810:GOTO 6830
6070 RESTORE21010:GOTO 6830
6080 RESTORE20410:GOTO 6830
6090 RESTORE20610:GOTO 6830
6100 RESTORE20210:GOTO6830
6800 '
6810 ' mise en place decor
6820 '
6830 X=24
6840 FORI=1TO17:READ A$:LOCATE3,I:PRINTA$:NEXTI:LOCATE16,20:PRINTN
6850 READD,E,FD,FE,F,G:RETURN

20000 ' niveau 00
20010 DATA »»»»»»»»»»»»»»»»»»»»»»»»»
20020 DATA »»»»»»»»»»»»»»»»»»»»»»»»»
20030 DATA »»ððð»ððð»ðð»»»»ð»»»ððð»»
20040 DATA »»ð»»»ð»»»ð»ð»»ðð»»»ð»ð»»
20050 DATA »»ððð»ð»»»ðð»»»»ð»»»ð»ð»»
20060 DATA »»»»ð»ð»»»ð»ð»»»ð»»»ð»ð»»
20070 DATA »»ððð»ððð»ð»ð»»»ð»»»ððð»»
20080 DATA »»»»»»»»»»»»»»»»»»»»»»»»»
20090 DATA »»»»»»»»»»»Û»»»»»»»»»»»»»ø»
20100 DATA ñññññññññññññññññññññññññ
20110 DATA è è
20120 DATA è À Prends la clef et À è
20130 DATA è è
20140 DATA è ouvre la porte... è
20150 DATA è è
20160 DATA è À MSXosaure - 2008 À è
20170 DATA è è
20180 DATA 168,56,0,0,192,32
 

 

 
 
 
 
 
 
 
 
Made in Osaure
 
Afficher la suite de cette page



Créer un site
Créer un site