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.
|
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.
|
|