GENISTA (1971) : TUTORIEL "BBC BASIC FOR WINDOWS" EN FRANÇAIS : CHAPITRE 19 : LES JEUX ET LES SONS ("SOUND")



Logo Genista, fondé en 1971

Guide Tutoriel de BBC BASIC for Windows, Ch. 19

BBC BASIC (BB4W) Tutorial: Games and SOUND

Les jeux et les sons (SOUND) (Tutoriel BBC BASIC, Ch. 19) [Genista]

Par Peter Nairn  •  Traduction : Guy Schaffner (Texte et images) (Genista)

informatique et programmation Vous avez jusque-là, grâce aux procédures, aux fonctions et au caractères définis par l'Utilisateur, réussi à maîtriser l'essentiel du langage de programmation pour réaliser un petit jeu.
Dans ce Chapitre, vous allez ajouter une dimension nouvelle à votre programmation en y incluant des sons, sous forme de bruits et même de musique, en utilisant les divers canaux prévus à cet effet. C'est la dimension qui manquait encore à votre travail...
Chapitre 18   •   Chapitre 19   •   Chapitre 20      

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
    
    

Utilisation des quatres canaux pour les sons

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





Haut de Page  •  [Top of Page]

Page suivante (Ch. 20)  •  [Next Page (Ch. 20)]

Page précédente (Ch. 18)  •  [Previous Page (Ch. 18)]

Page d'entrée : BASIC, BBC BASIC et BB4W  •  [BASIC, BBC BASIC and BB4W  Entry Page]

Début du Guide pratique du BBC BASIC  •  [The Beginning of the BBC BASIC Tutorial]

Autres sujets  •  [Other subjects]