|
|||||||||||||||||||||||||||||||||||||||||||||||
|
La version 1.2 est disponible au moment même où vous me lisez, sous la forme d'un programme domaine public qui modifie votre disquette AMOS. Outre la correction de certains bogues, cette version apporte de nouvelles instructions et améliorations : Un meilleur multitâche La boucle de l'éditeur et du mode direct ont été améliorés pour permettre une meilleure utilisation multitâche, AMOS ne prend plus tout le temps machine aux autres programmes. En mode programme, vous devrez parsemer votre programme de l'instruction "Multi Wait ..." qui rend la main aux autres programmes, pendant approximativement un balayage d'écran. Attention, cette instruction est d'autant plus imprécise que le nombre de tâches est élevé. Préférez "Wait Vbl" pour synchroniser votre programme. "Multi Wait" est l'idéal pour attendre une option de menu, ou la pression d'une touche. Le retourneur de sprites Il s'agit d'une des principales techniques pour réduire la place mémoire occupée par un programme. Dans un jeu, les graphismes occupent la majeure partie de la mémoire (avec la musique). Plus un jeu est complexe, plus il faudra de sprites, et donc de mémoire. En général, le personnage principal peut se diriger dans toutes les directions : gauche-droite pour un jeu à défilement latéral, haut-bas (en général) pour un jeu de tir, et même dans tous les sens. Le personnage principal est aussi le mieux animé. Tout ceci fait que la banque de sprites d'un jeu est principalement constituée des phases d'animation du personnage principal dans une direction, puis dans une autre, par simple symétrie des sprites. Les nouvelles instructions de l'AMOS, permettent une symétrie automatique des sprites. Il suffit de ne conserver qu'une seule direction dans la banque de sprites. Le gros problème lors de la programmation de ces nouvelles fonctions, était de conserver la compatibilité avec la version 1.1. J'ai donc dû ruser : tout se fait par l'intermédiaire du numéro de l'image à afficher. Exemple : imaginons que l'image 1 dans la banque de sprites représente un vaisseau spatial dirigé vers le haut-droite :
Fonctionnement du retourneur de sprites Le programme travaille directement dans la banque de sprites, au moment même de l'affichage. La fonction sprite base (image) ramène une adresse pointant sur la définition d'une image dans la banque de sprites.
Vous pouvez ainsi connaître la taille d'une image avec deek :
J'ai utilisé le sixième mot de cette définition pour stocker les drapeaux indiquant le retournement de l'image. Le bit 15 de la position du point chaud en X indique que l'image est actuellement retournée en X dans la banque ; le bit 14 a la même fonction en Y. Imaginons que vous utilisiez l'instruction BOB 1,100, 100, HREV(5). Au retour de balayage suivant, AMOS inspecte la liste des BOB à afficher. Il trouve l'image $8005. Il regarde le bit 15 de l'adresse 6 dans la définition de l'image. L'image est dans son état originel, le bit est à zéro. AMOS appelle donc la routine de retournement en X, et positionne le bit 15 à 1. Ceci fait, le BOB inversé est affiché normalement à l'écran. Imaginons maintenant que vous bougiez le BOB, sans en changer la forme : BOB 1,101,100,HREV(5). Au prochain balayage, AMOS recommence les mêmes opérations. Il trouve encore l'image $8005 à afficher à une autre position. Il inspecte le bit 15 de l'adresse 6 : celui-ci est à 1, signifiant que cette image est déjà dans le bon sens : AMOS n'a pas besoin de retourner l'image, d'où un énorme gain de temps ! Cet exemple nous a permis de comprendre le fonctionnement du système, et de voir les avantages de la méthode utilisée :
A chaque balayage, AMOS retournera une première fois l'image pour afficher le premier BOB, puis une seconde pour afficher le deuxième ! Imaginez le désastre lorsque la taille des BOB est importante ou lorsque vous avez une dizaine de BOB en même temps. Il faut donc éviter à tout prix d'utiliser plusieurs fois une image et sa symétrique en même temps sur l'écran. Paste Bob et Paste Icon Le retourneur de BOB est également implémenté pour ces instructions. Pour la deuxième, en l'occurrence, il s'agit d'un retourneur d'icônes. Inverser les sprites matériels Les routines sont totalement automatiques pour les BOB. Pour ne pas trop en alourdir la gestion, je n'ai pas implémenté le système pour les sprites matériels. On peut cependant l'utiliser par un moyen détourné. Le retourneur travaille directement dans la banque. Lorsque vous affichez un sprite matériel par l'instruction SPRITE, AMOS explore la même banque. Si l'une des images est retournée à ce moment, elle sera affichée tel quel. Pour résumer, voici comment afficher en SPRITE les quatre symétriques de l'image numéro 2 (notez l'utilisation de Paste Bob en dehors de l'écran pour inverser l'image dans la banque...) : Les collisions et l'inverseur de BOB Le problème est exactement le même que pour les sprites matériel. Le programme de collision utilise la banque d'images dans l'état où elle se trouve au moment de l'instruction. Le programme suivant ne fonctionnera cas : Une conclusion s'impose : il ne faut jamais essayer de détecter les collisions entre une image et son inverse. Ou mieux, la détection de collision entre images inversées n'est valable que si un seul BOB utilise l'image à ce moment. AMAL et l'inverseur de BOB Afin d'autoriser l'utilisation du "retourneur", j'ai implémenté l'hexadécimal en AMAL. Vous pouvez donc maintenant taper n'importe quel chiffre sous les deux formes. Exemples d'adaptations : AMAL 1,"Anim 0,(1,2)(2,2)(3,2)(4,2)" devient AMAL 1,"Anim 0,($C001,2)($C002,2)($C003,2)($C004,2)" pour une inversion en X et en Y. N'essayez pas de modifier le compteur d'une boucle, faites plutôt le changement au moment de l'affectation de la valeur à l'image. Exemple : AMAL 1,"For R0=1 To 10; Let A=R0; Next R0" devient AMAL 1,"For R0=1 To 10; Let A44000+R0; Next R0". Inverser les blocs Ayant fait les routines de symétrie de BOB, il m'était très facile de faire deux nouvelles instructions pour renverser les blocs : HREV BLOCK numéro fait une symétrie horizontale. VREV BLOCK numéro fait une symétrie verticale ou numéro désigne le bloc. BANK SWAP Bank1, Bank2 Cette nouvelle instruction échange deux banques mémoire entre elles. Vous pourrez ainsi avoir plus d'une banque d'images dans un programme ; échanger une banque de sprites et d'icônes ; avoir plusieurs musiques.
Ces deux instructions fonctionnent de la même manière que DIR FIRST$("") et DIR NEXT$, mais elles retournent les noms des périphériques logiques (autrement dit des lecteurs de disquette) branchés sur votre Amiga. Pour obtenir le nom réel, vous devez supprimer les espaces à l'aide de la soustraction de chaînes. Exemple :
|