Il est maintenant temps d'aborder les routines AMAL pour AMOS plus en détail, afin de vous montrer comment rendre vos programmes AMOS plus rapides et plus productifs. AMAL est une partie très importante de ce qui fait d'AMOS un environnement de programmation spécial, donc plus nous y consacrerons du temps, mieux ce sera.
AMAL est une sorte de sous-ensemble d'AMOS qui permet essentiellement de réaliser des animations très rapides, et d'en exécuter plusieurs en parallèle avec très peu de ralentissements de l'effet final, comme certains des programmes que nous avons montrés dans le chapitre précédent. Vous pouvez donc avoir plusieurs animations en cours, plusieurs programmes AMAL travaillant ensemble, en effet simultanément. AMAL est simple à utiliser et son ensemble de commandes est limité à une poignée de commandes que j'ai détaillées dans le chapitre précédent.
La rapidité des commandes est due au fait que le système les compile automatiquement avant de les exécuter, ce qui permet une exécution plus rapide qu'avec le BASIC, même AMOS BASIC. Avec AMAL, vous pouvez animer tout, d'un simple Sprite à un écran entier. Jusqu'à 64 de vos programmes AMAL peuvent être exécutés simultanément, bien que vous ne puissiez en faire fonctionner que jusqu'à 16 sans interférer avec le flux des commandes AMOS normales en utilisant Synchro. (Si vous avez une sensation de déjà-vu ici, ne vous inquiétez pas ! J'ai effectivement déjà dit cela, mais il faut que ce soit clair.) J'ai expliqué comment utiliser les commandes AMAL, en termes très simples.
Maintenant, en guise d'introduction aux techniques AMAL avancées, je veux attirer votre attention sur l'éditeur AMAL que vous avez reçu gratuitement avec votre disque AMOS Extras. L'éditeur AMAL est un programme AMOS, donc vous devez soit le lancer depuis AMOS, RAMOS ou le compiler et l'exécuter depuis le Workbench. Ou mieux encore, vous pouvez l'installer en tant qu'accessoire AMOS pour qu'il soit disponible à tout moment depuis AMOS, bien que cela réduise considérablement la mémoire disponible, donc ne le faites que si vous avez beaucoup de mémoire. En tout cas, utilisez l'éditeur AMAL dès que vous en avez l'occasion, car cela améliorera considérablement votre programmation AMOS.
Bien que pour les programmes AMAL simples, l'approche habituelle de créer vos programmes AMAL dans des variables de chaînes et de les assembler pour faire un seul gros programme soit la meilleure approche, pour les effets plus complexes, l'éditeur AMAL est la meilleure solution. Il vous permet de construire un programme AMAL parfait et de le compacter dans une banque de mémoire AMOS régulière, que vous pouvez charger et sauvegarder en tant que fichier .abk. En plus de vous permettre de saisir et d'éditer les programmes AMAL comme un programme AMOS normal, l'éditeur vous permet de sauvegarder les fichiers de banque mémoire afin que vous puissiez utiliser les mêmes séquences dans plusieurs programmes, ce qui est pratique pour les logos animés et autres.
Depuis l'écran principal de l'éditeur, vous pouvez écrire vos programmes AMAL ou les tester. Une option de menu vous emmène dans le Moniteur AMAL, où vous pouvez examiner l'avancement de n'importe quel canal AMAL que vous avez en cours d'exécution. Une autre option de menu vous permet de configurer des mouvements comme la commande PLAY en AMAL classique, sauf que tout est automatique ici, et vous pouvez sauvegarder vos mouvements de souris dans une banque mémoire.
Une fois qu'un programme AMAL a été écrit avec l'éditeur, il peut être sauvegardé dans une banque mémoire et chargé dans un programme AMOS. Ensuite, les canaux AMOS peuvent être appelés comme si vous les aviez créés de façon classique.
Chaque canal est affiché et utilisé en cliquant sur son numéro en haut de l'écran. L'écran principal montre l'éditeur de texte, la ligne d'information et le sélecteur de canal. Vous tapez vos programmes dans l'éditeur, en changeant de canal via le sélecteur, et en tapant un nouveau programme dans chaque canal.
L'édition dans l'éditeur AMAL est relativement simple, et les commandes sont listées dans le Tableau 13.1.
Une fois que vous avez écrit vos programmes AMAL dans l'éditeur, vous pouvez en exécuter un ou tous via les commandes de la barre de menu. Les options Run All et Run Current exécutent tous les canaux AMAL ou seulement celui actuellement affiché. Le menu DEBUG vous amène dans le Moniteur AMAL, vous permettant d'exécuter et de déboguer vos programmes AMAL avec une grande précision.
Comme la plupart des programmes AMAL ne peuvent pas fonctionner de manière autonome sans AMOS, il existe un éditeur d'environnement (EE sur votre sélecteur de canal), qui est un canal spécial dans lequel vous pouvez taper les commandes d'environnement spéciales. Avant de pouvoir utiliser bon nombre de commandes AMAL, une sorte d'initialisation est nécessaire depuis AMOS lui-même. Pour ce faire dans l'éditeur, vous devez utiliser les commandes d'environnement (voir Tableau 13.2). Il s'agit essentiellement d'une série de commandes AMOS importantes, qui sont exécutées au début lorsque vous lancez les programmes AMAL.
Les commandes d'environnement sont exactement les mêmes que leurs équivalents AMOS, et sont utilisées pour faire en sorte que les programmes AMAL dans votre éditeur fonctionnent comme s'ils étaient exécutés avec AMOS.
La commande Set Reg
permet de définir l'une des registres AMAL de A à Z à une valeur entre 0 et 25. En plus de ces commandes AMOS de base, il existe plusieurs commandes de test utiles :
If Screen <numéro>
If Not Screen <numéro>
If Bank <numéro>
If Not Bank <numéro>
If Reg <lettre>,<valeur>
If Not Reg <lettre>,<valeur>
Une fois que vous avez saisi les commandes d'environnement dans le canal EE, elles feront partie du fichier .abk, pour la prochaine fois que vous chargerez les programmes AMAL dans l'éditeur. Le canal EE n'est pas exécuté comme une partie de vos programmes AMAL lorsqu'il est chargé dans une banque AMOS, donc toutes les commandes que vous avez utilisées dans votre canal EE doivent être retapées manuellement au début du programme AMOS. Vous pouvez, comme moi, utiliser un programme de type copier-coller universel comme PowerSnap pour faire cela, afin d'éviter d'avoir à tout réécrire.
En note importante concernant l'utilisation de l'éditeur AMAL, vous devez vous souvenir d'ouvrir un écran AMOS si vous prévoyez d'utiliser des Bobs, sinon les Bobs apparaîtront par-dessus l'éditeur AMAL (numéro d'écran 7 par défaut).
Le Moniteur AMAL est un autre écran similaire qui vous permet d'exécuter et de déboguer vos programmes AMAL facilement et rapidement. Si votre programme AMAL ne fonctionne pas tout à fait comme vous le souhaitiez, passez simplement dans le Moniteur AMAL et vous avez à votre disposition toute une série de commandes de débogage. Vous devez d'abord tout initialiser en sélectionnant Init depuis les menus ou en appuyant sur la touche I du clavier. Ensuite, vous pouvez utiliser l'une des commandes suivantes :
Go Until est une méthode pratique pour tester certaines parties de vos programmes, car vous pouvez insérer une sorte de point d'arrêt dans votre programme AMAL. Il vous suffit de définir un registre AMAL à une certaine valeur à un moment donné dans le programme, et dès que le programme du canal atteint ce point d'arrêt, l'exécution est suspendue et le moniteur AMAL reprend la main. Pour quitter et revenir à l'éditeur principal, il vous suffit d'appuyer sur la touche Esc.
Comme je l'ai déjà dit, utilisez l'Éditeur AMAL si vous le pouvez, car c'est l'un des meilleurs moyens d'intégrer AMAL à vos programmes aussi simplement que possible.
Voici une liste des commandes AMOS utilisables en environnement AMAL via le canal EE :
Variables
Sprite Off
Bob Off
Rainbow Del
Screen Open
Screen Display
Screen Offset
Screen
Screen Close
Screen Clone
Double Buffer
Dual Playfield
Dual Priority
Load IFF <nom>, <écran>
Colour
Get Sprite Palette <masque>
Flash
Flash Off
Set Rainbow
Rainbow
Load <nom>.<numéro>
Erase <numéro>
Bob
Set Bob
Sprite
Set Sprite Buffer
Hide On
Update Every
Channel To Sprite <canal>, <sprite>
Channel To Bob <canal>, <bob>
Channel To Screen Display <canal>, <écran>
Channel To Screen Offset <canal>, <écran>
Channel To Screen Size <canal>, <écran>
Channel To Rainbow <canal>, <rainbow>
Set Reg <numéro>, <valeur>
Le Moniteur AMAL vous offre une gamme de commandes de débogage très pratiques. Vous devez tout d'abord initialiser l'environnement en sélectionnant Init dans le menu ou en appuyant sur la touche I du clavier. Ensuite, vous pouvez utiliser l'une des commandes suivantes :
R Run Exécute les programmes AMAL sélectionnés jusqu'à l'appui d'une touche G Go Until Exécute jusqu'à ce qu'un registre atteigne une certaine valeur S Single Step Exécute les programmes une instruction à la fois
Go Until est une excellente manière de tester certaines parties de vos programmes, car il permet d'insérer un genre de point d'arrêt dans votre code AMAL. Tout ce que vous avez à faire, c'est d'affecter une valeur à un registre AMAL à un moment donné du programme, et dès que le programme du canal correspondant atteint ce point, l'exécution s'interrompt automatiquement et retourne dans le Moniteur AMAL.
Pour revenir à l'éditeur principal, appuyez simplement sur la touche Esc.
Comme je l'ai déjà dit, utilisez le plus souvent possible l'AMAL Editor, car c'est l'une des meilleures façons d'intégrer AMAL dans vos programmes de manière simple et efficace.
Maintenant que nous avons exploré l'éditeur, que diriez-vous d'examiner ce que vous pouvez faire d'autre avec AMAL au lieu des traditionnels Sprites qui volent partout ? Et pourquoi pas les écrans ?
Certaines jeux proposent des écrans défilants super-bitmaps très stylés, mais comme chacun le sait cela prend une quantité monstrueuse de mémoire, à moins de savoir comment compresser les écrans à la taille d'une boîte d'allumettes. Mais en utilisant AMAL et une petite procédure astucieuse, nous pouvons réaliser un effet similaire avec très peu de lignes de code et sans utiliser de bitmaps du tout :
Rem * ScrollyScreen.AMOS * Rem Screen Open O,960,100,8,Lowres Screen Display 0,130,150,320,100 Palette 0,$80,$90,$A0,$B0,$C0,$D0,$E0 Flash Off Set Rainbow 0,1,o4,"","","(s,2,a)" Rainbow 0,1,149,150 HILLS[640,0,50] Screen Copy 0,0,0,319,100 To 0,639,0 Channel 1 To Screen Offset 0 S$="Loop: For RO=0 To 80; Let X=RO*8; Next RO; Jump Loop" Amal 1,S$ Amal On Do Loop Procedure HILLS[Y,X,Z] Ink 1 : Bar X,0 To Y+X,99 For T=0 To Z Ink Rnd(5)+2 TX=Rnd(Y)+X : TW=Rnd(Y/8)+4 : TH=Rnd(50) Polygon TX,99 To TX+TW/2,99-TH To TX+TW,99 Next T End Proc
Les commandes clés dans ce programme, celles qui font tout le travail, sont SCREEN DISPLAY
, SCREEN COPY
et SCREEN OFFSET
. Elles configurent l'écran, le positionnent et le copient vers la droite, de sorte qu'au fur et à mesure que l'écran défile, il semble continuer indéfiniment, donnant l'illusion d'un écran bien plus grand.
Ensuite, nous avons le programme AMAL qui tourne sur le canal 1. Le SCREEN OFFSET
est affecté à ce canal juste avant d'entrer le programme AMAL, et une fois activé par AMAL ON
. Normalement, la commande CHANNEL
utilise un SCREEN DISPLAY
pour déplacer l'écran spécifié (dans ce cas 0), mais ici nous utilisons un SCREEN OFFSET
pour faire glisser l'écran vers la gauche. La boucle AMAL est lancée et continue jusqu'à ce que vous appuyiez sur Ctrl-C ou exécutiez AMAL OFF
.
On pourrait par exemple ajouter des Sprites par-dessus, simplement en ouvrant quelques Bobs et en les faisant se déplacer sur l'écran :
Rem * ScrollyScreen 2.AMOS * Rem * insérez le fichier de sprites de votre choix * Rem * tout sauf cette pieuvre, en fait ! * Cls 0 Screen Open 1,1000,160,8,Lowres Load "spritefile.abk" Set Sprite Buffer 150 Flash Off : Curs Off : Hide Get Sprite Palette Sprite 4,-100,100,1 Screen Display 1,112,100,400,160 Cls 0 For I=1 To 100 Ink Rnd(15) HILLS[Rnd(1000),160,Rnd(160),Rnd(100)] Next I For I=0 To 3 Sprite I+1,I*20,125+I*20,1+I Channel I To Sprite I+1 Amal I,"L: M 500,0,250 M -500,0,250 J L" Next I Channel 10 To Screen Offset 1 C$="L: For RO=1 To 250 Let X=X+2 Pause Next RO For RO=1 To 250 Let X=X-2 Pause Next RO Jump L" Amal 10,C$ Amal On Wait Key Direct Procedure HILLS[X,Y,W,H] Polygon X,Y To X+W/2,Y-H/2 To X+W,Y To X,Y End Proc
Les collines sont dessinées de manière similaire, mais cette fois je les ai rendues aléatoires, plutôt que toutes vertes et plaisantes ! Ensuite, nous avons ajouté des Sprites depuis le fichier de sprites que vous avez choisi, et cela peut être n'importe lequel de vos disques de démo ou de SpriteX. Le Sprite est copié sur l'écran, juste en images fixes, immobiles, pour simplifier, et les images sont étalées sur l'écran en utilisant la commande SPRITE
.
Le petit programme AMAL qui suit défile les Sprites de 500 pixels en va-et-vient sur l'écran. Ensuite, nous réutilisons la commande CHANNEL TO SCREEN OFFSET
, cette fois pour le canal 10, juste parce que j'en avais envie. Pourquoi pas ? Le programme AMAL suivant prend l'écran et le fait défiler en va-et-vient lui aussi, comme les Sprites. Essayez une combinaison des deux programmes, et ajoutez l'arc-en-ciel du premier programme au second pour un effet complet.
Certains des programmes de ce livre utilisent un processus AMAL appelé AUTOTEST. Ce sujet mériterait presque un petit livre à lui tout seul, mais voici un résumé rapide de ce qu'il peut faire pour vous.
En gros, ce que fait AUTOTEST, c'est accélérer les programmes qui nécessitent un test quelconque, comme la recherche des coordonnées d'un point sur l'écran, ou la vérification de la position de la souris, etc. Au lieu d'attendre à chaque passage dans une boucle pour tester si quelque chose s'est produit dans un programme AMAL, vous utilisez AUTOTEST et tout ce que vous avez spécifié est testé après chaque retour de balayage vertical (Vbl) de l'affichage écran, ce qui signifie que vos tests s'effectuent toutes les 1/50ème de seconde.
Cela veut dire que si vos tests ralentissent un mouvement de souris, les tests deviendront pratiquement invisibles, et le mouvement sera fluide et en temps réel.
Il s'agit d'une technique AMAL assez avancée, et elle mérite un peu plus d'explications. Regardez cet exemple simple :
Rem * Followmouse.AMOS * Rem Load "chargez un sprite ici.abk" Get Sprite Palette Sprite 8,130,50,1 Amal 8,"Loop: L RO=XM-X; L R1=YM-Y; M R0,R1,50; J Loop" Amal On Direct
Dans cet exemple, la souris est suivie partout sur l'écran par le Sprite. C'est un programme simple, mais malin. Dans le programme AMAL, la position de la souris est placée dans les registres 0 et 1, via les fonctions XM
et YM
. Ensuite, un mouvement est transmis au Sprite activé, en fonction de la position de la souris.
Mais le mouvement de la souris est tellement rapide et fluide que même avec AMAL, vous ne pouvez pas obtenir les tests de position aussi rapidement que le déplacement réel de la souris. Cela signifie que le Sprite traîne derrière et paraît saccadé et lent. Voyez maintenant ce qui se passe lorsque nous utilisons AUTOTEST pour faire les tests au lieu d'utiliser AMAL directement :
Rem * Followmouse 2.AMOS * Rem Load "oui, le même sprite encore.abk" Get Sprite Palette Sprite 8,150,60,1 A$="AU (I RO<>XM J Update" A$=A$+"I R1<>YM J Update else X" A$=A$+"Update: L R0=XM; L R1=YM; D M)" A$=A$+"M: M R0-X,R1-Y,20 w;" Amal 8,A$ Amal On Direct
Même effet, mais regardez comme le Sprite est fluide ! Il suit la souris de manière souple et précise, et c'est tout le pouvoir d'AUTOTEST. Chaque fois que l'écran est rafraîchi, l'information sur la souris est transmise aux registres contenant les coordonnées de déplacement du Sprite.
Donc la morale de l'histoire est : plus la résolution est grande, plus les mouvements sont fins. Plus les tests sont rapides, plus vos programmes seront sensibles aux entrées humaines rapides.
Bien que cela se prête bien aux jeux d'arcade où les réflexes sont plus sollicités que la logique, vous pourriez tout aussi bien utiliser ces tests rapides pour des entrées clavier, ou pour des données en provenance rapide d'un échantillonneur audio branché sur le port parallèle par exemple.
Bon, il est temps d?être honnête. Une des raisons pour lesquelles vous utilisez AMAL, en fait la plupart du temps quand AMAL entre en jeu, c?est parce que vous programmez un jeu. Avouons-le, on le fait tous de temps en temps, et il n?y a pas de honte à ça. (Sourire.) Voici comment utiliser AMAL pour faire des jeux de type « tuer ou être tué ».
J?ai conçu ce jeu simple en utilisant AMAL. Vous ne pouvez rien tirer, vous pouvez seulement éviter, et pour que ce soit facile à comprendre j?ai rendu les mouvements de l?alien statiques. Vous pouvez bien sûr rendre cela aussi sophistiqué que vous voulez. Voici le listing :
Rem * AMAL Game.AMOS * Rem Load "Extras:Sprite_600/aliens/alien1.abk" Load "Extras:Sprite_600/space/ship3.abk",1 Screen Open 0,320,200,16,Lowres Hide : Curs Off : Flash Off : Cls 0 Get Sprite Palette Double Buffer Autoback 0 Bob 1,0,0,10 Bob 2,320,80,1 A$="Anim 0,(18,4)(19,4)(20,4)(21,4) ;" A$=A$+"Main:" A$=A$+"If J1&1 Jump Down ; " A$=A$+"If J1&2 Jump Up ; " A$=A$+"Jump Main " A$=A$+"Down: Move 0,-2,1 ; Jump Main " A$=A$+"Up: Move 0,2,1 ; Jump Main" B$="Anim 0,(1,4)(2,4)(3,4)(4,4) ;" B$=B$+"Movealien:" B$=B$+"Move -10,0,10 ; Move 0,-50,10 ; " B$=B$+"Move -10,0,10 ; Move 0,50,10 ; " B$=B$+"Jump Movealien" Channel 1 To Bob 1 Amal 1,A$ Channel 2 To Bob 2 Amal 2,B$ Amal On Wait Vbl Repeat Inc SCORE Until Bob Col(1) Boom Paper 0 Pen 2 Centre "Game Over, Man!" Locate 0,20 : Print "You lasted : ";SCORE;" clicks, bozo!" Update
Notez que j?ai utilisé une paire de Sprites de la collection Sprite_600, que vous devriez pouvoir trouver sur votre disque Extras. Si ce n?est pas sur votre disque, vous devriez pouvoir l?obtenir via la bibliothèque AMOS PD.
Les Sprites se trouvent dans des fichiers de Sprite différents, donc le second fichier ABK est chargé avec une virgule et un 1
après la commande Load
, ce qui ajoute le second fichier de Sprite au premier. Si vous oubliez de faire ça, vous écraserez le premier fichier de Sprite par le second, et vous n?aurez qu?un seul Sprite dans la banque.
Après le chargement des Sprites, je récupère leur palette, qui heureusement, venant de la même collection de Sprites, est la même pour les deux Sprites.
Puis nous avons les habituels CLS
, CURS OFF
et HIDE
que vous prendrez l?habitude d?utiliser en début de programme. Ensuite, nous utilisons DOUBLE BUFFER
pour activer une copie invisible de l?écran, sur laquelle toutes les opérations graphiques sont effectuées, ce qui rend l?animation et les mouvements plus fluides. Il s?en suit que nous utilisons AUTOBACK
pour synchroniser le dessin des Sprites avec leurs mouvements.
Ensuite, les Bobs que nous utilisons sont activés avec BOB
. Dans ce cas, le Bob 1 est le vaisseau spatial, le Bob 2 est l?alien. Les images de départ pour chaque Sprite ainsi que leur position sur l?écran sont définies ici : côté gauche de l?écran pour le vaisseau, et en dehors du côté droit de l?écran pour l?alien (ce dernier débute hors écran pour entrer ensuite dans le champ visuel).
La partie suivante est la plus intéressante. Nous avons créé les programmes AMAL, qui seront ensuite affectés aux canaux 1 et 2. Le premier canal est défini par la variable A$
et le second par B$
.
Dans A$
, nous lançons l?animation du Bob du vaisseau afin que la petite flamme à l?arrière s?anime. Ensuite, nous vérifions l?entrée du joystick pour savoir dans quelle direction le manche est poussé, et selon le cas, nous sautons au label contenant le mouvement vers le haut ou vers le bas, ce qui déplace le vaisseau de 2 pixels à chaque fois. Si vous maintenez le manche dans une direction, le vaisseau défile de manière fluide vers le haut ou le bas.
Dans B$
, nous définissons le mouvement de l?alien et son animation. Nous démarrons par une boucle Anim
, puis une boucle de déplacement : 10 pixels vers la gauche, 50 vers le bas, 10 à gauche, 50 vers le haut, et ainsi de suite. Cela fait avancer l?alien vers votre vaisseau jusqu?à ce qu?il le touche ou le dépasse. Comme c?est un exemple simple, l?alien ne fait qu?un passage, mais vous pourriez facilement créer une boucle qui le renvoie à droite, à une position différente.
Ensuite, nous affectons un canal à chaque Bob pour que leurs mouvements soient contrôlés par les programmes AMAL définis. Et lorsque nous activons les programmes avec Amal On
, tout s?exécute. Le WAIT VBL
attend le prochain balayage vertical.
Enfin, nous lançons une boucle REPEAT UNTIL
jusqu?à ce que les deux Bobs entrent en collision. Aucune explosion ici (trop violent, n?est-ce pas ?) car c?est un exemple simple. Quand la collision a lieu, un son BOOM
est joué (vous pouvez y mettre votre propre sample), et un message s?affiche pour indiquer combien de temps vous avez survécu.
Et voilà en essence, la base d?un petit jeu en AMAL. Vous pouvez rendre le tout plus rapide et dynamique en utilisant AUTOTEST
bien sûr, mais pour quelque chose d?aussi simple, ce n?est pas nécessaire.
Ce qui nous amène à la question : que pouvez-vous faire avec cette structure de jeu ?
Vous avez maintenant les éléments de base d?un jeu. Parmi les améliorations que vous pourriez essayer, on peut citer : avoir plusieurs vagues d?attaque avec des aliens à différentes hauteurs et vitesses, permettre les tirs aussi bien depuis le vaisseau que depuis les aliens, autoriser le vaisseau à avancer ou reculer dans une zone délimitée, et à partir de là, toutes les améliorations que vous pouvez ajouter deviennent un peu incontrôlables : effets sonores, échantillons audio, tableaux de meilleurs scores avec texte arc-en-ciel, et même oncle Tom Cobbly et compagnie.
Toutes les autres routines dont vous avez besoin pour chaque partie de votre programme se trouvent quelque part dans ce livre, et c?est à vous de tout assembler pour créer le meilleur jeu jamais réalisé !