|
|
Chapitre 19 — Les jeux et les sons (SOUND)
Après avoir traité des graphiques définis par l'utilisateur, l'étape logique suivante serait de les
combiner pour faire un petit jeu. Après tout, à quoi servent les extraterrestres si vous ne pouvez pas
les réduire en miettes ? En fait, mon effort est un peu plus amical : vous voici responsable
d'un vaisseau spatial qui récolte des minéraux en traversant une ceinture d'astéroïdes au fin fond de l'espace
(c'est-à-dire sur un fond noir !). Vous devez récupérer les météorites mais éviter les extraterrestres.
Nous allons développer cela par étapes et nous introduirons quelques nouvelles techniques à mesure que nous
avancerons. Il nous faut tout d'abord des personnages et des objets pour jouer avec.
Voici les miens. Nous pouvons les définir, puis les inclure dans une chaîne avec la couleur choisie.
REM Course aux météorites
VDU 23,220,129,219,255,255,126,60,60,24
VDU 23,221,24,60,118,221,251,110,60,24
VDU 23,222,153,189,219,126,36,60,36,36
REM Construction des personnages et objets
Vaisseau$=CHR$(17)+CHR$(3)+CHR$(220)
Meteore$=CHR$(17)+CHR$(4)+CHR$(221)
Alien$=CHR$(17)+CHR$(2)+CHR$(222)
REM Affichage pour les voir à l'écran
MODE 6
PRINT Vaisseau$
PRINT Meteore$
PRINT Alien$
END
Une fois les personnages et les objets affichés, il nous faut un moyen de les animer pour qu'ils montent
à l'écran. Heureusement, cela est facile. En affichant sur la ligne du bas, nous pouvons faire défiler vers
le haut la totalité de l'écran, ce qui est une façon économique et amusante de réussir l'animation.
À chaque boucle, nous affichons une météorite et un extraterrestre dans une colonne aléatoire ;
en mettant un point-virgule après l'extraterrestre, on empêche le retour à la ligne.
Appuyez sur
Esc
pour terminer.
REM Course aux météorites
VDU 23,220,129,219,255,255,126,60,60,24
VDU 23,221,24,60,118,221,251,110,60,24
VDU 23,222,153,189,219,126,36,60,36,36
REM Construction des personnages et objets
Vaisseau$=CHR$(17)+CHR$(3)+CHR$(220)
Meteore$=CHR$(17)+CHR$(4)+CHR$(221)
Alien$=CHR$(17)+CHR$(2)+CHR$(222)
MODE 6
REPEAT
WAIT 15
REM Affichage au bas de l'écran
PRINT TAB(RND(40),24);Alien$;
PRINT TAB(RND(40),24);Meteore$
UNTIL FALSE
END
Il faut maintenant ajouter le vaisseau spatial. Comme l'écran défile vers le haut, il faut, à chaque fois,
redessiner le vaisseau sur la ligne du haut. On peut utiliser les touches du curseur pour le déplacer vers la
gauche ou vers la droite, mais il faut une variable pour enregistrer sa position. Éteignons le curseur,
également, pour qu'il ne soit pas gênant.
REM Course aux météorites
VDU 23,220,129,219,255,255,126,60,60,24
VDU 23,221,24,60,118,221,251,110,60,24
VDU 23,222,153,189,219,126,36,60,36,36
REM Construction des personnages et objets
Vaisseau$=CHR$(17)+CHR$(3)+CHR$(220)
Meteore$=CHR$(17)+CHR$(4)+CHR$(221)
Alien$=CHR$(17)+CHR$(2)+CHR$(222)
MODE 6
X%=20
OFF
REPEAT
WAIT 15
REM Affichage au bas de l'écran
PRINT TAB(RND(40),24);Alien$;
PRINT TAB(RND(40),24);Meteore$
REM Redessiner le vaisseau
PRINT TAB(X%,0);Vaisseau$
REM Détecter le mouvement du vaisseau
IF INKEY(-26) AND X%>0 X%-=1
IF INKEY(-122) AND X%<39 X%+=1
UNTIL FALSE
ON
END
On touche au but, mais rien n'indique qu'on a touché une météorite ou un méchant. Nous devons pouvoir
détecter les objets qui se trouvent directement devant notre vaisseau afin de pouvoir attribuer des points
ou soustraire une vie selon le cas. Lorsqu'un nouvel objet est créé, nous pourrions nous souvenir des
coordonnées et les mettre à jour à chaque boucle, mais cela représente beaucoup de travail simplement pour
contrôler ce petit carré devant le vaisseau spatial. Heureusement,
BBC BASIC
est capable de relire le caractère à partir d'une position d'écran donnée. Et même mieux : vous connaissez
déjà le mot-clé à utiliser –
GET.
Lorsqu'il est donné avec deux coordonnées,
GET
renvoie le code
ASCII
du caractère situé à cette position. Ceci nous permet de rendre notre jeu véritablement interactif. D'abord,
nous lisons l'écran, puis nous contrôlons le caractère renvoyé pour voir si c'est un extraterrestre ou une
météorite. En même temps que nous créons une courte pause dans le jeu pour que le joueur sache que quelque chose
vient de se produire, nous pouvons attribuer des points et ôter des vies en fonction de ce que requiert
l'événement. Notre programme, maintenant, ressemble à ceci :
REM Course aux météorites
VDU 23,220,129,219,255,255,126,60,60,24
VDU 23,221,24,60,118,221,251,110,60,24
VDU 23,222,153,189,219,126,36,60,36,36
REM Construction des personnages et objets
Vaisseau$=CHR$(17)+CHR$(3)+CHR$(220)
Meteore$=CHR$(17)+CHR$(4)+CHR$(221)
Alien$=CHR$(17)+CHR$(2)+CHR$(222)
MODE 6
X%=20
Score%=0
Vies%=3
OFF
REPEAT
WAIT 15
REM Affichage au bas de l'écran
PRINT TAB(RND(40),24);Alien$;
PRINT TAB(RND(40),24);Meteore$
REM Redessiner le vaisseau
PRINT TAB(X%,0);Vaisseau$
REM Lire objet situé devant le joueur
Car%=GET(X%,1)
IF Car%=222 THEN
Vies%-=1
WAIT 20
ENDIF
IF Car%=221 THEN
Score%+=10
WAIT 20
ENDIF
REM Détecter le mouvement du vaisseau
IF INKEY(-26) AND X%>0 X%-=1
IF INKEY(-122) AND X%<39 X%+=1
UNTIL Vies%=0
CLS
COLOUR 7
PRINT TAB(13,12);"Vous marquez ";Score%
ON
END
Il n'y a pas grand chose d'autre à dire sur
GET
lorsqu'il est utilisé ainsi. Conservez les coordonnées dans l'étendue du
MODE
que vous utilisez, en vous souvenant que le coin supérieur gauche est situé à 0, 0 et tout se passera
bien.
Rafraîchissement de l'écran avec *REFRESH
Selon la vitesse de votre ordinateur, vous pourrez remarquer que le cycle de déroulement vertical et de
mise à jour de l'écran provoque dans notre jeu un clignotement irritant des personnages, surtout du vaisseau
du joueur. Ce clignotement peut être considéré comme une toute petite distraction ou bien comme un ennui
majeur, en fonction de votre générosité.
« BB4W »
possède une façon très habile pour l'éliminer. Lorsque nous affichons sur l'écran de façon normale, le
BASIC
et
Windows
s'assurent d'afficher effectivement les pixels que nous voulons. C'est bien, et c'est correct la plupart
du temps, mais il existe des occasions où nous voulons exercer un contrôle un peu plus approfondi.
« BB4W »
possède une série de commandes en relation avec le système (« operating system »)
de la même façon que les commandes
VDU
affectent l'affichage à l'écran. Toutes ces commandes commencent par un astérisque ( * )
et si vous cherchez dans « Operating System Interface » dans
l'Aide en ligne,
vous en trouverez la liste. On les appelle en général les « commandes étoile »
ou astérisque (« star commands ») pour des raisons que je vous laisse deviner.
Concentrons-nous sur
*REFRESH.
À l'aide de
*REFRESH
nous pouvons effectivement indiquer au
BASIC
le moment où nous voulons mettre l'écran à jour. Nous pouvons en premier lieu dessiner tous nos personnages
et, à la fin, dire « Bon : voilà l'écran complet ; affiche-le maintenant ».
Pour ce faire, nous appelons
*REFRESH OFF
qui supprime le rafraîchissement automatique, puis nous appelons
*REFRESH
quand nous voulons montrer notre écran achevé. Voici un exemple simple :
REM Utilisation de *REFRESH
*REFRESH OFF
REM Écrire du texte
PRINT "Bonjour à tous"
REM Attendre qu'une touche soit pressée
Factice$=GET$
REM Affichage de l'écran
*REFRESH
*REFRESH ON
END
Les « commandes étoile » ne sont pas reconnues comme mots-clés, aussi les
couleurs d'affichage de la syntaxe ne les reconnaissent pas. Bien que le texte soit affiché à l'écran,
il n'est en fait pas véritablement affiché jusqu'à ce qu'on atteigne la commande
*REFRESH.
Quant à
*REFRESH ON,
il ne fait que restaurer le comportement par défaut quand nous n'avons plus besoin de cette disposition.
Il suffit d'appeler
*REFRESH OFF
une seule fois. Après cela, utilisez
*REFRESH
chaque fois qu'il vous faut rafraîchir l'écran.
REM Utilisation de *REFRESH
*REFRESH OFF
REM Écrire du texte
PRINT "Bonjour à tous"
REM Attendre qu'une touche soit pressée
Factice$=GET$
REM Affichage de l'écran
*REFRESH
CLS
Factice$=GET$
*REFRESH
PRINT "On recommence"
Factice$=GET$
*REFRESH
*REFRESH ON
END
En appliquant tout cela à notre petit jeu, je suis certain que vous vous apercevez que nous devons
exécuter le défilement vertical et le nouveau dessin du vaisseau avant de réafficher l'écran. Ajoutez
trois lignes pour que le résultat soit comme ceci :
REM ...
OFF
*REFRESH OFF
REPEAT
WAIT 15
REM Affichage au bas de l'écran
PRINT TAB(RND(40),24);Alien$;
PRINT TAB(RND(40),24);Meteore$
REM Redessiner le vaisseau
PRINT TAB(X%,0);Vaisseau$
*REFRESH
REM Reste du code ...
UNTIL Vies%=0
*REFRESH ON
CLS
COLOUR 7
REM ...
Essayez ces lignes dans le jeu et remarquez que tout l'ensemble paraît plus agréable à l'œil.
N'oubliez pas le
*REFRESH ON
de la fin, après la boucle principale, sinon vous ne parviendrez pas à voir votre score. Lorsque le
rafraîchissement est désactivé, l'affichage laisse quelquefois des curseurs fantômes abandonnés partout sur
l'écran. Si cela est important dans le cas de votre application, désactivez le curseur en vous servant de
OFF.
Introduction du son avec SOUND
Je n'avais pas ici pour but la Demi-Mesure et ce que nous avons obtenu n'est pas mauvais pour seulement
quelques lignes de code, mais il manque toujours quelque chose à notre petit jeu. Une manière instantanée
d'améliorer notre épopée, c'est d'ajouter du son. Les endroits évidents seraient une petite explosion quand
nous touchons un extraterrestre et peut-être une petite musique quand nous récupérons une météorite.
BBC BASIC
est un langage de programmation tout à fait unique en ce sens qu'il possède une commande qui nous permet de
créer des bruits simples sans avoir à inclure des fichiers WAV qui sont cinquante fois
plus volumineux que notre programme simple. Les langages permettent habituellement à votre haut-parleur
d'émettre des bips.
« BB4W »
vous permet d'accéder directement à la carte son à partir des commandes d'origine. Des livres entiers ont été
écrits sur le son
(SOUND)
et son plus proche ami,
ENVELOPE,
mais nous n'allons faire ici que les survoler. Si vous voulez en savoir davantage, le meilleur moyen est
d'expérimenter et de lire les
fichiers d'aide –
cela en vaut la peine.
Bon, faisons une explosion simple - un simple éclatement de « bruit blanc »
(semblable à un souffle) suffira. Mettez-vous en
Mode direct (immédiat) et tapez :
SOUND 0,-15,4,20
SOUND
prend quatre paramètres. Dans l'ordre, ce sont :
| Canal |
valeurs de 0 à 3,
avec 0 pour les bruits comme ci-dessus ; 1 à 3 pour des notes musicales. |
| Volume |
valeurs de –15 (le plus fort) à 0 (silence). |
| Hauteur |
• sur le canal 0, c'est le type de bruit avec des valeurs de 0 à 7.
• sur les canaux 1 à 3, c'est la hauteur de la note avec des valeurs de 0 à 255 |
| Durée |
valeurs de –1 à 254 : c'est la durée du son en vingtièmes de seconde.
• utiliser –1 pour une durée illimitée. |
En utilisant le canal 0, le troisième paramètre modifie le bruit obtenu. Les valeurs
0 à 3 donnent des bourdonnements, et 4 à 7 donnent un
bruit blanc ou chuintement. Voici quelques exemples pour vous mettre le pied à l'étrier :
SOUND 0,-5,4,20
SOUND 0,-15,0,100
SOUND 0,-10,3,-1
Il n'y a pas de différence réelle entre les bruits blancs générés avec un réglage de hauteur de 4 à 7.
Pour jouer un air, on se sert des canaux 1 à 3. Ils ont tous trois la même
potentialité pour jouer des notes avec la même étendue. Il y en a trois pour que vous puissiez jouer
des accords et des contre-chants si vous le souhaitez. Comme le second paramètre (le volume) et le quatrième
(la durée) possèdent la même fonction, il nous suffit de nous concentrer sur la hauteur. Les valeurs sont
comprises entre 0 et 255, mais avec 0 vous n'obtiendrez pas de son, aussi,
la note la plus basse est-elle réellement 1 et la plus haute 255. Essayez :
SOUND 1,-15,1,20
SOUND 1,-15,255,20
En augmentant la valeur de 1, on élève la hauteur d'un quart de demi-ton – si vous
comprenez ce que cela veut dire. Présenté d'une autre façon, on peut dire que la différence entre deux cases
consécutives d'une guitare ou deux notes consécutives d'un clavier est égale à 4 incréments de la hauteur
dans l'instruction
SOUND.
Vous trouverez une liste complète des valeurs pour toutes les notes disponibles dans les
fichiers d'aide,
sous la rubrique SOUND, et si vous écrivez des mélodies, il vous faut vous habituer à ces valeurs.
Quant à nous, nous ne voulons qu'une petite séquence de trois notes, comme ceci :
SOUND 1,-15,200,2
SOUND 1,-15,208,2
SOUND 1,-15,212,2
Mettez le bruit dans la collision avec l'extraterrestre, la mélodie dans la partie de la météorite
et voici, enfin, notre jeu complet :
REM Course aux météorites
VDU 23,220,129,219,255,255,126,60,60,24
VDU 23,221,24,60,118,221,251,110,60,24
VDU 23,222,153,189,219,126,36,60,36,36
REM Construction des personnages et objets
Vaisseau$=CHR$(17)+CHR$(3)+CHR$(220)
Meteore$=CHR$(17)+CHR$(4)+CHR$(221)
Alien$=CHR$(17)+CHR$(2)+CHR$(222)
MODE 6
X%=20
Score%=0
Vies%=3
OFF
*REFRESH OFF
REPEAT
WAIT 15
REM Affichage au bas de l'écran
PRINT TAB(RND(40),24);Alien$;
PRINT TAB(RND(40),24);Meteore$
REM Redessiner le vaisseau
PRINT TAB(X%,0);Vaisseau$
*REFRESH
REM Lire objet situé devant le joueur
Car%=GET(X%,1)
IF Car%=222 THEN
SOUND 0,-15,4,10
Vies%-=1
WAIT 20
ENDIF
IF Car%=221 THEN
SOUND 1,-15,200,2
SOUND 1,-15,208,2
SOUND 1,-15,212,2
Score%+=10
WAIT 20
ENDIF
REM Détecter le mouvement du vaisseau
IF INKEY(-26) AND X%>0 X%-=1
IF INKEY(-122) AND X%<39 X%+=1
UNTIL Vies%=0
*REFRESH ON
CLS
COLOUR 7
PRINT TAB(13,12);"Vous marquez ";Score%
ON
END
Remarquez qu'avec l'instruction
SOUND
il nous faut toujours mettre un
WAIT. Le
BASIC
n'arrête pas l'exécution du code jusqu'à ce que la durée du son soit achevée. Au contraire, il met
les instructions dans une file d'attente et il continue son chemin. La file d'attente du son est ensuite
traitée à sa propre vitesse.
La plupart des choses que vous pouvez faire avec
SOUND
impliquent une expérimentation et de l'imagination. Si cela vous intéresse, allez fouiller dans les
renseignements contenus dans
l'Aide en ligne.
Là, on vous dira comment synchroniser les sons sur différents canaux de manière à pouvoir jouer des accords,
et aussi comment modifier la « forme » des sons en vous servant de
ENVELOPE.
Voici deux effets destinés à aiguiser votre appétit :
REM Sirène
Pas%=1
Hauteur%=100
FOR I%=1 TO 20
IF I%=10 Pas%=-1
Hauteur%+=Pas%
SOUND 1,-15,Hauteur%,2
NEXT I%
END
REM Modem
FOR I%=1 TO 10
SOUND 1,-15,RND(4)*4+150,1
SOUND 1,-15,0,2
WAIT 3
NEXT I%
SOUND 0,-15,2,15
SOUND 0,-15,0,15
SOUND 0,-15,4,25
END
Je souhaiterais mettre ici en relief que nous n'avons pas atteint les limites de
BBC BASIC
en matière de graphisme, et si vous êtes intéressé par les jeux, il existe même une bibliothèque tout entière
de figures. En utilisant ces techniques simples, cependant, vous pouvez rendre vos programmes considérablement
plus vivants. Dans les temps anciens, le monde des ordinateurs était rempli de petits programmes comme notre
jeu, principalement parce que les micro-ordinateurs de l'époque n'avaient pas assez de mémoire pour faire
autre chose ! Je suis persuadé qu'il y a toujours de la place pour des programmes d'amusement comme
celui-ci. Ce n'est pas parce que vous avez des giga-octets de mémoire que votre programme est meilleur
parce qu'il en utilise autant que possible. Au cours de votre progression comme programmeur, vos programmes
prendront davantage de volume. C'est le sujet du chapitre suivant de vous montrer comment les planifier
et les développer. En attendant, vous pouvez grandement vous divertir à vous entraîner à l'écriture du
BASIC
en concoctant de petits programmes comme celui-ci.
Exercices
19.1
Créez un effet sonore qui utilise de petites explosions de chuintements pour générer un son semblable
à celui d'un pistolet-mitrailleur.
19.2
Voici un jeu incomplet :
REM Chicane
VDU 23,220,255,213,171,213,171,213,171,255
VDU 23,221,90,126,90,24,90,126,90,24
Route$=CHR$(17)+CHR$(3)+STRING$(4,CHR$(220))
Voiture$=CHR$(17)+CHR$(4)+CHR$(221)
MODE 6
VoitureX%=20
RouteX%=18
Score%=0
Vies%=5
Compte%=0
OFF
REM Remplir l'écran avant de commencer
FOR I%=1 TO 24
WAIT 20
PRINT TAB(RouteX%,24);Route$
NEXT I%
*REFRESH OFF
REM Boucle principale
REPEAT
WAIT 20
REM Score
Score%+=1
REM Créer route nouvelle
RouteX%=RouteX%+RND(3)-2
REM Ne pas sortir de l'écran
IF RouteX%<5 THEN RouteX%=5
IF RouteX%>30 THEN RouteX%=30
PRINT TAB(RouteX%,24);Route$;
PRINT TAB(0,24)
PRINT TAB(VoitureX%,0);Voiture$
*REFRESH
REM Ajouter ici code contrôle voiture...
UNTIL Vies%=0
FOR I%=200 TO 150 STEP -1
SOUND 1,-15,I%,1
WAIT 1
NEXT I%
*REFRESH ON
CLS
COLOUR 7
PRINT TAB(6,12);"Vous marquez ";Score%
ON
END
• Essayez le jeu. Vous verrez une route qui serpente vers le haut de l'écran.
• Votre tâche est
d'ajouter les lignes de code qui contrôlent la voiture. Il faut les ajouter là où cela est indiqué.
É les touches
Flèche gauche (←) et
Flèche droite (→)
et réglez la position, CarX%, en conséquence.
• Maintenez la voiture dans les limites de 5 à 34.
• Examinez le caractère situé devant la voiture. Si ce n'est pas 220 (caractère défini
pour la route), émettez un bruit et faites perdre une vie.
Fin du Chapitre 19
|