Outils pour utilisateurs

Outils du site


Action unknown: copypageplugin__copy
back2root:archives:jeu-de-role-en-gfa-basic:zz-wip

(ENTURE A LA SOURIS réer un vrai jeu JEU D'AVENTURE EN GFA BASIC Voici un petit jeu d'aventure du type Bat ou Final Command fonctionnant entièrement à la souris que vous pourrez modifier et compléter pour obtenir votre propre jeu. Description du jeu ; Un jeu d'aventure ést uné série de Heux. Le joueur peut se déplacer d’un lieu à un autre, ct accomplir diverses actions. Dans ce programme, à chaque lieu est associé une liste de zones d'action. Chaque fois que la souris est placée sur l’une de ces zones, sa farme change, Ceree nouvelle forme indique le type d'action associé à cet emplacement de l'écran. Pour exécuter certe action, le joueur n'a plus qu’à cliquer. Les actions du jeu Lé JLeU t pprrrop oss 10 ne È permet pas beaucoup d'actions C'est un programme de démonstration, ¢t non un jéu commercial. La publicæ ; Ei[:lfl Ç_'l:.'ll'ls 1151 jÜLll'l:'lËll_ 1L I:ll.“_”'. iml'}r:rfi[if': HITL-':.nniE:I'I.*-:, sartout au []i'i.'ffl.'ll de la taille des listing. Les actions existances sont ; changer de heuw, pésser une porté, exarmider un objet, converser avec UI personnage, IM gÉT (8 |:|'lill.]“:' duit un effet. Le changement de heu permet de passer d'un endroit à uD autre, tout comme le passage d'une porte. L'action ‘examen d'un objet’ affiché un texte informauf sur l'obretr, L'action ‘conversanon’ affiche le dislogue entre le jousur éc un personnage de l’aventure. Les :.'ll:_.-t_i'[_'lTl':i ,[nflngi.:]', it ll_':l[]“i'l_'El Ln L FIEÏ_HJ.U'-IH'L'[]'I. AL T I'_'!IFL‘:. dj*fdr Eiil. I::'E' SE ra à vous de les programmer. Quelques actions supplémentaires Pour obtenir un jeu vraument utilisable, 1] faudrait ajoutér beaucoup l:].lflgl:'l:il'_'lll'!._':.. -1||'r':llH.-'i q1:||.'::|-:'l1.[|.”.=: il._”l{'rflfn ; .11_'|“:L1'_j1.]:‘.T HITT P‘l._.”'l“!'ilï:ll-l'l'lu”.gl'_'_. “.”'l:l]ÜT' RITE objer, Utiliser un appareil électronique quelconque (comme dans Bat), acheter divers objets, donner un objet, gérer les objets possèdes par le joueur, ouveir une porte avec uné élé (ou défoncer ls porre), ouvrir un tiroir, casser ume vitre, erc, Vous pouvez ajouter aussi des options de deplacément comme monter où descendré un escalier, monter dans un bateau (ou sur un cheval}, sauter par une fenêtre, ctc. Les idées d'actions ne manquent pas, Elles dépendent du type d'environnement que vous avez choisis pour votre jeu, Les actions envisaÉTART MAGATINE geables dans la France des années 1930 ne sont pas les mêmes qu'à Megapolis en 2387 ou qu’a Hangenar, 75000 ans avant notre ère, Présentation du jeu L'écrar est divisé en trois zones distinctes : les aptions système, le dessin du lieu courane, et la description textuclle de ce heu, Les optlons systèmé sont’ ds fonctions trés importantes auxquelles le joueur doit pouvoir accéder en permanence. Ces options sont : l’option “INFO“ qui affiche diverses informations sur le logiciel, Poption “SAUVER” qui permert de sauver l'état du jeu sur disquetté; l'option “LECTURE”™ qui permet de relire une sauvegarde et l'option “ SORTIE JEU” qui permet de quitter le programme en cours de Jeu, INFO | [ SAUVEGARDE SORTIE JEU Image du lieu Description du lieu Création d'une aventure Pour créer une aventure, 1l faut commencer par étudier le scénarie, Un bor scénario, c'est un rvpe d'environnement (fancastique, sciencé- ficrion, héroïe-fantasy, historique, etc.), un théme (policier, espiunnng:.:, ;inLrip_;u:: p-;:-lfl.iqul:_. Horreur, -E:tl:..}. une bonne histoire, des personnages sympathiques où inquiérants, des lieux origimaux (une chapelle gothique, une cité sous-mariné, la morgue d'un hôpital spatlal du 25ème siècle, la loge d'un concierge, une salle de rorture médsévale, un thbunal de l'Inguisition, etc.}, Décomposition de l'aventure Une fois le scénario terminé, i faut passer par là phase d'analyse er de décomposition. Il faut définir les lieux, les lions cxistant entre eux, les images les représentant, les textes déscriptifs associes à chaque endroit, les personnages, les dialogues ec les messages. Ceci BEST OF GFA BASIC est valable pour le système de jeu que je vous propose c1. 51 vous avez rajouté des actions supplémentaires [et je vous le conseille), le travail doit ausst étré [ait pour ces nouvelles actions. Codage d'une aventure Une fois l'aventure décomposée en ses éléments de basc, il faut passer à la phase de codape. Le scénario doit être codé dans le programme. La plupart des programmeurs professionnels urilisent des éditeurs de données. Ces éditeurs génèrent des fichiers de données bitraires, C'est une technique trop complexe à mettré en oeuvre dans le cadre d’un arricle, C'est pourquoi j'ai choisi une solution simple, faéile à metrre en oeuvre Les données sont écrites dans des Higmes de DATA à la fin du programme source Au début de l'exécution, une série de routines d'initialisation chargent ces données dans les tableaux de donnéss. Codage des messages Les méssages sont codés dans des lignes de DATA Le début de la z0- ne des messèee est répéré par la présence du label *messages. Leur taille n’est pas fixe. Il faut done un indicareur de fin de message. Cet indicareur est le caractère L'indicatéur de zone de message est SE I e e i i i e o e e T e E ' * 'EXEMPLES DE MESSAGES * l'HERERAANNAVEETEEREEAAETÉT messages: . DATA Ceci est Te premier message du jeu. Il est DATA affiché lorsque le joueur clique sur là zone DATA correspondante. !l peut correspondre à la DATA deacrifitifln d'un objet, ou d'un Tieu particulier. DATA * DATA Voici le sécond message. Il est un peu plus court DATA que le prémier, mais tout aussi important. DATA * DATA *FIN Codage des dialogues Les dialogues sont aussi codés dans des lignes de DATA, Leurs structures est identique à celle des messages. Ces dialogues sont Lrés un plifiés, Dans un jeu commercial, il faudrait avoir des échanges verbaux un peu plus éroffés. La zone de stockage de dialogues est indiquét par la présence du label *dialogues”. | ÉRRTTAETRÉÉEETÉETÈRERÉEEEÉÉTESE # EXEMPLES DE DIALOGUES 7* I xxh VNF FFNF dialogues: DATA Le vieil homme vous répond que la clë de la DATA sagesse se trouve dans la connaissancé, et DATA non dans une croyance aveugle, DATA * DATA Le magicien vous explique qu'il a raison. Il DATA vous laisse le choix entre être de son avis, ATARI MAGATINE DATA ou Yeceyvoir une boule de feu. DATA * DATA Le jeune mercenaire vous répond qu'il est du DATA coté de celui oui Tui donne le plus de piêèces DATA d'or. DATA * DATA “FIN DIALOGUES Codage des formes de souris Les formes de souris sont stockées dans des lignes de DATA selon le formar défini dans l'arricle Bibliothèque de formes de souris. Ellés ont été fabriquées à partir d’une image Degas Elite grice au générateur de souris décrit dans l'article sur les souris (source disponible en téléchargéement]. L& listing fourni avéc cet article comprend 8 formes de souris. Vous pouvez les utiliser pour votre propre programme, oùu en rajouter d'autres. Chaque souris à son numéro d'identification. Il n'y à pas une forme de souris pour une action spécifique, Par exemple, les souris <ALLER DROIT DEVANT=, <ENTRER PORTEZ et <DEMI-TOUR= correspondent toutes à Paction <DEPLACEMENT= Pour le joueur, aller devant lui, entrer par une porte ou faire demi-tour dans une rue ne sont pas les mêmes actions, alors que pour le programme, 1l s'agit toujours de passer dans un autre lieu. : <ALLER OROIT DEVANT= : <ENTRER PORTE= - <PARLER= - <MANGER= : <BOIRE= : <FRAPPER= : <0EIL> (pour <EXAMEN=) : <DEMI=TOUR= O— OH -HS- RN 0 = Codage des actions Les actions sont des routines du programme. Elles ont toutes ün numére d'identification. Action <DEPLACEMENT= : 1 Action =PARLER= 2 Action =MAMGER= : 4 Action <BOIRE⇒ o Action =EXAMEN= / Codage des lieux An niveau interne, les lieux sont définis comme une série d'informations. Ces informations sont : une ifmage, un texte descriptif, et un cértain nombre de zones de cliquage correspondant chacune à une action réalssable dans ce lieu, : COn associe à chaque action un paramètre spécifiant Pobjer avec iu;'.::qul.:l. l'action doit s'elfectuer Üe numéro du nouveau liëu pour <[EPLACEMENT=, la personne pour <DIALOGUEZ, le numéro de imessace pour <EXAMEN=, etc.…). l'image est une image dessinée avec le logiciel de dessin Degas Flite, stockec sous un format binaire avec le programme GEN IMGS. La BEST OF GRa BASIC [ eT S T :t-es{:hniqu: à mettre en oeuvre pour cérte üpêrfiiün est m{pliquà: un peu plus bas avec les détails sur GEN IMGS, Prenons un exemple de liew H s'agit d'une pièce fermée avec une seule porte. Cette porte donne sur un,long couloir. La pièce est éclairée par de grandes torches. Le joueur ne peut accomplir que deux actions: examiner les rorches ou passer la porte. La description de ce lieu comprend : le nom du fichier binaire contenant l'image de ce lien, le texte descriptif de la porté, et la définition des deux zones de clics (les corches et la porte). I E e e e e e e d r e d d d e e E (* - EXEMPLES DE LIEU * bl SO T n e e E A RR lieux: I OT e E r d e eA rr ced rrarr ard ecde e p d 006d0 R E “ * LIEU 1. ¢ SALLE AVFE TORCHES - * LRN RE AN A N A E N d E e É A A E DATA SALLE.BIN DATA Vous vous trouvez dans une grande salle écjairée DATA par d'immenses torches en métal. La seule issue DATA visible est une gigantesgue porte en bronze. DATA * DATA 30,40,100,35,7,7,1 DATA 100,40,30,50,2,1,2 DATA =1 La ligne 30,40,50,35,7,7,1 contient le codagé de la première zone de-clic. Certe zone est positionnée à la position (30,40). Elle à une largeur de 50 pixels, et une hauteur de 35 pixels. Lorsque la souris passe sur cette zont, elle doir avoir la forme 7 (<EXAMEN=]. En cas de clic souris cétte zone, 1l faut appélér la rourine 7 (<AFFICHAGE D'UN MESSAGE=), et afficher le message numéro 1. Ce message est une description assez horrible des gravures des torches. La ligne 100,40,30,50,2,1,2 contient le codage de la seconde 20 ne de clic, Cette zone est située à la position (100,40), Elle à une larseur de 30 pixels, ¢t une hauteur de 35 pixels. Lorsque la souris passe dessus, elle doit avoir la forme 2 (<PASSER PORTE=). 5i le joueur clique sur certe zone, il faut appeler la rourine 1 (<DEPLACEMENT=). Le nouveau lieu sera le lieu 2. La fin des zones est indiquée par la ligne DATA -L La fin de tous les lieux est Indiquee par la hgne DATA *FIN. D e e e e e R R E RR ETEE (* LIEU:2 — COULOIR * | t*ttttt*t#*#tttt#* DATA COULOIR. BIN DATA Vous vous trouvez actuel lement dans un DATA gigantesque couloir. I1 semble 5 étendre DATA à l'infini. 1l y à une inmense porte DATA de bronze dans votre dos. DATA * DATA 20,80,200,10,8,1,1 DATA =1 DATA *FIN Il o'y à qu’une seule zone de clic dans ce lieu. La forme de souris correspondante ést la forme & (<DEMI-TOUR=). Lorsque le joueur ATARI MAGAZIME clique sur cétté zone, le programme lance l'exécution de la rourine 1 (<DEPLACEMENT=), et le joueur se retrouve dans le heu 1. La ligne DATA “FIN indique qu'il n°y a pas d'autres lieux dans cette mini- aventuré. Astuce de commentaire On ne peut pas mettre un commentaire sur la même ligne qu'une instruétion DATA, car ce commentaire serait interprété comme une chaîne de caractéres appartenant & cetle même instruction DATA. C'est ennuyeux, car cela oblige à une répartition inesthétique des commentaires. Pour éviter cela, on peut “ruser, ef mettre un commentaire dans l'instruction DATA comme une chaîne alphanumérique appartenant à l'instruction DATA. Au niveau technique de programmiation, c'est une horreur, mais c'est quand même bien plus hisible. La routine de lecture des DATA lit la chaïné de caractère du commentaire, mais ne doit sUrtout pas cn tenir compie. | H*ELE !:'l'lk'*:'fl”.l.“k'.l”.l' e b bk o e e e R bkR EE E AN ! * DEFINITION LTEU AVEC COMMENTAIRE = I Rkt h R E É E R RR A d d E DATA SALLE.BIN DATA Vous vous trouvez dans une grande salle DATA éclairée par d'immenses torches en métal. DATA La seule issue visible est une gigantésque DATA porte en brônzé. DATA * DATA 30,40,100,35,7,7,1, 1 EXAMEN DES TORCHES DATA 100,40,30,50,2,1,2, | ALLER DANS COULOTR. - DATA -1 Toutes les définitions dé 2one du programme doivent avoir un commentaire de ce type, Attention : cé n'est pas un véritable commentaite, et il faut toujours avoir le caractère Ÿ entre la fin de la ligne et le début du commentaire. S°il manque un seul commentaire, la routine de lecture des lieux va afficher une erreur de DATA Coddeas igmagees Les images sont des blocs graphiques de 308×80 pixels. Elles doivent Être dessindes avec un logiciel de dessin style Depas Efite. Une fois les images dessinées, elles seront converties dans un format binaire utilisable par le programme de jeu, Cette conversion est faite par le programme CONV IMG. La conversion se fait en écrivant dans des lignes de DATA le nom des images Deges Efaté, la position des dessins sur les images, et le nom des fichiers binaires à génèrer. Ces fichiers contiennent la palette de couleur de Pimage. Cela permet d'avoir des images avec diverses palentes, Le programme de jeu gèré auromatiquement les bonnes palettes. 1 A e e e e e e e e e e d r e d d e d É RE | # EXEMPLE DE CONVERSION DEGAS/ELITE == BINAIRE * |' HR RE E É r e E d e E e E n d E e E DATA VILLE,PII DATA VILLE.BIN DATA 6,28 BEST OF GFA BASIC Cer exemple correspond à la conversion de l'image stockée à la position (6,28) de l'image portant lë nom de VILLE.PIT en un fichier b naire de nom VILLE.BIN. Les fichiers binaires ainsi générés font une taille de 12842 octets. Générateur d'images Degas Elite Ftant donné qu'il est assez difficile d'insèrer des images ou de longs fichiers binaires dans un aruiclé, j'ai écrit un programme supplémenture. Ce petit programme, appele GEN IMGS, vous vénérera des 1mages Depis slite. Elles devront être convertres par CONV IMG pour vous donner les fichiers praphiques indispensables au programme de démonstration. La séquence de travail est donc: exécution de GEN IMGS, exécution de CONV IMG, puis ecécution de DEMO- JEU, Dossier technique Le programme a été écrit en GEA RASIC 3.0, Sa structure est classique. On v trouve les différents rableaux conrenant les informations dé jeu, des routines système, un modulé d'imtialisation et des routines specifiques au programme. Les données du programme Les informations du programme sont stockées dans des rableaux de données, Ces dermers sont imitialisés & purl:fr des zones de DATA par les routines d'imitialisation, Les indices des tableaux commencent à ! au lieu de O grice à l'instruction OPTTON BASE 1 place au début du procramme. Le tableau message$() contient les divers messages. Le tableau dia- 'l-::lgu-EE'jI:} -contient le texte des djfllugu:ä- Le tableau ‘il‘hElÉlE'ÏpÜ cflnflfin[]£Immn]fl:fiinmgfisafififliéfiflu::dflfi&tnb&fitui-LEtfihkflu descri${) contient les descriptions des licux. Le tableau zones%() sert à mémoriser les caractéristiques des zones de clics du jeu, Il v à 7 données par zone de clic, ce rableau à donc deux dimensions (DIM zones&[1000,71!. Codage de 1a zone n% : - zoness(n%,1}) = Position X; - zones#{nt,2} = Position Y; - zones®{n%,3} = Largeur zone (tx): - 70nes#{n#,4} = Hauteur zone (tv); - zones%(n%,5) = Forme de souris; - zones%{n%,6) = Numéro action: - zoness(n%,7) = Paramêtre action; Les zones sont enregistrées les unes après les autres dans le tableau zonés$. Le tableau Tieux% () sert à associer les zones aux lieux. La techniquée de codage est la survante : - Tlieux*{n4,1} = Numéro de là premiêre zone du liéu n% - lieux%{n%,2} = Numéro de la derniêre zone du lieu n* La variable sortie* contient la condition d’arrêt du programme, Elle contient habituellement 0, mais si son contenu passé à 1, lë programme s'arrête. Les routines systèmes Les routines système sont des procédures qui permettent de gerer divers petirs problèmes qui se posent cour le temps au programmeur (effacement de l'écran avec.une couleur particulière, affichage d'un rectangle graphique, dessin d’un cadre, atténté d'un clic souris, enc..). Avair une bonne bibliothèque de fonctions système permet de réaliser un gain de temps appréciable dans l'écriture de nouveaux programmes. La routite de formatage de texte est une routine système comme les autres, mais elle nécessite quelques exphications. Elle permet de découper un texte quelconque en lignes de textes formatées en res: pectant les espaces. Les mots ne sont pas coupés à la ligne comme avec un affichage classique (PRINT), et restent donc entiers. Les routines d'initialisation Les routines d'initialisation lisent les paramétres du jeu stockés en DATA, et les merent dans les divers tableaux de donnés. Ces rou- Lines sont Binit messages, Cinit dialoques, Binit_souris ct Ginit lieux La routme Baff ecran est auss uné mutiné d'imtialisation, mais au lieu de préparer les données du programme, elle prépare l'écran de jeu qui séra utilisé pendant oure |a durée d'exécution du programme Les routines de gestion de jeu La procédure @forme souris{n%) moditie la forme de la souris, Avec né=0; la souris a « forme hatituelle de fléche. Avec nése=l; la souris prend là forme mémorisée dans la variable sourish (n¥). La procédure Catt move souris attend un changement de position de la souris, où un elié-souris (changement d’étar). La fonction @tst zone permet de savoir s1 uné position (x,y) est comprise dans un rectangle graphique (px,py,tx,ty). C'est l'une des foncrions les plus uriles du logiciel. La fonction Écherche zone permer de savoir sv une position (x,v) de l'écran corrsspond à l'une des zones de clic du lieu courant. Elle utilise la fonction @tst zone. La fonction @cherche option permet dé savoir si une position (x.#} de l'écran correspond à l'une des 4 options du jeu (infos, sauver, lecture, quitter pre), Elle utilise la fonction Etst zone. La procédure Batt zone clic est la routine la plus importante du jeu. C'est elle qui s'accupe de changer la formé de la souris en fonetion de sa position, ct de contrôler si le joueur clique dans une des zones de l'écran. À chaque changement de position de la souris, elle teste si la souris est sur une zone de clic. En cas de réponse positive, elle s'occupe de gérer la forme de souris visualisant l'actron exécutable & cet endroit de l’écran. Flle urilise les routines @att move souris, @cherche zane, écherche option, et ÉTOIME souris, La procédure Bexec_option permet d'exécuter l'une des 4 options du jeu. Elle utilise l'instruction SELECT /CASE pour lancer l'execution de la routine choisie, La |'r111|:|_:dur|: Gexec action permet d'exccuter l'une des nombreux actions du jeu (déplacement, examen, dialogue, combat, achat, etc.) Chaque action a un numére. L'instruction SELECT/CASE permet de lancer l'exécution de la procédure correspondant à l’action choisie. ATARI MAGAZINE fl BEST OF GFA BASIC La routiné principale du jeu est la procédure Ogestion jeu, Flle artend que l’utilisateur clique sur une zone guelcongue, puis appelle là routine qui s'occupe d'exévuter l'action choisie. Elle boucle sur elleemême tant que la variable sortie® contient C. Les options systémes Ces options sont des fonctions que le joueur peur utiliser en permapence, Il v a la fonction infa, I sauvegarde du jeu, la lecture d'uné siuveyarde, et une option permettant de sortir du jeu avec demande Ë.'I.IE L ñ.l'l'l'lf.'l'l'i_'l_'!lfl. Routine d'information La procéduré Goption info affiche une page d'information à l’intention du joueur. Certe page contient le nom du programme, le tvpe de système de developpement utilisé (GFA Basic 3.5 en l'occurrence), er les copyriehts du programme (l'auteur et Atari Magazine). -~ Routine de sauvegarde La procédure Boption sauver sauve sur disquette l’érat du jen. Cet etat est trés simplifié puisqu'il ne comprend qu‘une seule variable : le lieu courant. Routine de lecture La procedure Coption Tecture it les donnees sauvegardees par Boption sauver Une fois le numéro du lieu courant chargé en mémoire, elle utilise la routine @deplacement pour positionner le jeu dans son nouvel état. Routine de sortie du programme La procédure Goption sortie affiche une petite boîte de dialogue avec un texte (“ Voulez-vous quitter ce programme 7'), er deux cptions (OUT' et “NON'). 51 le joueur clique sur Yoption “NON', 1l ne se passe rien et le programme quitte la routine, 81 le joueur clique sur l’option “OUT”, le programme met 1 dans la variable sorties avant de quicrer la routine. Les routines d'actions Ces routines correspondent aux actions exécurables par le joueur. Certaines d’entre elles modifient les variables du’ programme, d'autres affichent des informations à l'écran, d'autres encore peuvent maodifiér l'état du jôueur (sa position dans le jeu par exemple). Ces routines ont besoin d'un paramêtre décnvant la nature de la tache à effectuer. Routine de déplacement La procédure @deplacement (11eu%) change la position du joueur. C'est une routine importante, puisque Pessence même d'un jeu d'aventure est l'exploration er la découverte dé nouveaux endroits. Le changement de heu se fait en modifiant la variable lieu courant*, et en atfichant l'image et le texte correspondant à ce nouveau leu, Routine d'examen La procédure Eaffichage message(numé) aifiche le message numéro Numé Le texte est stocké dans le tableau message()$. Ce texte est formaté avec 36 caractéres par ligne avec la routine Bformat avant d'être affiche à l’ecran. Une fois le message affiche, le programme affiche une petite boîte de dialu;;uc ivec le méssage “OUK. Le Joueur deut chquer dans cerre bofte pour quetter Foption ” EXAMEN” Routine de conversation La procédure Éparler personnage(perso®) affiche le texte du dialogue numéro persos Ce exte est sauvegardé dans le tableau dialogues$(). Une fois le tecte affiche le programme attend que le joueur clique dans une petite boîte OR qu'il dessine apres le texte, Ce système de dialogue est semple. Il n°y à pas de véritable conversation, Beaucoup d'anciens jeux utilisent ce principe, mais il ët possible dé faire mieux et de simuler (du moins partiellement) une véritable conversätiont. EE R E E T RE E e r e e e e e e r e r e e e e e r e r d d rr d * # CONVERSION IMAGES DEGAS ELITE ⇒ FORMAT BINAIRE * A E R T E e e e T e e e ee e r e e e r e d r e r e e e e r rs rs ds dn e d i e e e e r t e e e e e e e l e d e e e e rs r d e e « vs ProgrCONaV mIMGm.GeFA * i t*kt:i¥itiiii ! # (C) 1990 Patrick Leclercq * ! # (C) 1990 ATARI MAGAZINE ” LRI UR e e RESERVE 50000 HIDEM Ggen imgs SHOWM END I 1 kol e e e e 3 ok e e g e e e e e o o o ok e e RRN o el ”' % CHARGEMENT D'UNE IMAGE DEGAS ELITE * DWW RR T o R A A R R R r e “ e r 1ol sl TR e o ol R e o o R o ol e e R SR ol e el e o R e e e e | * La palette est stockée dans la variable globale* \ * paletteS. Cette variable est réutilisée par la * * procédure Bsauve image(). * l Lk T T e e e e e r e e e e e e é e d e T e e PROCEDURE Toad degas (nom$) palettef=SPACER(32) ! Réservation mémoire 32 octets OPEN “i”,#99,nocm$ | Ouverture Fichier nom3 SEEK #99. 2 1 ON SAUTE LES DEUX PREMIERS OCTETS BGET #99,VARPTR({palettes),3Z | Lecture palette img VOID XEI05(6,L:VARPTR{palette$}) ! Mise à jour palette EGET 299 XBIO0S(2),32000 ! LECTURE IMAGE SUR ECRAN CLOSE #99 | Fermeture du fichier RETURN ÂATARI MAGAZINE E BEST OF GRA BASIC — =— — —— = e E —— = B O T E Tt RR ÉÉ kR e e e i * SAUVEGARDE D'UNE IMAGE SUR DISQUETTE * d d d e 5 A r r d e e e e E S S T e e o E b b b e e PROCEDURE aauvewîmage{nüm_jmage$} LOCAL adr& taille==LEN(image5) OPEN “o“,#1,nom _ imaget BPUT #1,VARPTR(palette$),3? ! Sauv. Palette image BPUT #1,VARPTR{taille%),4 | Sauv. Taille image BPUT #1,VARPTR(image$),taille&! Sauv. Zone mémoire img CLOSE #1 ! Fermeture fichier ! Taille image I Quverture fichier RETURN d e A d d e AI * BOUCLE DE LECTURE DES IMAGES 7* T RR RR RI E dde eh e e E e A E DO S e e r r r e e e e e R e e R e e d e e L * L'image lue est stockée dans la variable globale * * imagef. d d dn e d e e d R e é é d d d A e A A A d d A RE CR PROCEDURE gen imgs LOCAL nom degas$ . LOCAL nom fichier} LOCAL px%,py5s LOCAL px2%,py2% RESTORE donnees imgs 00 READ nom degass EXIT IF nom degas$=“*FIN” READ nom fichier$ READ px=,pys px2%=px*+307 pye4=pyè+za Calcul py2% #load degas(nom degas$) | Chargement image DEGAS GET .px%px2,%, ppy2%y,im®age,d! Lecture image Ésquve image(nom fichier$) ! Sauv, image sur disque LOOP Fixe pointeur DATA ! Test si Fin de donnees Lecture position imagé Calcul pxs —— L — — L ” L RETURN et B PP P LT RR RR E RRN e é E * ST0CKAGE DES COORDONNEES DES IMAGES * Ak kA EEEEAAAAANE TN ETE RERÉETARRER RR RUN DATA Nom image DEGAS ELITE DATA Nom fichier binaire DATA px, py DATA #FIN donnees imüs: DATA VILLE.PI1 DATA VILLE.BIN DATA 6,28 Lecture nom image DEGAS Lecture nom fichier img DATA TAVERNE.PI1 DATA TAVERNE.BIN DATA 6,28 BATA MARCHEL.PIl OATA MARCHEL.EIN DATA B,Z258 DATA MARCHEZ.P11 DATA MARCHEZ.BIN DATA 6,28 DATA GARDE.PI1 DATA GARDE.BIN DATA 6,28 DATA PRISON.PI] DATA PRISON.BIN DATA 6,78 | I R T Ik v e T e Re Sk ! * INDICATEUR DE FIN D'IMAGES #* L RR E E R d e e DATA *FIN AhkakE A r r A e e e e e e e e d e e e d r e d d RE RE * GENERATEUR D'IMAGES POUR DEMONSTRATION JEU = I RR RRN TENARAAEERRÉRET IERE NNN LY TR R bk hrdrh o ® s RE ] ttttwttt&*#i#ttt*fi* * * Programme GEN IMGS.GFA * D e e e d e e e e R e E R e e E ' * (C) 1990 Patrick Leclercq * * (C) 1990 Atari Magazine * | RR R AT TR st RE RS RESERVE 10000 @def couleurs Egen images END Éh dh RRN E R NN RE E E * DEFINITION PALETTE DE COULEUR DES IMAGES * dh A RE A A e e e e r r e e é d e d e PROCEDURE def couleurs LOCAL i% LOCAL c& RESTORE couleurs FOR 1=0 TO 15 READ c% ~ VOID XBIOS(7,1%,0%) NEXT i% RETURN ATARI MAGAZIME a BEST OF GFA BASIC ñ J D E+HARea RR R R E AN ÉÉ ER R * * PALETTE DE COULEURS DES IMAGES * DRh E RE RR R R c e R ke couleurs: DATA 4000,8700,4070,5770,4007,4707,5077,4555 DATA $333,8733,4373,4773,4337,9737,5377,5777 L e é T d e dh e A e de d e dh e r dn r de RE S * * AFFICHAGE D'UN RECTANGLE PLEIN * E RE = T A REN e e e c c E PROCEDURE rect(pxä,pyb,txæ,ty, c5) LOCAL px2%,py2% pxés=pxatixs-l pyés-pystiysl DEFFILL c& PROX px%,pys,pxepyse,s RETURN - | SREE R AV e d e d E r e ce e d e A r R RR AAX ! * SAUVEGARDE D'UNE IMAGE AL FORMAT DEGAS ELITE * | LFN RE RE A o il e KRF AAARE PROCEDURE save degas(noms) LOCAL paletted LOCAL resolutiond LOCAL aër pals LOCAL adr resol& LOCAL adr* LOCAL i% palettef-$PACES (32) | MEMOIRE FOUR PALETTE resolutiont=SPACES (2] | MEMOIRE POUR RESOL. adr pal%=VARPTR(palettef) | ADRESSE ZONE PALETTE adr resol%VARPTR(resolution$)! ADRESSE ZONF RESOL. INT[adr resol%;=XE105(4) | LECTURE RESOL, ECRAN adr“=adr pal= FOR i%=0 TO 15 ! LECTURE PALETTE COUL. INT{adrs}=XBI0S(7.7%,~1)! LECTURE COULEUR 1% ADD adr%,? NEXT 1% OPEN “a®,#99, nom$ BPUT #99,adr resol%,2 BPUT #99 adr pals,32 BPUT #99,XBIDS(2), 32000 CLOSE #99 RETURN OUVERTURE FICHIER ECRITURE RESOLUTION | ECRITURE PALETTE COUL. ECRITURE DE L'IMAGE FERMETURE FICHIER i J.”,l,':,lri'i“.l':l::l:t'kt*#:‘:i::“r*'fi':fi”fi''fi o ' # DESSIN DES ZONES DE CLIC * E E E E E E E E E E E E ETE E ETE PROCEDURE dessin zones LOCAL px6;pyt,txs, Ly DU READ pxs EXIT LF px$=-=1 READ pyë, tx%, tys @rect(px*,py&,tx5,ty#,14} | Dessin zone de clic LOUP RETURN I Test si fin de zones |l o e e e ol e i e e o o e o oy e e e e RE * # GENERATION DES IMAGES * i 4t AR EET ektd PROCEDURE gen images LOCAL nom images RESTORE donnees û READ rom imaget EXIT IF nom image3=“*FIN” CLS Grect(6,78,308,80,5) Bdessin zones Bsave degas(nom îimage$) LOUP RETURMN | Dessin fond image TE E i RRN e ik ok o e e e e e i * DONNEES DES IMAGES * dh e A A A e e E R E donnees: DATA VILLE.PIl DATA 16,48,60,40 DATA 86,38,606,0 DATA 156,48,00,40 DATA 276,38,8,60 DATA 244,48,60,40 DATA =1 DATA TAVERNE.PI1 DATA 38,53,20,30 DATA 90,78,80,20 DATA 202,78,80,70 DATA 90,38,60,25 DATA 202,38,60,25 DATA —1 DATA MARCHEL.PI1 DATA 20,91,280,15 DATA 22,33.62,50 DATA 100,33,42,50 DATA 158,33,82,50 DATA #56,33,42,50 DATA —l DATA MARCHEZ,PII DATA 20,91,280,15 DATA 53,33,40,50 ATARI MAGAZINE ESIRM BESTOFGRA BASIC | Dessin des zones de clic DATA 140,33,40,50 DATA 227,33,40,50 DATA —1 DATA GARDE.FTI DATA §3,33,40,50 DATA 120,33,40,50 DATA 227,33,40,50 DATA —l DATA PRISON.FPII DATA 34,74,40,30 DATA 34,34,42,30 DATA 104,34,42,50 DATA 174,34,42,90 DATA 244,34,42,50 DATA —l DATA *FIN | 4R ÉRANTNEETER bbb Atk tdrerddsd P JEU D'AVENTURE GRAPHIQUE ë ;* A i RR RR R R A AR R R ek | € Programmation GFA BASIC 3.5 * | #* Testé sur 1090 STF & 1040 STE * ! * (C) 1990 Patrick Leclerca rl ! * (C) 1990 Atari Magazine b | A i 3 TN s R W R R R s VIRNEE RESERVE 100000 |RESERVWATION MEMOIRE POUR SYSTEME BASIC OPTION BASE 1 — !INDICES DE TABLEAUX COMMENCANT À 1 DIM souris$(100) ITABLEAU POUR LES FORMES DE SOURTS nb_suurîsä=Û INOMBRE DE SOURIS DANS TABLEAL sourish DIM Tieux5(100,2) !TABLEAU POUR LES LIEUX DIM imaçes$(100} !Tableau pour les images de lieux DIM descri$(100) !Tableau pour les descript. de lieux DIM zones#(1000,7)!Tableau pour les nb de Zones par lieu DIM messages$(100) ! Tableau pour les messagés nb _ méssages==D DIM dialoqués5(100)! tableau pour les dialogues nb dialoguess=0 1 NOMBRE DE LIEUX EN MEMOIRE | NOMBRE DE ZONES EN MEMOTRE nb_|ieux-=0 nb_ïünüää”Ü DIM Tignest(20} ! Tableau formatage texte pour affichage nh lignes%=0 ! nb de lignes présentes dans ligne${) fondé=SPACF{(32000)! Variablé pour mémorisation écran ÂTARI MAGAZIME DEFMOUS0E Ginit souris @init lieux Cinit messages Ginit dialoques lieu courants=1 FORME SOURIS = ABEILLE INITIALISATION DES FORMES DE SOURIS INITIALISATION DES LIEUX INITIALISATION DES MESSAGES INITIALTSATION BES DIALOGUES P ey e e GRAPHMODE (2) [1 MODE D'AFFICHAGE TRANSPARENT FOUR AFFICHER LES CARACTERES SUR N'IMPORTE QUEL -FOND o — -— 1 HIDEM Baff ecran Bgestiojenu DEFMOUSE 1) END EFFACEMENT SOURTS AFFICHAGE ECRAN DE JEU EXECUTION DU JEU | FORME SOURIS = FLECHE FIN DU FROGRAMME E RR A A AW R R R R AR A AR Rk f d E A F ï = ' * ROUTINES SYSTEME DU PROGRAMME * DRSN E RR R RE Ak A ke Exxddd | VATTRREETERT TRISE ER RR ! * EFFACEMENT DE L'ECRAN * I e i oo o o o o o e e d és d d W E E | oo & o o 3 o o e o R R WA e R ÉF “R c% “ couleur de l'écran * L E E E E e E E E E c E E E PROCEDURE cls ecran(es) DEFFILL € PROX 0,0,319,199 RETURN ! Couleur rectangle | Dessin rectangle | UR RESEE R R R E E T R e e e e | * AFFICHAGE D'UN RECTANGLE PLEIN * D e e e m e e e e e e e e e S d e E “* pxs : Pésition x du rectangle 7 E pys - Position y du rectangie 7 | # TX : Largeur du rectangle u ! # L% : Hauteur du rectangle H ! * c% & Cowleur du rectangle o I gk ke ETE TR ki xR RE RR R R PROCEDURE rect{px®tx,d,p tyvvk,h.c.k) LOCAL pxess, pyes puésepxertxe=l pyésepyattys-1 ; DEFFILL e3% - ! Couleur rectangle PEOX px* pyt,pxés,pyès | Dessin rectangle RETURN E et ok ok o o e e e de e g o o o o o e e e e o e EN BEST OF GFA BASIC - * * AFFICHAGE D'UN CADRE VIDE * DO ok oy o i e e RR R RE e e e RS R RN P E | L L E UE AT A R e E E E E E E E E d d d e E E E SE A E d & P p t : Position x du cadre e 14 p : Position ¥ du cadre ‘ 55 ¥ < : Largeur du cadre * Vs E A : Hauteur du cadre Æ e Fonds : Couleur fond du cadre * ! # cContour® : Couleur bords du cadre * k E E r R uc é rr rn A e PROCEDURE cadre(pxf%, pys, tx*,ty5, Tond%, contours) LOCAL px2%,py2% pr2i=pritixni-1 pyvds=pys+tysl DEFFILL fond% ! Eouleur fond PEOX px%,pye,prd%,pyes | Dessin fond COLOR contour* ! Couleur contour BOX px* ,pyt,pxés,pyes ! Dessin contour RETURN P R L L L L H T T T TP e ”= TEST D'UNE ZORE GRAPHIQUE * | ORRRRRRR SREE RRN RR E AN R AR T T L I VV E E E E d e e S E e e e e p p ‘* Cette fonction teste si la position (x%.v%) * est comprise dans la zone graphique (pxé,pys, tx5,ty5}. 51 la position est comprise dans Ta zone, Btst zone renvoit 1. Dans le cas contraire, elle renvoit 0. | A o L e T 8 EN E E e e m R R R E RE E E RN A FUNCTION ifit_ïüne[xä,y%,px%.pï%.tx%.tïä] LOCAL pxd%,pyes LOCAL T £ + + pxésepxetixé=l pyésepyetiye-l r==0 IF (xé>=px$} AND (x%⇐px2%) TF (yé==py4} AND (y¥←py2%) el ENDIF EMOIF RETURN % ENDFUNC B dh dh e o o o O R e e A A o el R é E E *.* ATTENTE CLIC DANS UNE ZONE 7 | VVRRREEETÉTÉETTTTÉREETÉTTTERÉÉÉEE RE A d d e e e é éc e é dn de ok o ok Ak P e e ke o O N R R W R E E R E R ‘*Cette procêdure attend que l'utilisateur clique dans* ‘*uné zone précise de ]'Écran. ; | E E m e m e m e e e e e e v e r e e e L e e e e e f e e E e PROCEDURE wait zone(px&,pyt,tx%,ty=) LOCAL xmé, vméé L 00 datt clic[xmé, yms) EXITTF @tst zone(xmé, ymé,pais, pys, tik, tys) =1 LODP RETURN | RRF b b Ul T T e A A SRR R AR RS R RS SRS ok d rT P PE E ! & ATTENTE CLIC SOURIS AVEC FOURNITURE ETAT SOURIS * T & o = o S e o o e e e e e o e r g e o Tt o e e et R S ! = {ptte procédure attend que le joueur clique avec * ! = la souris. Elle fournit Ta position (x,y) de clie* ! * à la procédure appellante. Elle ne rend là main * * # que lorsque le joueur a relaéhé le clic soûris. * L RR R r e é d e e d e e e d d e e A A d d d e E PROCEDURE att_ÇFifi[ïhfi x , Varé) LOCAL Kms i B0 MOUSE xmés, vmés, kmés EXIT IF kmée=0 LOUP D EXIT IF MOUSER=L ! Att arrêt clic LOGF RETURN l l Att clic souris 1 d e n d d e d nl e d * ATTENTE CETC-SOURIS * wtitittttt*£#t*t*!fl AERX RE R AR AR EFERA LA d e d e d e R E ‘*Cette procêdure attend que le joueur ait cliqué. Elle* ”#*np rend la main à la procédure appelante que lorsque * ‘*le clic a cessé. À la différence de datt clic, cétte * ‘*procêdure ne donne pas la position de clic. F i t+#htfiti#fifii*fifi*#iti* PROCEDURE wait clic REPEAT UNTIL MOUSEK I Attente clic souris REPEAT UNTIL MOUSEK=0 ! Attente fin de-élie ~ RETURN | ARRRHARHHRRREÉRRRRRRRR ÉN AAE RR | # ATTENTE ARRET CLIC SOURIS = 0R A E e d e d e d d d d PROCEDURE attüclic REPEAT UMTIL MOUSEK=0 RETURN Ï I [ o Sk e e e d S keL S * #. COULEUR DU-TEXTE * b o o o ok RR A R i e VR e e R PROCEDURE texte color(c*) ATARI MAGAZINE fl BEST OF GFA BASIC 1 A d d R b s S e SE _ | « RESTAURATION DE L'ECRAN * DEFTEXT c% - “Caiéean des mts : IF (ligne$=”“) AND (tampon$<”“) e eR . | — PARAMETRES ROITINE - ‘ L ARRRAAAAERREE RS AAN AR RE RE A RE EN E E RETURN INC nb lignes% | ‘ d : lignes${nb lignes*)=tampons , ! * L'écran à restaurer doit d'abord avoir été stocke * (S MRSyA ES S # m : texte à formater ‘ tampon$=”“ ” ! * dans la variable globale fondi par la procédure * t A e e d d R E ! * taille* : nombre maximum de lettres par ligne X ENDIF ' * @memorisation ecran. = ( AFFICHAGE TEXTE EN CARACTERES GRAS * * # SORTIE ROUTINE : _ f - D dh d et R e S et b L L bl RE L ek ek e e e sk ok WO e ek e e e R R kR L É e E ä IF (tampont-=“”} AND (lignet⇐“”) PROCEDURE restauration ecran PROCEDURE texte gras ' * Les lignes sont stackées dans le tableau Tligness().* IF LEH{11EHE$]+1+LEH[tümpgn$}ä=tfi111ËË SPUT fond$ i BEETERT ù 7 \ * La variable nb lignes* contient le nb de lignes du* INC nb ligness RETURN RETURN \ ® tableau lignes$(). ë 1âgneaî{nh lignes*)=1igne$+“ “rtamponi ‘ ‘ | dedede d n d d d e e dede e de d e d e e e ce eh e r e d W 1ÎQHE$=”“'— | - l PROCEDURE format{mk,taille*) tampont=”“ rrr e e e e e d d A ETE | — TÉEREANAE RE É '].”J.“.l.“.fi”.il“.t.:l: FxEHE R RR ETEN E d LOCAL tampond ELSE ' * ROUTINES SPECIFIQUES AL PROGRAMME # Lol flFF!EHAEE TEXTE EN EÈHÈETEHEE ÎÏÊLIDÜES L LflEAl p% INC nh Ïiflfl&fi% | R e RE R RR A ok ETE LR E SRI RE E RE LOCAL c$ 1îgnesï{nb lignes#)=ligne$ | PROCEDURE texte italigue LOCAL lignes ligneg=”“ | e d I d E DEFTEXT ,4 ' INC nb Tignes% | # INITIALTSATION DES LIEUX * RETURN nb_lignes%=0 lignes${nb lignes#)-tampont R L e d T dehehe hh fdt ' Lamponf=”“ tampunin”“_- * D p d d A d e e d e e e e r ce e d RE n lignef=”“ ENDIF * % Cette routine lit les données stockées en DATA, et ” E e cé Pl ue sc E UE | ‘ ENDIF ! * les mémorise dans les tableaux correspondants * ! — AFFICHAGE TEXTE EM CARACTERES NORMAUX * FOR pt=1 T0 20 | | * (images$(), descri$(), zones&(), Tieux#(}}. Î SR R e e d R d A lignes${p=}=”“ RETURN 1 ec é e d d d A e d d e e d e d e e e e PROCEDURE tfiïte_nufimaï DEFTEXT ,Û RETURN L e e e d d e d e e e S E R A o e e e d d E * AFFICHAGE TEXTE EN CAR. BRILLANTS * b bddede e dn d d A d e d E E A R RR RESRE PROCEDURE Lexte brillant DEFTEXT 42 RETURN B E E A TR A C e e i e S ok e g dr R R AT e R * AFFICHAGE TEXTE EN CAR. SOULIGNES * 1 L T dede dc e e e e e e m e e r e n d d h e S SÉ PROCEDURE texte souligne DEFTEXT ,B RETURN oo e e dode i ok ok ke R R el AW W R R e e o e e E RR * AFFICHAGE TEXTE EN CAR. ENCADRES * ol ue o e 0 Ak A e ek E e e d d d R R R e c é n E PROCFOURE te:te_encadre DEFTEXT ,16 RETURN Ë D e T e e el r rr e e c0 66 d n e * FORMATAGE D'UN TEXTE * W E E R e A T NNN IERE R E SE E E S E E R ETE E E A A E e RR E E E E E E E A A d E E A R E E R * Cette routine découpe un texte en plusieurs lignes * = pour un affichage propre. Le découpage sé fait au * NEXT p* d A é R e d k= * BOUCLE DE DECOUPAGE ” B e e e e ok É e e e R RR E FOR p%=1 TO LEN(m$) c$=MiD${mt,p#,L} IF g 0 | tampon$=tamponé+ct ENOTT [F tj=e” ” IF LEN(lignet)+1+LEN(tampant)⇐tailles IF lignes=“” ligne$-tampont tampon$s=“” ELSE lignet=lignes+“ ”+tampont tampon$=“” ENOITF ELSE INC nb lignes* lignes${nb lignes#)=1igne$ lignet=“” IF tamponi==“” tarpon$*=tarmont+t“ ” EMDIF ENDEF . ERDIF NEXT p4 Sn A en r e r d d e e e e e e e E * FIN DU DECOUPAGE * ATARI MAGAZINE m BEST OF GRA BASIC E E R E o ol E el E e e E E e e d E E E E e ! # AFFICHAGE DU TEXTE FORMATE * | drfed i bk gk & o RO R E E ETE UR |F RE RN AR R R e e ek g E E ol ke R e e e * Cette routine affiche le texte mis en forme par la * * routine Bformat à partir de Ta position graphique * * (px*,pysl. ; e d rr 02e MR A R u E R A E A U E E A A E R E E E E E bl R C R E e e E A PROCEDURE aff format{(px#,pyt) LOCAL 46 LOCAL 15 Y= Py FOR 1%=1 T0 nb lignes= TEXT px%,v*,lignes5{1#) 1 Pos Ÿ pour début affichage ! Éoucle affichage message ! Affichage texte message ADD y&,0 | Passage ligne suivante NEXT 1% RETURN I Rk e o e R EN bl R e * MEMORISATION DE L'ECRAN * E e e ke el o e e e e e e ek e P d T e e e é e d d e e e e e e e e R R R e s e e ke *l 'écran est mémoôrisé dans la variable globale fondf* I oA A A A AR RR E E R E A É E É R e E RR A PROCEDURE memorisation ecran SGET fond$ ‘RETURN U E E E e i i e sl ded o o rr e IS W R A A A e e ATARI MAGAZINE PROCEDURE init lieux LOCAL px% LOCAL img$ LOCAL mess} zo| inbrees=1 nb lieuxs=0 nh zones#=0 RESTORE Tieux DG READ img EXIT IF img$=“*FIN” INC nb lieux% images${nb lieux%)=img$ D READ messt EXIT IF mess$s=“*” méssi=“ ”+messi descrif{nb lieuxs)=descri${nb lîeux#)+mess$ LOOP lieux#(nb_lieux%,1)=zone_libré* D READ px EXIT IF px%=-1 sones*[zone libre#,1)=px#* READ zones*(zone lihre=,2) READ zones%{zone libre*,3) READ zones%(zone lîbres,4) READ zoness{zone libres,5) READ zones%(zone 1ibref%,6) READ zones&({zone libres,7) READ rem$ INC nb zoness BEST OFGFA BASIC INC zone Tibres LOUF \teux#(nb 1ieux%,2)=nb zonask LOOP RETURN = e d e é é d e d d d kA e e R e e e A e e d * INITIALISATION DES MESSAGES * d E T E d e A A R rc RE R d e E e o o e o e e r e 7 A A e e e ok o b e R R o i e d e d e ok ok RRN N E b ok e *Cette routine 1it les messages stockés en DATA, et * “les mémorise dans le tableau messagesi(). La ; *Variable nb messages% contient le nb de méssäges. ” Kk R R e d d d R R A A RE NN RE PROCEDURE init messages LOCAL m3 RESTORE méssages nb méssages==0 i READ mt EXIT IF mi=“*FIN” INC nb messagess messages${nb messages*)=n$ L0 READ mi EXIT IF mb=“*” TI'-:$=“ ”“I'IIS mEBSEgESÉ{fih_mEEEEQESÈ}=m935flgE$${nh_MESSHQESÊ]îmï LOOP LOOP RETUEN é éh e e d d e SE R RR A P E * INITIALISATION DES DIALOGUES * bh e e e e é é é o ok d d d d d d ke e R PR E E E E E E E RR E E 44 4 dhbcici dh eBafedioh B RE TRk chidududeitehieh *Cette routine 1it le texte des dialogues stockés en* *[ATA. et les mémorise dans le tableau dialogues$() .* *La variable nb dialoques* contient le nb dedialogues™ *de dialogues${). u i wwk;tttw*wwitttttt*#wk!itt*t:t*ik*k*#imtt PROCEDURE init dialogues LOCAL messs LOCAL n% RESTORE dialogues n#=0 [H READ mésst EXIT IF mess$=“*FIN DIALOGUES® INC n5 dialoquesf{n%)=messt D READ messs EXIT IF mess$=”#” messé=“ ”+messh dialoques$(né)=dialoques$(n*)+mess$ LOO# LOOP no_dialoguess=ns RETURN A E E A d d e e d e e d e R A R RE * INITIALISATION FORMES DE SOURIS * | RR RLRRRRANAAER RR A bbb ek xRN RN AT SÉ PROCEQURE 1nit souris LOCAL v fS RESTORE souris nb souris*=0 D0 i READ w% ! Lecturé DATA EXIT IF v5=-1 | Test si fin données INC nb souriss ! Une nouvelle souris f$=HHIÏËv%] ! DEbut données souris FOR i%=1 TÜ 36 | Début Tecture données READ v ! Lecture DATA souris fé=f4+MKI$[v5) | Mémorisation donnëéés souris NEXT 1% | Fin Boucle lecture donnees souris#(nb souris®)=f$! Souris dans sourisk() LOUP RETLRN R A r e d e d e T e e R R é e ok e e * RECHERCHE D'UNE ZONE DE CLIC * PEc d d 044 d e e É RE E d d E E E é E E I E RS æ*gæitittttw*tttt:t*fl##fiktt*t*#r:ü*#ùi:* *Cette routine cherche si la position (xm,ym) ? *correspond à une des zones du lieu courant.si c ést” *13 cas, fournit le numéro de cette rone. En cas de * ‘ * recherche négative, elle renvoit la valeur (. = L LRN R RN E E S R RR A RE E AR b AAEAEEEdtt bbbt * umé : Position % * * ymd : Position Ÿ * dc d e m d A e e e d E FUNCTION cherche zone(xm®, ymé) LOCAL né,ré LOCAL zone debut=,zone fins LOCAL px pyt, LxR, Ly r%=0 zone debut*=l“ieux*(1ieu courant#,1) zone fin%=Tieux%(1ien courant*,2) FOR n&=zone debut% TO zo_n fienä px*”zones#{n,1) pyéezones%(né,2) tx5=zones5(n#,3) tyk=zonesk({n%,4) ATARI MAGAZINE m BEST OF GFA BASIC rrF PE :î‘ -='%hr—æ_-ir === 2 r P - = — r-———_——_rrfi._—-_— c IF @tst zone(xm®, ymés, pxi,pyée, txé, tyé)=1 réens ENOLF NEXT ni RETURN r% ENDFUNC i | ke d n R e d d d e R R d A E ' * MODIFICATION DE LA FORME DE LA SOURIS * PROCEDURE forme souris{n%) TF n*=0 DEFMOUSE Ü ELSE DEFMOUSE souris$(n&) | Souris redéfinis ENDEF RETURN | Souris flêche R s T d d dn d d d R R E | * ATTENTE D'UN DEPLACEMENT DE LA SQURIS * | RARRRR E REN RRRR RR E RR RN E EN E RR RE HE E | RE AN E 1 E e E e S n e e E e S e e e S e E ! * Cette routine attend que la souris change de. *. | * position, ou qu'il se produise Un clic souris. * | ÉAETRERAAARENE RE ÉÉ RR RE E RR RR R RRN É E x PROCEDURE att move souris{VAR xmée, vmés, kmes) LOCAL x0%; y0% %= X y0é=ymé GO MOUSE ms , Vm6k,ms EXIT IF 1) LÔOP RETURH I I e e e e e e e e A e ok 3t gk o e e e e 3 3 e v ok e e e 1 o R R TR * = AFFICHAGE DE LA DESCRIPTION D'UN LIEU * | gl b bk e e e e o ok b Al e ik e E e e e e E FROCEDURE aff texte(num 1ieux%) eformat (descrif{num _1ieux%),38) ! Texte 38 lettres/ligne Brect(h,114,308,80,38) lEfface texte précédent Baff format(8,124) lAffichäge texte formaté RETURN I |- e d e oo v g v e d d e o o e o e i i e oo o O R R S e E E ! *. AFFICHAGE DE L'IMAGE DU LIEU COURANT * | TRL L ETEN re d E E d E PROCEDURE aff image{num 1ieu%) LOCAL paletted LOCAL taille% LOCAL nom image$ ATAR| MAGAZINE ! Nom image |ieu | Mémoire pour palette nom image$=images$ (num l ieu#) paletted=SPACES(32) OPEN “1”,#1,nom_image BGET #1,VARPTR(palette$),32 BGET #1,VARPTR(taille=),4 image$=sPACES (tailles) EGET ÿ1,VARPTR(image$),taille* CLOSE #l VOID XBIOS(6,L:VARPTR(palette$))! Modif. palette PUT 6,28,images Aff image Baff texte(num lieu%) | Aff description lieu ! Quverture fichier ! Lecture palette image lecture taille imäge Mémoire pour image | Chargement image Fermeture fichier — rr RETURN q rr d dh e e RR A E R d e d E + AFFICHAGE DE L'ECRAN DE JEU = dh e dc ce e é d e d e e e e e d e R A d d d d d A A *Cette routine est utilisée au début du programmepour® “afficher l'écran de jeu qui sera utilisé tout le ] # =reste du temps. 5 R RR A A e e d e d e d e e e d e e e R e e é é d d d d d E PROCEDURE aff ecran @cils ecran(9) . ! Effacement écran gtexte color(d) Étexté gras Écadre(6,6,56,15,8,0) TEXT 14,16,“INFOS” Acadre(79,6,64,15,8,0) TEXT 87,16, “SAUVER” Écadre{161,6,72,15,8,0) TEXT 169,16, “LECTURE* ücadre(249,6,64,15,5,0] TEXT 25/,16,”SORTIE“ @texte normal COLOR D BOX 5,27,314,108 BOX 5,113,314,194 Cadre INFOS Cadre SAUVER Cadre LECTURE Cadre SURTIE | Cadre du dessin Cadre description Raff image(lieu courant*) Aff image de debut RETUEN FEERR R TR ETE TENTERRRERTÉRRRR E É RVU EE * TEST SI CLIC SUR UNE OPTION DU JEU. 7 e d r d e e r e d e e d d e e e P oF b oo ol o o R e SR d RR E A RR É RR ÉÉÉ É RRN A RESRE *Cette fonction teste si le joueur à cliqué surl'une* *des 4 options du jeu, En cas de recherche positive,* *elle renvoit le numéro de l'option cliquée. En cas * *de négative, elle renvoit la valeur D, ; *t*?tfitt#*iifit#t*##*it*##flmfi* FUNCTION cherche option{px%,pyk) LOCAL zone% BEST OF GFA 8ASIC zones=0 ‘ Test pour option INFO 1F Ëtat_;une{px%.py%,ñ,fi,55,15J=1 zone%=l ENDIF ! Test pour option SAUVER IF @tst zone(px#,py5,79,6,64,15)=1 zone#=2 ENDIF ' Test pour option LECTURE IF @tst zone(px%,py%,161,6,72,15)=1 zone%=3 ENDIF * Test pour option SORTIE IF Btst zone(px%,py%,249,6,64,15)~1 zone%=4 ENDIF RETURN zone% ENDFUNC AN NI FEEEEEE kA RxwEERA RN TEE * ATTENTE CLIC SUR UNE ZONE * e —h dc e e e e e E E ETE s É PE e d d e E DE É RR d d d e e DE A ce E d d e d e d e d d e d A e d e d e e R E e d e *Cette procédure attend que 1'utilisateur clique sur* *une zone de l'écran, ou sur une option joueur. Eile* *gére automatiquement les changements de forme de la” *souris en fonction des zones de | 'écran. & TN AP R r e Spr e e d e e ol R e e e e e A ko — ! #* Cette procédure modifie les variables globalés æ ! * tvp click et zone clic*. L c typ;clic% = 1 ⇒ clic dans une option utilisateur * | = typ click = 2 ⇒ clic sur zone écran L * * zone clic* = numéro de la zone cliqué ù ! ttt{;xttkH!itttt*t:ti#k*#ïüüÿfifll* PROCEDURE att zone clic LOCAL Xm , YITÉS , ki LOCAL num souris* LOCAL num zone* LOCAL zone souriss LOCAL num _ options 1 drar e d ce d d e d dn d se e e E r e e e d e e e e d ce e d ! * DETERMINATION ETAT INITIAL SOURIS * L d A R R R o e e É A A el i e MOUSE semés , ymée , ke ILECTURE ETAT SOURIS zone sourisk=Bcherche zone(xm%,ym%) RECHERCHE NUM ZONE IF zone souris%=0 num souris#=0 ELSE num sourisk=zoness{zone_ souris%,5)ILECTURE NUM SOURTS ENDIF @fürmg_suuris[numuauuriäëä | CHANGEMENT SOURTS SHOWH 1 AFFICHAGE SOURTS DU @att move souris(am® , vmé,km&}1 ATT DEPLACEMENT SOURTS num Euneä:@cherche_:üne[ïmä.jm%}! CHERCHE ZONE SOURTS LF Înum_:uneäähznne_snuri5%] ITEST CHANGEMENT ST ZONE zone souris®=num _ zone*# ! MODIF. ZONE SIMIRIS IF zone souris*-0 | num sourise=Ù ELSE num_finurî5%=znn&5%[num_:uneâ.5] | NUM SOURTS ENOIF @forme souris(num souris*) ! CHANGEMENT SOURTS ENGIF typ clic==0 IF (km%=1} AND (num_zone%==0]) typ clics=2 zone clic&=num zones ENDIF num_options=@cherche_option(xns,ynrs) LF (kméés=1} AND (num options=0) typ clic&=l zone clic*=num _ option# ENDIF EXIT IF typ click==0 LOUP RETURN L E E E R P A MR RE TR e e e E r r « * #* CHANGEMENT DE LIEU “ L P A e E E E E E E o o E e A R E E PROCEDURE dEp]flcement{num_]1Eu%} HIDEM | Effacement souris lieu courant&-num_l1éu% ! Nouveau Tieu courant Gaff image(lieu courants) ! Aff nouveau lieu SHOW# ! AfT souris RETURN | AARÉÉEEEE E ER E AR EN ETE | * PARLER À UN PERSONNAGE * I REFN AATARRREEEÉRRAÈRRER PROCEDURE parler personnage(perso®} fattüclic | Attente arrët clic HIDEM | Effacer souris Ememorisation ecran fcadre{11,52,298,96,1,0) Btexie gras TEXT 128,64, “DIALOGUE” @texte normal @furmaï{di&OEügueasip&rsu%],35}! texte 36 caract./ligne gaff format(16,76) ! Aff texte dialogue Bcadre(l44,125,32,15,2,0) @texte gras TEXT 152,135;”0K“ Btexte normal SHOWHM ! Aff cadre conversation | Aff titre option 1 Cadre pour OE | Aff de 0K AÂTARI MAGAZINE fl BESTOF GFA BASIC —— p ' | ; | | @wait zone{144,125,32,15) ! Attente clic sur “OK' HIDEM I Effacer souris @restauration ecran ; SHOWM | Afficher souris RETURN 4 DN REEREÉRÉEEARIARATETAANANTE * AFFICHAGE D'UN MESSAGE * E A E e e S D DE D CR SE CR T T e e A T E E PROCEDURE affichage messagé(num) Battlclic i I Attente arrét clic HIDEM ! Plus de souris @memorisation ecran | @cadre(11,52,298,965,1,0) @texte gras TEXT 136,64,”EXAMEN” @texte normal ä @format (mess(anumgs)e ,3s6}$ ! Texte 36 car/ligne @aff format(16,76) ! Affichage du Lexte Tormaté @cadre(144,125,32,15,2,0) @LexLe gras TEXF152,155, 0K Étexte norma] SHOWM fwait zone(144,125,32,15) | Cadre boite ! Affichage Titre option | Cadre boite 'OK° | Affichage souris | Attente clic sur 'OK' HIDEM ! Kemise de 1'&cran Grestauration ecraf ! dans son état SHOWM ! inffial, RETURN Ve e o ok RE e e e o o o W R A : # EXECUTION DES ACTIONS * | itk TÉEETTTETER E PROCEDURE Eïec;actîün[nä,parametre%] SELECT n CASE 1 Bdeplacement (parametre*) CASE 3 EparlEfi_persunnage{parametre%} CASE / Gaffichage message{parametre*) ENDSELECT RETURN i I dededrdede = & g ok o ook e i e ol RR e e e ‘% OPTION INFORMATION * ool e o ol ok il ol ol o e e d e ok PROCEDURE option info Pattlciic HIDEM @memorisation ecran @cadre(43,59,234,82,1,0) @texte gras TEXT 66,69, “JEU D'AVENTURE GRAPHIQUE“ @texte normal _ TEXT 52,89 “Programmatlion GFA BASIC 3.0 @texte italique TEXT 52,99,”(C) 1990 Patrick Leclercq” TEXT 52,109,“(C) 1990 Atari Magazine® @cadre(144,117,32,15,2,0) Etexte gras TEXT 152,1270K,” Btexte normal SHOWM Gwait zome(144,117,32,15) ! Attente clic sur “OK” HIDEM Orestauration ecran SHOWM | SETURN DRTEEEFTE ÉÉÉ E - % OPTION SAUVER JEU * | b o o o o o e W E R R Y R T LR A vty rdetaddrddaaidssh Rd RdR iAd d& oed *Cette routine sauve le numéro du Tieu courant.Dams® *le cadre d'un programme plus gros, on peut sauver * *l'état du personnage (argent, points de vie,objets* *possédés, etc.) 2 L VVN TR SR e R T e P LR R S S 2 L L e e e S T4 L e e ks e E PROCEDURE option sauver LOCAL sauvet I Battüelic FILESELECT “#*.5AV”, “” , sauvés IF sauvet⇐“” OPEN “o”,#1,sauvet _ PRINT #1,lieu courant® / CLOSE #1 ENDIF RETURN L E e E TEI PN D R C D E E R T E PR R E ETE ‘ # UPTION LECTURE JEU # I x*hxETE PROCEDURE option lecture LOCAL lect$,lieu sauv& Battlhclic FILESELECT “*.5. ”“A,lVec”th IF lecti⇐“” OPEN “i”,#1,1ecth INPUT #1,lieu sauvk CLOSE #1 Pdeplacement(slaiuev*u) ENDIF ATARI MAGAZIME m REST OF GFA BASIC —— r S R RETURN de e e e e e R R Rk ok e e * QPTION SORTIE JEU * R T I I E 3 A e o E *w*tgwwfifi*xt:t*kyk?ftw*t#t:w*ti* *La condition de sortie est la variable sorties. ” *Cette routine affiche deux cadres ('OUI' et ‘NON* }* *et attend que le joueur clique sur l'un d'entre ; * faux. 51 le clic a eu Tieu sur ‘OUI', là variable * *sorties prend la valeur 1 (condition de sortie du * *programme) . ¥ tttttt*kiiifi*?#::t#*##tl*#Hit# PROCEDURE oplion sortie LOCAL xmé, ym% LOCAL clic options — dattüclic HIDEM @memorisation ecran écadre(39,74,242,52,1,0) TEXT 48,84,“ Voulez-vous vraiment sortir” TEXT 48,94,”de ce programme ? “ Bcadre(94,101,40,16,2,0) écadre(188,101,40,16,2,0) @texte gras TEXT 192,112, “00T” TEXT 196,112, “NON” Ptexte normal SHOWM clic options=0 00 Gatt_clic(xn,ymé} IF &tst zone(xm#,ym#,94,101,40,16)=1 clic optionssl sortiessl ENDIF IF @tst zone{xm%,ym%,188,101,40,16)=1 clic options=l ENDIF EXIT 1F cl_ optiionsc=-] LOUP HICEM Brestauration ecran SHOWM RETLRN L T ————————————————— e S I *t*#kflftflt*t#itt*t ' * EXECUTION DES OPTIONS JOUEUR * (Y PO PR RS Cpeae T o S T R R IR L T e e R É É R k?ttttt##flh#*tHi*##*t#ii*tl ! * Catte routine lance T'exécution de la routine F ! % as<sociée au numéro de l'option désirée (1 à 4). * *F##ttttt*#*käiÈOEÈ?TIÈififit*ÿ#F* PROCEDURE Exec_nptîun{num_pptiün%} SELECT num options CASE 1 Éoption infa CASE 2 Goption sauver CASE 3 Boption lecture CASE 4 Voption sortie ENDSELECT RETURN | | o r et e S R à CGESTION DU JEU-; * V kA YANNETEEE L% il flkHflw#w*ætt:wtt*flnfitt#t*+illww#:ttw*ïwitt | * Cette routine est la boucle d'exécution du prg. * ! + Elle contrôle 1a condition de sortié. w | SRR Ty B S e RR RR R NNN RR RR N NNN e e e RE PROCEDURE gestion jeu LOCAL actions LOCAL parametres i sortie*=i D0 Gatt zone clic ! Attente clic joueur R W T E BN B E S E A PE 4R R e e E E L* Test s1 clic option joueur * | VR RAR RE RR RAAERR R É NN _ IF typ clrc#=l Gexec option(zone click) ENDIF | | VARSRRRNE EdA m EÉNE E L = Test si clic dans zoné écran 7 È ::zii*fi*#fi?##*i‘I* 1F typ cliça=z actionsezones%(zone clicw,6) parametres=zones%(zone clic&,7) Bexec action(action®,parametres) ENDIF EXIT 1F sortie&=1 LOGR RETURN | Condition de sortie du prg _ L TR PO SO k e R d d d d R A d b RN A RR RS RE E E ' STOCKAGE DES DONNEES DU PROGRAMME = tht!n:*#fitt*tt#x!fi*#*tf | A ARAAR AR TR T dd : * FORMES DE SQURIS * e o e e e e e e o o o RE E E FORMAT DE DEFINITION : ATAR| MAGAZIME OE BEST OF GFA BASIC DATA Position x du point de ciic par rapport au coté haut gauche de la souris * DATA Position y du point de clic par rapport | au coté haut gauche de la,souris DATA mode d'affichage (toujours 1) DATA Couleur du masque DATA Couleur de la souris DATA 16 entiers 16 hits pour le codage du masgue DATA 16 entiers 16 bits pour le codage de là forme — souris: | é e e e d e e e e e e é E R RE | * FORME 1 : ALLER DÉVANT * | RPN N IRRRRNF £ É DATA 6,6,1,0,1l DATA &Dflflfl,&fllED,EU?FD,ElFFH,EEFFfl,&HFFtififl?Efl,&flFFfl DATA @0FFO,&1FF8,&1FF8,83FFC,R3FF8C7,FAFE7,F 2F00E0,0 DATA 60000,40000,80180,607E0,81FF8,807F0,80830C70 E,0 DATA ËÜ?EÜ,EÜFFÜ.5ÜFFÜ.ElFFB,ElFFË,&ïFFÉ,äÜÜÜÜ,äÜÜÜÜ | VWRLREER É RE NAAA RE R A bk kR R ARk E AR ' * FORME 2 - ENTRER PAR UNE PORTE. * | RR L PE E e E h E I E E w A A A é d E d E R R DATA 8,6,1,0,1l DATA R0000,601FF 6G1FF,R21FF,831FF,639FF 6FDFF,8FFFF DATA SFFFE.SFDFFR3OFF,AI1FF,821FF 801FF,801FF 80000 DATA 6000080000 L00FE A00FE, ROOFE, &10FE, B38FE , &7CRE DATA &7CFE RI8FE,B10FE,A00FE,A00FE, ROOFE, 0000, 20000 I Wk ehkkkhREREIAARey ' * FORME 3 : PARLER * i g g gk e AR AR N A DATA 8,8,1,0,1 DATA SFEOO,8FÉ3E,&FEZF AFE7F,SFE7F,8FF7F,KFF7F,8FE7F DATA &FE7F,4FE3E,8F8E0 &FFOD, 4FE00, ÉFEOO,&FE00,&FE00 DATA &0000,&0000,83C3E, 82424 87C3E 87E22,&7E3E 87012 DATA &7C3E,&7000,87000,&7000,&7C00,&7C00,57C00, 80000 i w*#*1*¥r*#*##t¥t ' * FORME 4 : MANGER * | XT RARREREREEEARHRTE DATA 8,5,1,0,1 DATA RFEOO,8FE00 8FE00.8FE00, ÉFE0O,&FFO0,&FF0U, &FEOO DATA BFEOO,AFAFE,&FBFE,&F8FE, &FAFE, RFEOO,&FEOO,8FE00 DATA R0000,40000,83C00, 82100 87000 A7E00,87E0U,8/C00 DATA 27000,87000,87070,4707C,87000 87000, &7C00, 80000 | #flt*ttt*h*: | = FORME & : BOIRE * 1 E en rr e d de 0R e R r dc d e d DATA 8,8,1,0,1 H DATA &FEflfl,flFE?H.&FE?B,&FE?E.&FE?H,&FF?E,&FF?E,&FE?& DATA &FE30,&FECO,&F820,8&FFF5FF1,0AF,FERFF BBFDFT7E DATA EDUHD,&DGEG,&HEEH,&E43fl.&?EHD,ETEDD.&?Fflfl.fiFEflD DATA 27C00,47000,88707000 8070002,, &87F/FE,0 8000000 | e e o o AR A A e W AR “* —FORME & : FRAFPER ? I RRÉRRÉÉ RRN E IERE DATA 8,5,1,0, 1 DATA äüüüü,5ü1Eü.älFEE,&lFFE,&lFFE.&lFFE,a?FFE,aîFFB DATA S7FFC,87FFE,87FFE,83FFE,83FF8, 63DF0, 830F0 80000 DATA 60000,60000,20180,40084 80FFS, BOFFO, &1FFO, &3FFC DATA 23FF0,A3FF8,23FFC,A1FFO,R18E0,81060,80000, 80000 | ME AAMARRET TR RRER ÉÉ S RR A RR ! * FORME 7 : OEIL (PDUR EXAMEN) * | t:ti*tttfi#t:tiktt##tt* DATA B,8,1,0,1 | DATA &FEQ,RIFFD,R3FFB,&7FFC,AFFFE,&FFFF, BFFFF, &FFEF DATA RFFFE,&7FFC,R3FFE, &1FFO,E7CO, B0, &0, &D DATA Efl,EFEfl.EIDID,EE?CE.&EFFfl,&EAEH,EDEEE.&HE?E DATA BAFE4 &P7CR,R1830,57C0,50,80,40,40 PR e o W Ty CR E e e e e R e E E E ! — FORME 8 : DEMI-TOUR * Î fifltti*kitittt*#fl#*# DATA 8,6;1,0;1 4 DATA 2000080000 &3FFF,83FFF,63FFF,A3FFF,63FFF,63FFF DATA R3F3F,A3F3E, L7FBF, &FFFF,A7FBF,83F3F B1E3F, 60CIF DÂTA &0000.60000,0000 61FFE,B1FFÉ,81FFE,R1FFE,B1E1E DATA R1E1E R1E1E,8161E,67F9E,A3F1E,R1E1E,80C1F,R0000 DATA —l _——-—'—-—”_ qh dh kR e d d d e R RE É A IERE É NN | € TEXTES DES DIVERS MESSAGES 7 i æ + | AR RRER A RR A RR E LRk méssades: i | mewaahhrdrdxEER Ak A NN RE * * MESSAGE 1 : LES POTENCES * 1 tt##i#ifliÿ#::fl%ü#k:r DATA Les potences sont un triste souvenir de l'époque de DATA-HELGIR LE BON. Elles rappellent aux étrangers que la , DATA justice de la cité est rapide et efficace. DATA = i www*wwttxt*fiwwwtttr*t*##fl#ttt*#kfltflt ' % MESSAGE 2 : LES TONNEAUX DE VINS 7* | w*t#ttrf*t##tttââ*kwtht#iäiût*t OATA Un marchand de verroterié tente de convaiîncre une DATA jeune femme qu'elle sera plus séduisante avec un DATA collier de peries de verre. Elle ne semble pas DATA trés convaincue. DATA * [ T OE E PE A S d E A A U E R E É R A E E ! % MESSAGE 3 : ARMURIER * | AAEÉÉÉÉ AN ol o ok e REN RRF OATA Un armurier propose diverses armes. Son stock est ATARI MAGAZIME BEST OF GFA BASIC DATA MARCHEL.BIN _ BATA Voici le célèbre marché des 5 peupliers. Cet endroit DATA est trés ancien. La cdité à été construite à coté des DÂTA en place publique. Il est assez content de la vie DATA qu'il a mené jusqu'ici. Il s 'inquiête un peu pour DATA l'avenir. DATA impressionnant. Il propose un lot de couteaux de DATA lancer pour un prix trés raisonnablé. DATA bourreau ot ses aides ont le droit d'entrer ici (et DATA les prisonniers). DATA * DATA * D S Ty s ol e B L R T o B o T et e ko T T e e e ! # MESSAGE 4 : VENDEUR DE BEIGNETS * | AR EEEA EN N RR stttk E R DATA Un vendeur de beignets propose sa marchandise, C'est DATA appétissant, mais un peu gras. DATA * r [ + *;fl—*-fil*'fil ds e r e e r e e e e d r d E E PE ! * MESSAGE 5 : VENDEUR D'HABITS * 1 VWTURTEETTATHARERÉEETE TR ETE RR LANE DATA Un jeuné marchand à l'air aggressif vend de vieux DATA habits au prix du neuf. DATA = L T T T o B 1 1 S e e R R RE e e RE E * * MESSAGE 6 : VENQEUR DE CHEVAUX * 1 e e B S E e e AR e r u e E E R E DATA C'est l'endroit idéal pour acheter un cheval. Vous DATA pouvez y trouver aussi bien un cheval de trait, DATA qu'un destrier. IL y à même des ânes (cela peut DATA toujours être utile). DATA * I RV e i o ok e e e i g g o ok e ol o TT e e 'k MESSAGE 7 : EXAMEN MILICIEN *

DATA Le chef des miliciens est un sergent d'une DATA quarantaine d'années, Il est trés bien arme DATA et semble compétent. Son aspect guerrier est DATA contrebalancé par la poupée de chiffons qu'il DATA fabrique pour sa fille. : DATA * I r RE R E d éc d ce ckc rrérércird e dE de f EEN EEEE ! * MESSAGE & : JOUER AUX DES * I d e E E R E E TS A RE d E e R ATk e DATA L'un des joueurs de dés gagne gros. Les autrés le DATA regardent avec une lueur de suspicion dans le DATA regard. DATA * i L I B B B T BT T T g i e e e e TRIN ETE ' % MESSAGE 9 : FIN DE L'ESPACE DE JEU *

DATA La ville s'étend encore plus loin dans cette DATA direction. Vous ne pouvez pas aller plus loin (pour DATA l'instant). DATA #

! * MESSAGE 10 : SALLE DE TORTURE * l ÉF TV A YRR EN TERRREST s oA E RL DATA Vous ne pouvez ouvrir cette porte. Le Milicien vous DATA dit qu'elle mêne & là salle de torture. Seul le ETE O N L TR RE S E E O E e S L #% INDICATEUR DE FIN DE MESSAGES * E cf d é e d e E E E E E E A T A C C e d E R E DATA *FIN i i LFNNAE * # LES TEXTES DES DIALOGUES ” l ETE REREEEEAENNNNEREREEATEFX dialoques: s e E RR R R e e e R RR RR E ! * DIALOGUE 1 : HOMME EN ARME = E E E E E e d rrr d de T E N DATA Vous parlez avec l'hômme en armes. C'esl un pretre DATA d'un ordre querrier. Tl vous raconte les exploits DATA qu'il à vécu avec ses amis aventuriers. [I est tres DATA fier de son bras en métal qui doit étre une arme DATA redoutable. DATA * I T & btkR RNi e e * * DIALOGUE 2 : MENDIANT # I NNENTE FE b DATA Vous parlez pendant Un moment avec le vieux DATA mendiant qui se trouve là. Il est heureux car DATA i1 a assez de pièces pour se payer du pain blanc. DATA C'est un jour faste. Les dieux ont êt& bon avec DATA lui. DATA * 1 d d e e e R A e e e é é d e d d e * DIALOGUE 3 : GARDE PRISON *

DATA Le garde vous raconte qu'il monte la garde touie DATA la journée. 11 est remplacé par deux colléques DATA pendant la nuit. Il aime ce poste, car c'est DATA assez calme. 11 plaint ses camarades qui doivent DATA affronter les émeutes de la rue, DATA # ——

DATA Le prisonnier vous explique qu‘il à été condamne DATA à 3 jours de prison pour avoir volé et tuë la DATA belle—mére du chef des Miliciens. DATA *

! # DIALOGUE 5 : PRISONNIER 2 7

DATA Ce prisonnier attend d'être jugé pour pillage DATA de tombe, mais i1 sait déja qu'il sera Écartelé ATARI MAGAZINE m BEST OF GRA BASIC DATA * Y T TR T R T REN R d RR ' * FIN DES DIALOGUES *

DATA *FIN DIALOGUES

[T T E E T F PR T E E RO E dN E E S 1* 4 Ÿ ! * DEFINITION DES LTEUX * VR #* 1 RRh leéux: ' DATA Mom image ' DATA texte descriptif du lieu DATA px,py,tx,ty,souris,action,paramêtre, ! REM ' DATA -1 # DATA *FIN —I'-——'—' - | d d e d d d e R R RN A ARk bRk “* LLEU-1': -LA PORTE DE LA CITEE * | kA RA AR AR AR AANA R R R AN bk RIR DATA VILLE.BIN : DATA Vous voici devant Ja porte de la Cité de Randhal ou DATA se trouve l'Epée Runique (d'aprés la légende) . C'est DATA un endroit ol se cotoient toutés les races et toutes DATA Tes cultures. DATA * DATA 15,48,60,40,2,1,2, DATA 86,38,60,60,1,7,9, DATA 156,48,60,40,1,1,3, DATA 226,38,8,60,7,7.1, DATA 244,48,60,40,2,1,5, DATA —I I f— ENTRER DANS TAVERME MESSAGE DE FIN DU MONDE ALLER VERS MARCHE EXAMEN DES POTENCES ALLER VERS POSTE DE GARDE i tt*i!##itt*?*tT * LIEU 2 - TAVERNE DE LA LICORNE BLEU * ! #*it:OEwwwitiHit*tti:iü*fitt#*#htt* DATA TAVERNE.GIN DATA Vous êtes dans la Taverne de La Licorné Bleu. DATA C'est un endroit célebre sur les 12 mers et les DATA & océans. Quelques marchands jouent au dés dans DATA un coin de la salle. Un homme en armes est assis DÂTA à une petite table. DATA * DATA 38,53,20,30,2,1,1, DATA 90,78,80,20,7,7.8, DATA 202.,78,80,20,3,3,1, | SORTIR DE-LA TAVERNE | MESSAGE JOUER AUX DES_ | PARLER (HOMME EN ARMES) DATA 90,38,60,25,5,5,1, ! BDIRE DATA 202,38,60,25,4,4,1, | MANGER DATA =1 EERÉÉRRAAEAARER N A E * LIEU-3 : MARCHE T * hh R ce o T e ok e r d d e e e ol ATAR| MAGAZIME DATA entrepôts des premiers marchands. On peut y ;rQUVEr DATA à peu prés n'importe quoi (â condition d'avoir DATA heaucoup de piêces d'or). DATA = DATA 20,93,280,10,8,1,1, ! DEMI-TOUR VERS DEBUT VILLE DATA 22,33,67,50,3,3,2, ! PARLER AU MENDIANT DATA 100,33,42,50,1,1,4, ! ALLER VERS MARCHE € DATA 156.33,82,50,7.7,2, ! MESSAGE POUR ACHAT (CAMELOTE DATA 256.33,42,50,7,7,6, ! VENDEUR DE CHEVAUX DATA -1 P — i t##tttt#??tt* ( «” [1EU 4 - MARCHE 2 * oAk ke R R R E RR RIUE DATA MARCHEZ .BIN | DATA Vous vous trouvez devant d'autres Doutigues. MATA * DATA 20.91,780,15,8,1,3, 1 DEMI-TOUR VERS MARCHE 1 DATA 53,33.40,50,7,7,3, ! MESSAGE ARMURIER DATA 140,33,90,50,7,7,4, ! MESSAGE VENDEUR DE BEIGNET DATA 797,33,10,50,7,7,5, ! MESSAGE VENDEUR D'HABITS DATA —1 HRFN E E d d E E * LIEU 5 : POSTE DE GARDE * AR AR EEEERAVAE LA AW AT A ELR DATA GARDE.BIK , DATA Vous entrez d'un pas décidé dans le poste d garde DATA de 1a Cité. Quelques miliciens s'occupent en DATA discutant de leurs exploits militaires. La porte DATA de la prison est ouverté. GATA # DATA 53,33,40,50,7, F 315 | EXAMINER CHEF MILICIEN DATA 140,33,40,50,2,1,1, ! SORTIR DU POSTE DE GARDE DATA 727,33,40,50,2,1,6, I ALLER VERS LA PRISON DATA =1 - | kEkEEANRAAEEEERR AR AT AR < * LIEU 5 - LA PRISON * L A d d dc d RE DATA PRISON.BIN DATA Vous êtes dans la prison. C'est un endroit lugubre. DATA Un Milicien surveille deux prisonniérs. DATA * DATA 34,74,40,30,2,1,5, DATA 39,34,42,30,3,3,35 DATA 104,34,42,50,3,3,4, DATA 174,34,42,50,3,3455 DATA 244,34,42,50,2,/,10, DATA —I —— E E ! ALLER POSTE DE -GARDE ! PARLER MILICIEN | PARLER PRISONNIER 1 ! PARLER PRISONNIER Z ! SALLE DE TORTURE PR TR LU M e A e RR A I e+ B É AN e e * INDICATEUR DE FIN DE DOMMEES * *kw#:rt*##itt##*tt*i#* DATA “FIN BEST OF GFA BASIC GRAPHISME EN GFA BASIC f:'lL-l- D E | B .r. —— e UE Quelques généralités Les souris mesurent 16 pixels de haut sur 16 pixels de large. Elles ne peuvent être définies qu'en deux couleurs. Le même dessin peut être

320×200 en 16 couleurs, movenne résolution 640x2C0 en 4 cou-

Il moniteur monochrome). 11 est regrertable que les concepteurs du ST n'aient pas prévu de souris adaptées aux différentes resolutions, ce qui aurait permis la créacion de souris 16 couleurs en basse résolu-

fins les programmeurs écrivent entiérement leurs propres routines. @ / d'E =< f TR 8 @ s Ok £ 98 # L

Dessin des souris

. formés en données numériques grice à un petit programme de con- ‘ i version écrit en Basic GE4. On trouve souvent des éditeurs de souris

' |'_ phistes professionnels n'utilisent jamais ces utilitaires. Tous les des- ‘ ! sing des logiciels commerciaux (animations, lormes des souris, pc lices de caractères, pages de présentation, ete.) sont faits avec des logi- ‘:: ciels graphiques classiques, puis récupérés à l'aide de petits pro- N erammes astucieux,

L IBLIOTHEQUE {MES DE SOURIS Donnez du cachet à vos programmes 'l Cette bibliothèque offre 40 nouvelles formes de souris à utiliser à

propres programmes pour leur donner un air plus sympathique. Structure d'une souris Une souris se compose d'une lorme, d'un masque-de cransparence et de deux valeurs de décalage pour les clics «x et y+, La lorme est le dessin de la souris. T peut ¥ avoir 2°256 formes différentes, soit 1,16x 10“77 souris différentes! Le masque est un autre dessin indiquant au système les points de la souris qui doivent être affichés à l'écran, ot ceux dé la souris qui ne doivent pas l'être (c'est-à-dire les points où apparaissent lé fond), Il ne faut pas confondre la souris système avec le dessin qui se déplace sur l‘écran. Ce dessin visualise la position de la souris, mais ce n'est pas un point, alors que la souris, clle, ne sé trouve qu’à un seul endrout de l'écran. Lorsque l’utilisateur presse sur un bouron de sa souris, le syswme détecte le clic et fournit une position (x,y) de Pécran. Cette position est considérée par défautr comme la position du point haut gauche du dessin de la souris. Les valeurs de décalage x et y permettent de déplacer le ventable «point de clics par rapport à ce point de clic théorique En fixant la valeur de décalage en x À 2, le point de clic fourni par le système sera décalé de deux pixels vers la droite. En prenant de bonnes valeurs de décalaue, on peur s amuser à définir une nouvelle souris dont le clic ne se ferait P]LLE sur la ]:H:!il'ltt'.' de la flèche mais sur l'autre côté de la souris (certains virus vrlisent ce genre d'etiec), Programmation en GFA Basic l'instruction Defmouse (page 176 du manuel GFA Basic 3.0) permet de redéfinir la forme de la souris, Les données sont mémorisées dans des lignes de DATA sous forme de chiffres hexadécimaux. Cela permer d'avoir dés inflormations faciles à lire et à Eaper {ËIFFËÜ Tt tient plus facilement que 65456 en décimal ou 1111111110110000 en binaïre): Les données mémoriséés dans les lignes de DATA sont stochées dans un tableau alphanumérique. La fin des informations est indiquée par la valeur <1 de la dermière , ligne de DATA Ce système autorise l’ajout de nouvelles souris sans probléme,

-_ I AR R PR E E E E E E ETE E E ETE E A e E E E E R RR RS I & ! # BIBLIOTHEQUE DE FORMES DE -SOURIS * E % + [ L 0 TR e o e e e d d d E R AIF

' {c) 1989 ATARI MAGAZINE & Patrick Leclercq * Machine : ATARI 31 * Langage : BASIC GFA 3.03 ' Machine de developpement et de test : ATARI 1040 STF HESERVE 50000 | RESERVATION MEMOIRE POUR BASIC DIM forme mouse%(50)1 TABLEAU DE FORMES DE SOURIS nb mouses=0 | ME SOURIS DE TABLEAU forme moused - L @lec mouse ! LECTURE DES DEFINITION DE SOURTS fdemo_mouse ! DEMONSTRATION END

! = LECTURE DES FORMES DE SOURIS STOCKES EN DATA * [T 1Y S e A RR RN R A A o R R ke R b E PROCEDURE lec_mouse LOCAL v%.mb Do READ v= EXIT IF wis=]1 INC nb_mouse* ! UME NOUVELLE SOURIS mé=MKT$ (v5) | DEBUT DES DONNEES SOURIS I

! LECTURE DATA ! TEST 51 FIN DE DONNEES FOR i%=1 TO 36 ! DEBUT BOUCLE LECTURE DONNEES RFAD w5 1 LECTURE DATA SOURIS mé=m{+MK1${vé) 1 STOCKAGE DES DORNEES SOURTS NEXT 1% ! FIN. BOUCLE LECTURE DONNÉES forme mouse${nb mouse%)=m§ ! STOCKAGE SOURIS LOOP RETURN Y Y P S S T OE TT R S e e e e E I E e A d d d d E R ! # DEMONSTRATION DES FORMES DE SOURIS =

PROCEDURE demo mousé LOCAL 1% FOR i%=1 TO nb mouses | DEBUT BOUCLE DEMO DEFMOUSE forme mouse$(i=}! AFFICHAGE SOURIS NUMERO ! VARIABLE LOCAL i% 1 ATTENTE D'UN CLIC SOURIS ! FIN GOUCLE DEMD Battclic NEXT 1% RETUREN —_—_ DRh ke Atttk E E * ATTENTE D'UN CLIC SOURIS * i e a1 N R e e wEEEK PROCEDURE attclic REPEAT ! ATTENTE D'UN CLIC SOURIS UNTIL MOUSEK REPEAT I ATTENTE FIN DU CLIC SOURLS UNTIL MDUSER=0 RETURN p

* BIBLIOTHEQUE DE FORMES * RRN RE RR RR RE RE S FORMAT DE DEFINITION : DATA Position x du point de clic par rapport ; au cote haut gauche de la souris DATA Position y du point de clic par rapport au coté haut gauche de la souris DATA mode d'affichage (1 =SPRITE NORMAL , —] =MODE XOR)- ; DATA Couleur du masque DATA Couleur de la souris DATA 16 entiers 16 bits pour le codage du masque DATA 16 entiers 16 bits pour le codage de la forme — REMARQUE : Les souris sont toujours définis en ? couleurs, mais cela peut être n'importe quelles couleurs de la palette utilisé par le système ' (rouge et vert par exemple). Il n'y à qu'en haute résolution (640<400 sur écran monochrome) qu'uné souris est toujours noir et blanc. mantre: DATA 7,7,1,0,1 DATA fiïFH,âFFE.&FFB,älFFE,EEFFE,&îFFE.äFFFE,âFFFE DATA äFFFE,ä?FFE.ë3FFE,SLFFE.ëFFE,EFFË.äFFË,ETFE DATA &3FÜ,ËEÎÛ,&?FÜ.&E?H,älllfi.äÈËEE,HÆïÜfl,äEEFfl DATA E#lü#.äfiflêû,&111Ë.EE?E,ä?Ffl,äEFÜ,ÈEED_äÈFÜ cOeur: DATA 7.7,1,0,1 DATA ä1E1E,äEFFE,&?FFF,&FFFF.EFFFF,äFFFF,äFFFFùäFFFF DATA STFFF.ä?FFF,äËFFE,&1FFE.&FFE.&?FÜ,ËHEÜ.ËlEÜ DATA âü,ältlt,äïf?E,Efi?EF.&#FÙF,ÈQFDF,34FFF.&fiFFF DATA äË?FE,äB?FE,ñIEFE,ËÜFE,ËfiFü,äËEÜ,ÈIEÜ,EEÜ point interrogatiôn: DATA 7,7,1,0;1 DATA E?FH,&FFfJEIFFE,EHFFF,EEFEF,EEFEF,&IE?F,&FE DÂTA E]FE,EEFË,ËEFÜ,&EFU,äfiFü,âïFü,&ËFü,&ïFfl DATA älEÜ,EÏFË+&ËFE.&tÎ3E,älElE,âlElE,äHE,EEE ÂTAR| MAGAZIME BEST OF GFA BASIC DATA &BS.2170,%160,&1E0,50,51E0,4160,81E0 larmes: DATA 7,7,1,0,1 DATA &3C00,R7EQD,&FFOO0, EFFOO0,AFF90, &FFBS, AFFBS,EFFTC DATA &7EFE,&3CFE,&39FF,&70FF, 8FFFF ,&FEFE,AFETC,A7C38 DATA E1800,42400,54200, 45200,858500,88510,885910, 84228 DATA &3C44, 844, E10BA,&288A,86092 54444 R6C38, 63800 peil: DATA 7,7,1,0,1 DATA BAFEQ,R1FFO,R3FFB,R7FFC,AFFFE, RFFFF ,&FFFF, &FFFF DATA &FFFE,&7FFC,&3FFB,RIFFO,RTCO, &0, 50,40 DATA &0,&FE0,&1010,427C8,A5FF4,4BABA, RDEBG, 80072 DATA R4FE4,&27CH,&1830,A7C0, &0, 50,480, A0 dragon: DATA - 7,7,1,0,1 DATA &1C3C,R3CIE,&7F7F ,RFFFF, &FFFF,&FFFF &FFFF,&FFFF DATA &33FF,8F0F B1F9F, RI3F1F,43E7F,A3FFF,83FFF ,A1FDA DATA E818,8181C,&3E3E,&7F3E,4FFFF,BFBFF, B93FF 831EF DATA RICF,R38F,&FOF,&1EOB,R1C0B,81C72 , K1EDA, LFBS blason: DATA 7,7,1,0,1l DATA AFFFF, &FFFF,EFFFF,&FFFF,&FFFF,RFFFF ,&FFFF,&FFFF DATA BFFFF,&@FFFF,&FFFF,87FFE,67FFE,63FFC,&1FF8,6FFÜ DATA RFFFF,EBAFF,&C5FF, B8AFF ACSFF,SSAFF,&DF55, REFAB DATA &5F56,L6FAA,&7756,826FC,831FC, B1AF8,60F0, &3C0 epee: DATA 7,/,1,0,1 DATA RF,B1F,63F,67F, 8FE,861FC,&F3F8,&F7F0 DATA AEFEO,AFFCO,&FF80,87F00 &FECO,&FFEO,&FFEO,&F7C0 DATA &7,89,811,022 644688 66110,8E220 DATA RCA40, 4ER80,87100,43A00, 46C00,8DECO , &F7C0,46380 bouclier: DATA 7,7,1,0,1 DATA R1FFE,R3IFFC,E7FFE,RFFFF,&FFFF ,&FFFF,&FFFF,&FFFF DATA BFFFF,&FFFF,RFFFF,&FFFF,&7FFE,&3FFC, B1FFE,&7ED DATA &7EQ,&18F8,833A4,55F82, 84702 ,88661,88F0Y 89F0H DATA &BEOY,RBEQF,RAFAE A4F9E,&2FAC,&61FEF8,A7E0,40 fleche gauche pleine; DATA 1, X, 1, 051 DATA &180,8380,&760,8F80,81FFF,E3FFF,&7FFF,&FFFF DATA LFFFF, &7FFF,&3FFF, &1FFF,AFB0, 5780, 5380, 8180 DATA RO,&100,&300,&700,4F00, 81FFE,83FFE,87FFE DATA R7FFE,&3FFE,RIFFE,&FOD, &700,8300,&100, &0 fleche gauche vide: DATA 1, 1, 1, 0, 1 DATA E0,8300, 2780 8F80,81FFFR3FFF,R9FFF,4FFFF DATA AFFFF,R7FFF,R3FFF,R1FFF,RF60,8780, 5300 , 40 DATA &O,&D,&300,8500,%900,&11FE, 82002, 24002 DATA 24007 ,&2002,411FE, &900, &500,&300, &0, 80 fleche gauche relief: DATA ']: sÉ i) Es DATA &0,&300,8780,&FA0,&1FFC,83FFE,67FFF,8FFFF DATA &FFFF,&FFFF,&7R1FFCFF F@F,CAO,36/FC0D, BF3,0 DATA £0,80,&300,&500,890052,0&061,1 6F4C00,6 DATA 24006 86006 831FE&,DE01,&7980,F &3E80,, 50 flgeauchce hahut veide: DATA }, 414 614 D, 1 DATA AFFF8,8FFF8,4FFF8 &FFF0,6FFEO,&FFEO 6FFFO6FFFH DÂTA &FFFC,BFFFE AFFFF,RF3FFORE1FE,AFC,A78, 230 DATA R0,87FF0,44010,24070,84040 64040 88020, 84010 DATA A4008, A4C04 85707 86102, 664 848, 530, & fleche qauche haut pleine: DATR 14 sl -0y DATA &FFFS,&FFF8,&FFFS,&FFF8,8FFFD, KFFED, &FFFO,&BFFFS DATA &FFFC,&FFFE,&FFFF,&FBFF,&FIFE, &FC &7 6, &30 DATA &0, &7FF0,ETFFD,RTFED, R7FCO,&TFCO, &TFED, &TFFOD DATA &7FF8,R7FFC,673FE,661FE,8FC &7, 630, 60 fleche haut vidé: BATA 1E 1 D- 1 DATA R1B0,E3CO,&7EQ,&FFO,&1FF8,A3FFC, EJFFE &TFE DATA B3FFC,&FFD,AFFD,&FFO,&FFO,&FFD, &FFO,&FFD DATA BO,&1E0,%240,8420, 8810, %1008, 52004, &3C3C DATA R420,8470,5420, 8420, 8420,8420,87E0, &0 fleche haut pleine: DATA Ty }, L, 0,, 1 DATA &160,R3C0 A7E0,6FF0,B1FF8,63FFCR7FFE,8FFFF DATA &FFFF,&FFO,8FFO,RFFO,&FFO,&FFÜ,&FF0,8FF0 DATA &0,5180 4300 87E0,&FFO,R1FFB,B3FFC,87FFE DATA &7E0 8720 67E0,67E0,67FE0,87E0,87E0,60 fleche haut relief: DATA-L, 1, 1, 0, 1 DATA &180,%3E0,E7F0, &FFB, R1FFC,&3FFE,&7FFF, &7FFF DATA &7FFF,&FFF,BFFB,&FFE, BFFB, &FF8, RTFE, 83FE DATA &0,%180,%260,8430,8818,&10G0C, 82006, &3C3E DATA 847E,4430,8430,8430,4430,&7F0,83F0,80 fleche bas vide: 17,1 30 1.1 1051 DATA &FF0,&FFO,&FFO,AFFO, &FFO, BFFO &FFO, &TFFL DATA &7FFE,&7FFE,&7FFC,E21FFB,AFFO,RTEQ, &3C0,H150 DATA &0, L7EQ,R420,8420,5420,8420, 8820 ,8420) DATA &3C3C,A2004,51008,5810,5420,5240,4180, k0 fleche bas pleine: T LU TT | DATA AFFO,RFFO,&FFD,&FF0, &FFO,8FFO 6FFO,8FFFF DATA EFFFF,&7FFE,&3FFC,B1FFE,&FFO,E7ED, 300, 6180 DATA RO,&7EQ,B7E0,R7EQ,&7ED,&7EC, &7ED,&TVED DATA &7FFE,R3FFC,R1FF6,6FF0,87E0,8300,8180, 80 ATARI MAGAFIME BEST OF GFA BASIC souris st: DATA-1,-1, 15 O, 1 DATA £C000 &E000, EF000,8F500,4FC00, &FE00,&FFO0,4FF80 DATA &FFCO,AFFRO,RFEOO,REF00,&CF00,8780, 2780 8380 DATA &0,84000,&6000,27000 87800, &7C00,87E00,&7F00 DATA &7F80,&7000, 6000, 84600, 4600 ,5300, &300, 60 Farme bizarre: DATR 450 1 UP3 DÂTA REQ38,LFIBC,RFFFE,&FFFF, &7FFF A3FFF &1FFF, &27FF DATA E72FF,8F8FE,87FFC,R3FFC,61FFE,8FFF,8/FE,81E DATA R0,R6038, 67190 63FCE,63FE6,81FC0, R7EE &2FE DATA &207E,&7070,&3870,R1FFS,RFFC,&7FE,&1C, 50 loupe: DATA:1L,-1, 1,.0,-1 DATA R1FFA,&3FFC,R7FFE,&FODF,REDST 8E047 , 8E027 . 6E007 DATA REOO7 ,&FO0F,&7FFE,83FFC , K1FF8,47E0, 67 EU &/E0 DATA RO,R1FFE,&3FFC,4700E,46086, &6046, 56026, 46006 DÂTA &6006,&700E,R3FFC,61FF6,6240,8300,8240, 83C0 transistor: DATA–F, 1, 1, 0,, ! DATA RAETB,A3E3C,63E78, A3EF0,53FE0,83FC0, &7 F80,8FF00 DATA BFFOD,&7FR0,&3FDC,&3FFC, B3FFC, &3FFC,A3FFC, &3EFT DATA RO, &ICI8,&1C30,R1C60,&1CC0O,R1DB0, &1FOO,&TEDD DATA &7E00 &1F00,81D80,A1CC8, 21078 81C7B, R1CF8, 40 symbole etrange: DATA-1, 1, 1, 0; 1 DATA RFFCF,BFFCF,&FFCF,&FFFF, &FFFF, BFFFF &FFFF,AFFFF DATA RFFFF,&FFFF,&FFFF,&FFF8, &FFFE,&FFFE,&FFE, &FE0 MATA &0,R7F86,&7FB6,56186,861FE,&79FE, 47986, 86186 DATA &67FE,867FE,86630 87F30,87EFC,R6FC,&600, 60 symbolé atari: BATA 15 1, 5, B, 1 DATA ETEOQ,RFFO,AFFO,&FFD,LFFO,RIFFE, &1FF8, &3FFC DATA RIFFE,RFFFF,&FBDF,&FBDF,4F3CF,RE3C7,6C3C3,80 DATA 20,45A0,25A0,85A0 6540 &DB0,&DB0, #1DE8 DATA 83900 R790E,6718E,É718E 4661864182 &0, 60 note musique: DATA 1515 1 VS I DATA RIEO,81E0,61F8,R1FE,61FE,81FE,R1FE,B1EE DATA É1E0.61FFD,R1FEO,A7FE0,47FE0,87FC0,61F60,61F00 DATA &0,2C0,&C0,8F8,8FC,RFC,8C4,8C0 DATA &COLECO,&FCO,&FCO,&3FCO,AFO0, &FO0, &0 disquetté: DATASE, 1 14 [ | DATA AFFFF,&FFFF,&FFFF,AFFFF ,AFFFF ,BFFFF, &FFFF ,&FFFF DATA &FFFF,&FFFF,&FFFF,&FFFF RFFFF,AFFFF,&FFFF AFFFF DATA &0,&7FFE,R7FFE,LB00G, 66FE6,66006, éBAFÉ, 6006 DATS &7FFE,&7FFE,R7FO3E,&7T7BE, &7 7BE &703E,A7FFE &0 ordinateur: PATATL ts 0 14 DATA REEEF,&FFFF,&FFFF,AFFFF, &FFFF,&FFFF,&FFFF,&FFFF DATA &FFFF,&FFFF,&FFFF,AFFFF, AFFFF,AFFFF, &FFFF,LFFFF DATA &0.27FFE.44002;85217 A5A3M, &5ETA, REEFA, 24002 DATA &7FFE,&240,57FFE,R4002,85554, 54002, B7FFE, &0 document : DATA: , 19 15051 DATA R7FFERIFFE,AIFFE,RIFFE , S7FFE,87FFE,R7FFE,87FFE DATA &7FFE,&7FFE,&TFFE,&7FFE &7FFE, &7 FFE ATFFE, &0 DATA &0,&3FFC,82004,42004,82004, 62F04, 42004, &2BF4 DATA &2004, R7FFS, 2004 AZAES 582004 BIFFC &0, 50 parsonnage: DATAS1 il o 1 DATA RFFO,RIFFC,S3FFER3FFE,A3FFE &3FFE, R3FFE,&3FFE | DATA E3FFFRLFFCAIFFC,RFFC,R7FF8,67FF8,87FFO,87FE0 DATA E7FO,AFFR,B1FEC,61804 8180481004 &1E3C,&1/584 DATA R1104 ABPR,ADDE,&678,4700,82E10,839E0, 83800 tombe: DATA: T, L1, 1, U, L DATA ÉTEOEFFO,AFF8,83FFÉ,67FFE,67FFF,67FFFÇ,A7FFF DATA &7FFF,&3FFF,AFFF, &FFS, LFFS,LFFR, EFFE,&3F0 DATA fifl;&?Efl,&¢3fl.&43U+33E3E,EEDDE,EEEEE,EEDUE DATA £3C3E,843E,8430,8430,8430,A7F0,83F0,80 dollard: DATA 114 S ) | DATA A180 67F0,8FFE,RFF8,81FF0 , RIFFO,61FCO,81FED DATA RIFFO,AFFS,A7FO,EFF8,61FF8,81FF8,RI1FFO,FCD DATA R0,R180,&7F0,67F0,8FF0,8E00, &EOÛ,&FCU DATA &FCO,&7F0,670,670 6FFO,EFFO,&FCO 8180 livre: DATA 1, 1, 1,-0,; 1 DATA S1E0,R3F0,6/F0,&FE0,&F00,4F00 , &F00,&F00 DATA ËEFFÜ,ÊHÎFD,EËFFÜ,ËFÜÜ,ÈFFH,ÈËFFË.&ËFFE,ËÈFFË DATA A0,61F0,43E0,6700,8600,&6500,A600, B60Û DATA Z600.&1FEQ, &600, 600, 6600 &FFO,&1FF0,80 alpha: B[00 v B 4514 U, | DATA 40,80 ,8F30,@1FF8,43FFB83FF0,83FC0,R3FC0 DATA ËËFEÜ.ËEFFÜ,&EFFE,&3FFÈ.ËIFËË,ËEÜÜ,ËÙ.EÜ DATA &0, R0,&0,8F30,81F70,819C0,419C0, 1080 DATA R1080,&19C0,&1E70,R1F70,&E30,40,40,50 beta: DATA F, -1, 1, O, 1 DATA L1EDD,&7E00,&FFCO,EFFCO, AFFCO,&FFCO,RFFCO, AFFCO OATA &FECD,EFFCO,RFFCO, RFFCO,&FFCO, &FFOD,&FFO0, &FS00 JATA &0.&C00,A3E00,47380, 47380, 87380, 87380, A7E00 DATA &7380,47380,57380,27380,A7F00,A7600, 87000, 54000 oméga: Db 1E 14 US 1 ATAR| MAGAZINE m BEST OF GFA BASIC DATA RFOD,&3FS0,L7FCO,&FFEQ, KFFED,&FFED, KFFEQ,&FFED DATA B7ECO,E7FCO,&7FCO,AFFED,AFFEQ,EFFED, &7FCO, &3FET DATA &0,&F00,&3B80,470C0,57000, 87000, 47000 87000 DATA R3880,43680,4E00,84540 47BC0,R78C0,&3660, 60 pi: DATA 1,1,1,0,1 DATA RÉCSFRIFFFS3FFF A7FFF,8FFFE,&FFFC,&FFFB DATA SFFFO,R6FFO,&FFO,&FF0,&FFO,&FF0,8FF0,87F0 DATA 60,46,66,81FFE,61FFE,47FF8,87FF8, 86660 DATA 46660.4660.8660,8660,6660,8660,&660, &0 symbole gfa: DATA 1,1,1,0,1l DATA AFFFF,RFFFF,&FTFF,EFFFF,&FFFF ,&FFFF,&FFFF,&FFFF DATA - &FFFF,&FFFF,&FFFF,&FFFF,&FFFF,&FFFF, &FFFF , &FFFF DATA RO,&3E,&3F3E,&7FB0,&7FBC,&73BC. 87380, AT030 DATA &7780,%779C,%73BE.&7FRA,&7FBE,&3F3E, &36, 40 symbole personnel auteur: DATA 1,1,1,0,1 DATA &FFFF,AFFFF,&FFFF, AFFFF,RFFFF,&FFFF, &FFFF, BFFFF DATA AFFFF,&FFFF,&FFFF,&FFFF,&FFFF,&FFFF,&FFFF,&FFFF DATA RO, R70FE,&70FE, &70EE,%70EE, E70EE B/EE, &7OFE DATA K70FE,870FE,&70E0,470E0,47EE0,87EE0, &7EEC, &0 symbole chaotique: DATA . 1,1,1,0,1 DATA &FFFF,RFFFF,&FFFF,&FFFF,&FFFF ,&FFFF,RFFFF,&FFFF DATA AFFFF,&FFFF,&FFFF,&FFFF,&FFFBFF,FF&FF, F&FFFFF,F DATA &0,&718E,&73CE,5799E,L1D82800,4A,D 8B7E0T,E DATA &7E7&DE0E 810,88, 487997, &730CE ,&0718E4, 80 DATA —l

L W & ! = GENERATION DE FICHIERS CODE POUR FORME DE SOURIS * L — —

” © 1989 Patrick Leclercq & ATARI MAGAZINE

' # Cet utilitaire génére un fichier .LST de codage de * ! = souris à partir d‘une image DEGAS ELITE contenant * “ #* les formes et les masgues des souris. Les positions” * % des données graphiques sont mémorisés dans des * ! * lignes de DATA en Tin de programme. 2 1 dh R R d d d d d R RR RE ! * La forme de souris ét le masque doivent être 5 * dessinés avec des points de couleur 1 sur un fond * ! * de couleur Ü. Le programme dé conversion fonctionne* * * dans les 3 modes graphigues de l'ATARI. % 1 TV R PP e é gt e e e T S e R S d e = e e d e e e A RESERVE 50000 | RESERVATION DE MEMOIRE POUR LE BASIC ATARI MAGAZINE BEST OF GhA BASIC @codage | APPEL ROUTINE PRINCIPALE END ! FIN DU PROGRAMME ] I

! * CHARGEMENT D'UNE IMAGE DEGAS SUR L'ECRAN * E E E E E E E AN E E E E R A R e E E ttttïr*gigii*tigEAttw*#fiflùtttw#ttttt*iùkwwùtt * * Format image DEGAS: % ' * — 34 octets contenant la résolution ï ! * et la païette de couleur: ! * — 12000 octets contenant l'image ¥ d e d d TR e e e SR AR s S e TR d E e e R OR A RE “Paramêtre: nom$ contient le nom de l'image à charger” E e e e e E E E WAkt S A E RE E A E R A E A C S PROCEDURE lec degas (noms) OPEN “I” ,#1,nom5! DUVERTURE DU FICHIER EN LECTURE SEEK #1,34 | PLACER POINTEUR FICHIER AL DEBUT IMAGE BGET #1,XBIOS(2).32000 1 CHARGEMENT IMAGE DANS FCRAN CLOSE #1 ! FERMETURE DU FICHIER RETURN B T et R A ek R d d A I A GS SE RR RE ! # CODAGE LIGNE DE 16 PIXEL SOUS FORME NUMERIQUE * 1 RRRVNAAEREER s e e S e et R E A A RR R A e b

PR e RR R R A A d e e d d é R RR RE FUNCTION 1ÈE_1ÎQHË{ÜEË,FÏÊJ LOCAL %, v, 15 | DECLARATION VARIABLES LOCALS wi=() | INITIALISATLION VALEUR X¥=prE | INIT POSITION X DE TEST FOR i%=15 TO O STEP =1 ! BOUCLE DE LECTURE cE=POINT {x%, py%) ! LECTURE COULEUR FOINT (x%,V%) IF cx==0 | TEST SI COULEUR = D vi=vE#2%i% ! MISE A JOUR DE LA VALEUR NUMERIQUE ENDIF INÉ x% | INCREMENTATION POS X DE TEST NEXT i% ! FIN BOUCLE DE LECTURE | RETURN v | RENVOI DE LA VALEUR NUMERLQUE EMOFUNC VR d d d A RR e A A d A A E A A A RESRE * CONVERSION D'UNE FORME 16×16 PIXELS EN CODAGE HEXA *

L RR E e é d d d r e e ‘* Les 16 chiffres hexadécimaux représentant le codage* !* de la forme sont sont générés sous la forme de deux™ ‘* Tignes de-DATA. ; EDATA Bocex , Bcxae , Roooo, B0, oo, É , Booood Baoo * *DATA Rocxioe , B, FNx , ÉSOUEX , ÉOOCCX , B, ÉUOOUX Raxxx™ B d é e E R E R R A e e A A RN R R b RESRE RR e '* Cette procédure utilise la foncLion lec ligne qui * ‘% convertis une ligne graphique de 16 pixels en un * némbre entier. R ; . I ._-IL d e e é e d e e e e e e e e e e e e e B d SE E \* Paramêtres de là routine : c x '# pxk : position X de la Torme à convertir = '®* pyk © position Ÿ de là forme à convertir , 3 'Hflfiw*#tttt:*##fikhft#fittt+fififi \* VARIABLES LOCALES : et d i% - Indice de boucle {1 à 16) .* = vi : Position Ÿ de la ligne de pixel & convertir* [ R T SU S E V O e R ME E T ETE E E E E e r e E E E E E I E D RE E E E S R A A R QS !* REMARQUE: L“instruction HEXt(v#,4) pérmét de E ‘* convertir le nombre v& en une chaine hexadécimal de* !* 4 caractéres (par exemple, la valeur Ü donneras = '* 1a chaine “ACO00” }. 4 |*¢tti“tttg*q*tr#*tzrtifiihAAfiki*i##*#*ih*fif PROCEDURE lec forme{px%,py%) DCAL 1%,¥% ! DECLARATION VARIABLES LOCALS PRINT #2,”DATA “3 | INSTRUCTION DATA PREMIERE LIGNE yi=pyE . | INITTALISATION POS PREMIERE LIGNE FOR 1%=1 TÜ 16 1 DEBUT BOUCLE vi=Blec ligne(p=#,y4)! LECTURE LIGRE DE POSITION y% IF [i%<>8)} AND (i%<>16) PRINT #2,”R“:HEX$(v%,4):”,=; IECRITURE FICHIER ENDIF IF i%=8 | GENFRATION DE LA FIN DE LA PREMIERE LIGNE PRINT #2,“à”-HEXS(v5,4) ! DERNIERE VALEUR PRINT #2,“DATA ”; | DATA SECONDE LIGNE EMOLF IF i%=16 | GENERATION DE LA FIN LIGNE 2 PRINT #2.“&”:HEXS (v%,4) !DERNIERE VALEUR LIGNE 2 PRINT #? ENDLF INC y* | PASSAGE A LA LIGNE DE FIXEL SUIVANTE NEXT i% ! FIN BOUCLE RETURN i tt*tfi*gg*tttwfiiflttittr#ifilitttf * % ROUTINE PRINCIPALE DU PROGRAMME * 1 *p#rttttt#i*üü*fifiwwrrtttflkfi L Ah R RN A I d e e Sy e e d e e e e e e d E E E “ = WARIABLES LOCALS: * * # jmaget: Mom de |'image contenant les formes de * i SOUris, L “* nonf : Nom du fichier .LST généré par le prg , * Fs et contenant le codage BASIC des souris.” ' * px _ forme® : Position x de la forme de souris. | # py formés : Position Ÿ de lä forme de souris. * ! * px masque*: Fosition X du masgue ce la souris. ” * # py masque%: Position Ÿ du masque de la souris. -* 1 khh H e e R e d e e E E PROCEDURE codage - LOCAL îmage$,nom£,px formek,py formes LOCAL px masquet,py masques READ image} | LECTURE NOM IMAGE DEGAS ELITE Ülec degas(image$) ! CHARGEMENT DE L'IMAGE READ nom$ ! NOM DU FICHIER .LST À ECRIRE OPEM “o”,#2,nom$ ! OUVERTURE FICHIER .LST 0o READ px_formes ILECTURE PREMIERE DONNEE SOURTS EXIT IF pe formes==LITEST SI FIN DE DOMNEES READ py forme*s ILECTURE POSITION Ÿ FORME SOURTS READ px masques ! LECTURE POSITION X MASQUE SOURTS READ py masques 1 LECTURE POSITIUN Y MASQUE SOURTS ÉRINT #2,”DATA 1,1,1,0,1” ILIGNE PARAMÈTRES SOURTS ÏEE_fürmflfpï_masquüà.pï_mfläqueâ} | MASQUE SOURIS Jec forme(px_formes,py formes) 1 FORME SOURIS PRINT #2,“”“ ! LIGNE REM LOOP CLOSE #2 ! FERMETURE DU FICHIER ECRITURE RETURN ' D ook e e B e e R ek o o kAl ! * FORMAT DES DOMMEES * | VHHEN ERRSE E DATA Nom image DEGAS ELITE DATA Nom fichier .LST à générer DATA Position X forme souris 1, Pos Ÿ forme souris 1 DATA Position X masque souris 1, Pos Ÿ masque souris l DATA Position X forme souris 2, Pos Ÿ forme souris 2 DATA Position X masque souris 2, Pos Ÿ masque souris & DATA . —- ; _— DATA Position X forme souris n, Pos Y forme souris n DATA Position X masque souris n, Pos Ÿ masque souris n DATA -1 .I_'_I—_….-—_—“_”'_ [ Ao E E b S e R DR R A e E E A R E R A ! * EMEMPLE DE DONNEES DE SOURIS * p S B E E E E T e A E E E E e d e A e d d DATA SOURIS.FII DATA SOURIS.LST DATA 5, 2 DATA 5, 19 DATA. 22, 2 DATA 22, 19 DATA =1 ATARI MAGAZINE WS BEST OF GFA BASIC === LES FONCTIONS GRAPHIQUE DU STE(1) === Maitriser le STE Cet article en deux parties a été écrit afin de vous montrer comment intégrer ses possibilités graphiques du STE dans vos programmes en GFA Basic. Palette de couleurs Les couleurs des STF peuvent êtré choisies parmi une palerre de 512 couleurs tandis que celles des STE peuvent être choises parm une palette de 4096 couleurs. ' Système RVE Les couleurs sont fabriquées en mélangeant trois couleurs de bases. Ces couleurs «élémentairess sont le rouge, le vert et le bleu (d'où le nom de RVB); Chaque couleur élémentaire est divisée en un cértain nombre de niveaux de couleurs. Le premier nivean correspond au noir, et le dernier niveau correspond à une couleur Lrés lumimeuse. Le nombre de couleurs intermédialres dépend du nombre de niveaux de couleurs, Si les trois couleurs de base sont au niveau le plus faible, la couleur résultante est le noir. Far contre, si ces couleurs sont à leur niveau le plus fort, la couleur résultante est le blanc. De 512 à 4096 couleurs La palette de couleur du STF est codé sur 3 bits. Cela donne huir niveaux de couleurs (8=273). Chacune des trois couleurs élémentaires peur prendre huit teintes différentes. Ce qui représente 8x8x8 (512) couleurs possibles. La définition d'une couleur se fait avec l'instruction SETCOLOR Cerre inseruction peut être utilisée de deux manières différentes: en donnant les composantes RVB de manière individuelle, où en donnant un seul chiffre contenant le codage de la couleur. Chaque technique posséde ses avantages et scs incorvénients, SETCOLÜR c,rouge,vert,bleu SETCOLOR c,mélänge La formule permettant de calculer la valeur de la variable mélange est la suivante mélange=rouge*256+tvert“16+bleu, On obtient la couleur noire avee les trois composantes RVB à 0 (SETCOLOR ¢,0,0,0). La couleur blanche est obtenue en metrant es trois composantes RVB à leur valeur maximale (SETCOLOR G diad sl Instruction VSETCOLOR Les routines graphiques du GE4 Basic ont étés derites-en utilisane les fometions graphiques internes au ST (système graphique VDI), Ces fonctions sont pratiques et puissantes, mais elles ont un bug trés curieux: elles utilisent leur propre table de chiffres pour gérer le numéro des couleurs. La foncrion SETCOLOR utilise le vrai numéré dé couleur alors que les autres instructions du @F4 Basic (COLOR, DEFFILL ete.} utilisent |2 table de couleur spécifique au VDL Pour prendre un exemple précis, si un programme change la définiton de la couleur 1 avec SETLOLOR, c‘est la couleur 15 qui va être moditiée. SETCOLOR 1,7,0,0 L'instruction VSETCOLOR est une instruction qui corrigé le bug de couleur, Flle possède sa propre table de conversion et permet de medifier une couléur sans sé soucier des problèmes de transcodage de couleur, - VSETCOLOR 1,7,0,0 Affichage de l'ancienne palette Le programme suivant affiche successivement toutes les 512 couleurs de Ja palete STE Il utilise Pinstruction SETCOLOR pour changez les couleurs. '&&ÈOE##&OE*&#* ” PATEITTESIF * Pk S HE E el o E FOR rouge==à TO 7 FOR vert==0 TO 7 FOR bleus=0 TU / V5YNC SETCOLOR 0, rouges, vert*,bleu® NEXT bleu® NEXT vert® NEXT rouge“ ATARIMAGAZINE Y] BEST OF GFA RASIC PE 3 R Dégradé sur 512 couleurs Le programme suivant affiche un dégradé de couleur rouge, Pour obtenir un rouge pur, les composantes RVB vert et bleu sonr misé à D. Ce programme affiche huit bandes de couleurs d'une largueur de 320 pixels et d’une hanteur de & pixels. FOR i%=0 TG 7 VSETCOLOR i%,i%,0,0 HEXT i% py%-TE FOR i%=0 TO 7 DEFFILL i% PBOX 0,py%,319,pya+7 ADD py%,d NEXT 1% VOID INP(Z) END Palette de couleur étendue du STE La palette de couleur du STE fonctionne selon le même principe que la palette du STF, mais elle possède une structure légérement différente. Les composantes RVB sont codées sur 4 bits, Cela réprésente seize combinaisons différentes (2°2#16). Puisque chaque composante de couleur peut prendre seize valeurs différentes, il peut ¥ avoir léxléx16 couleurs, c'esr-à-dire 4096 coulcurs dillérentes. Les conceptenrs du STE ont réalisé un système de codage des couleurs compatible avec le codage des couleurs STE Clestadire qu'un codage de couleur STF fonctionnera sur STE. Cette compatibilité est réalisée en rajoutant une nuance intermédiaire entre chaque couleur STE Cellé-ci 25t codée avec le quatrième bit. Il y a denc hx codages RVB compatibles avec le STE et huit codages RVE non compatibles STF qui sont des nuancés intermeédiaires, Affichage de toutes les couleurs STE L’affichage des couleurs STE se fait de la même maniére que sur le STE, sauf que les codages RVB varient de 0 à 15, et non plus de Ca 7. FOR rougé*=0 TQ 15 FOR vert==0 TO 15 FOR bleu%=0 TÜ 15 V5YNC SETCOLOR O,rouge*,vert#,bleufs NEXT bleur NEXT vert® NEXT rouges Affichage d'un dégradé de couleur Pour réaliser un dégradé de couleur sur STE, il faut afficher les couleurs dans l‘ordre de leurs nuances. À cause du codage particulier du STE, il faur afficher les couleurs dans l’ordre sumant: 0, 8,01, 9, 5 10.43 1.4 12,583, 6 14,7, 5 Le plus simple est d’utiliser l'inseruction VSETCOLOR, comme sur STEpour écrire le programme simplement. Hélas, cela ne marche pas sur les GEA Basic 1x (saul pour la version 3.3E qui fonetionne d'une manitre un peu particulière). La raison de ce non-fonctionnement nous est inconnue. Le programme suivant vous montré Ce que pourrait être une routine d'affichage de dégradés si l'inscruction YSETCOLOR fonctionnait correctement sur STE. La séquence des codes RVB est stockde au début du programme dans des lignes de DATA, DATA 0,5,1,9,2,10,3,11 DATA 4,17,5,13,6,14,7,15 FOR col%=0 TO 15 READ rouges VSETCOLOR col%,rougex,0,0 HFXT col= pys=36 FOR i%=0 TO 15 DEFFILL 1% PEOX O,py*,319, pyt+7 ADD pys,6 NEXT 17 vOID INP(2) END Pour obtenir un dégradé correcr, 1l faut écrire une routine équivalents à |a foncrion VSETCOLOR Pour cela, il faut créer une table numerique qui permet de convertir un numéro de couleur VDI en numéro de couleur réel. Danlse programme d'exemple survant, La table de conversion est stockde dans le tableau couleur vdi(). Les données de conversion sont définies dans des lignes de DATA, La routine Set color émule sur un STE l'instruction VSETCOLOR, Atten- Hon: pour utiliser correctement Set_color, il faut absolument avoir initialisé la rable de conversion avec la routine init couleurs vdi, | VRSR R PE ! * AFFICHAGE DEGRADE * ! # ROUGE SUR STE L DIM couleur vdi(16) i Binit couleurs vdi deqrade: | . DATA 0,8,1,9,2,10,3,11 DATA 4,12,5,13,6,14,7,15 couleurs wvili: DATA C,15,1,6,4,6,3,9 DATA 7,8,%9,10,12,14,11,13 RESTORE degrace FOR col%=0 TÜ 15 READ rougé* @set color(col%,rouge=,0,0) REXT col% ATARI MAGAZINE Wl BEST OF GFA BASIC pyssib FOR i%=0 TO 15 DEFFILL 1% PBOX O,py%, 319, pye+7 ADD py*,8 NEXT i% VOID INP{2) END I el Tk e e e e e i o É e R T * INITIALISATION TABLE * * * CONVERSION COULEURS * | ÉÉÉN ÉÉ EN EFEERAE PROCEDURE init couleurs vdi LOCAL 1% RESTORE couleurs vdi FÜR i%=0 TÜ 15 READ couleur wdi{i%) NEXT 1% RETURN L d A é A é d d | * ROUTINE EQUIVALENT * | # YSETCOLOR pour STE * LÆhx d é é ol e e e e e ol e E RE E PROCEDURE set color(ne*,r%, vi,b%) LOCAL m mé=r4*256+v4*164+b# SETCOLOR couleur vdi{nck),mi RETURN ' Variations dans les dégradés Les programmes d'exemples n'affichent que des dégradés de rouge pur, mais vous pouvez afficher aussi des dégradés de vert ou de bleu en modifiant l'appel à la routine set_color * DEGRADE DE VERT Éset color(col,0,1%,0) ' DEGRADE DE BLEU üset color(col,0,0,1%) En utilisant des mélanges de couleurs, vous pouvez réaliser béaucoup de dégradés différents. Avec la technique présentée iéi, i peut y avoir 256 dégradés différents, Ce nombre est obtenu en multipliant le nombre de couleurs fixes possibles (16*16=256). ' DEGRADE QUELCONQUE @set color(coi,2,8,i%) Fabrication de dégradés aléatoires Ce programme d’exemple affiche une série de dégradés choisie aa hasard. Les couleurs constantes sont déterminées aléatoirémént avee la fonction RANDOM. La composante KVB de la couleur de dégradé varie de 1 à 15, et non de 0 à 15. Cela permer d'avoir roujours le fond de l'écran en foir. L'affich q des barres de couleurs est réalise une fois pour TOURS, Le programmie alliche un nouveau dégradé en changeant uniquement I palerte de couleut grâce à la fonction XBIOS(6). Lz rourine Énew color ne modifie pas directement la palette de couleur coutanté, mais agit sur une palette stochée dans la zone mémoire d'adresse adrpal. Le programme affiche une nouvelle palette tant que lutilisateur ne presse nas sur la touche [ESCI. | E e e e e r e d iRt u E ' # AFFICHAGE DE DEGRADES * S ALEATOTRES £ LHFF L L R R R Lk SE DIM col wdi%({16) DIM degra%{lé) adrpel==MALLOC{32) Ginit couleurs vdi Ginit degrade Bcalcul degrade Baff degrace B0 @calcut dégrade PAUSE 18 EXIT IF INP(Z}=27 LOOE VOID MFREE(adrpal#) EMD PROCEDURE init_degrade LOCAL % RESTORE degrade FOR 1=0 TO 15 READ degra(i) NEXT 1% RETURN 1 | hhh dc e e e e E RE | # INIIIALISATION PALETTE * ! # COULEUR FOUR DEGRADE 7 I = & e e e É o PROCEDURE calcul degrade LOCAL w%,bs,rs LOCAL alea% i v&=RANDOM (15) b%=RANDOM(15) ré=RANDOM(15) älea%=RANDOM(3)+1 enew color(0,0,0,0) FOR j%=1 TO 15 SELECT aleaw CASE 1 ATAZ| pAAGAZLINE BEST OF GFA BASIC Énew color(i*,rs,v5,degra=(1}} CASE 2 ênew color(i*,r& degra%(i),b%) CASE 3 ; @new color(i%,degrat(i),v%,b%] ENDSELECT NEXT i% | VOID XEI05{6,Ltadrpal=) RETURN E s o ol ol oy o e ol o ol o RR VR e E * * AFFICHAGE DEGRADE * I A d d A e d d d d d E E PROCEDURE aff dégrade LOCAL py%,i% - pys=36 FOR i%=0 TO 15 DEFFILL 1% PEOX C,py#,319 pytt7 ADD pyé,f NEXT i% RETURN| degrade: DATA 0,8,1,9,2,10,3,11 DÂTA 4,12,5,13,6,14,7,15 DATA -1 PROCEDURE new color(nes,r®,v®,b#) LOCAL mé,adré mE=206+r vik*16*+b% adré=adrpal%tcol wdi%(nck) *2 WORD{ adrs | =m5 RETURN PROCEDURE init couleurwdsi LOCAL i% — RESTORE couleurs vdi FOR 1%=0 TO 15 READ col wdi(i%) NEXT i% RETURN couleurs vdi: DATA 0,15,1,2,4,6,3,5,7 DATA-8,0,10,12,14,11,13 Gestion des couleurs en GFA Basic 3.5E Le GEA Basic 3.5F est une version du GFA Basic spécialement adaptée au STE. L'instruction VSETCOLOR ne foncrionne pas de la méme manière que les autres version du GH4 Basic. La séquence des codes RVB à été modifiée. Les codes RVR STE sont maintenant dans l'ordre. Pour afficher un dégradé de couleur, il suffit d'afficher les composantes KVB de 0 à 15, ek ke e e e e e ok R E RE ! * AFFICHAGE DEGRADE ROUGE * L # AVEC GFA BASIC 3.5E * I ke e ke e oy e i o o o A T T R ol o E FOR i%=0 TO 15 VSETCOLOR 1%,1%,0,0 NEXT i% pys=3b FOR i%=0 TO 15 DEFFILL 1% PEOX O,py%,319, pyit] ADD py#,8 NEXT i% VOID INP{Z) END Cet exemple ne fonctionnera qu'avec le Basic GEA 3.3E alors que l'exemple précédent fonctionnera sur tous les GFA Basic de série 3x [}r cümPr.'l!:_lL' GEA Rasic 3.3E), Scrolling vertical l’image affichée sur l'écran est la transcription du contenu d’une zone mémoire Cette image est redessinée 50 fois par seconde. Le dessin est fait par un point lumineux (appelé spot vidéo). Au nivéau intérne, le circuit électronique d'affichage lit l'adresse de la mémoire écran et affiche les données contenues dans cette zone mémoire sur l'écran. Cette opération s'appelle un rafraichissement vidéo. La fonction XBI05(5) du GFE4 Basic permet de changer l'adresse de la mémoire vidéo. En modifiant certe adresse, on peut réaliser un scrolling très mpide. La mémoiré écran dé la basse résolution est organisée en ligné de 160 octers, Pour décaler l'écran d'une ligne, 11 suffir donc de modifier Padresse de la mémoire vidéo de 160 octers. Le STE permet de positionner la mémoire vidéo à n'importe quelle adresse de l'écran, Cela permet de réaliser des scrollings très fins, Le ST'E ne permet de positionner |a mémoire écran que sur des adresses multiples de 256, C’est inutilisable pour un scrolling ligne par ligne Instruction XBIOS(5) L'instruction XBI0S(5) est une inseruction qui permet de changer l'adresse des derans physiques et logiques ainsi que la résolution du systèmé, Sa syntaxe est la suivante: VOID XBIDS(5,L:log, L:phys, res) log : adresse écran logique phys : adresse écran physique res : résolution écran La résolution ne peut pas être changée en GEA Basic, car GEM ne recomnaît pas le changement de résolution. Ce changement ne peut Étre réalisé qu'avec des programmes entièrement TOS, alors que le GEA Basic ne génère que des programmes GEM. Attention: uù programme GEM avec uné extension . PRG ne devient pas un programme TOS si son extension est renommée en . T05, Uadresse de l’écran physique est l'adresse de la mémoire qui sera affichée sur Pécran vidéo, alors que l'adresse de l’écran logique est 1'a- ATARIMAGAZIME Mbtd BEST OF GRA BASIC dresse de la zone mémoire où fonctiornneront les instructions graphiques du GE4 Busic. Grâce à ce système d'écran physique et Josique, le ST peur très bien allicher une image pendant qu'il est en train d'en dessiner une autre en mémoire. 51 un paramétre ne doit pas êÊtre modifié, 1l faut lui donner la valeur -L L‘exemple suivant appelle l'instruction XB105(5) sans rien modifiër. Cela ne sert à rien, mais c'est un exemple aussi valable qu'un autre. VôID XBIDS{5,L:=1,L:-1,-1) Attention: La modification de l'adresse de la mémoire vidéo n’est pas immédiate. Le système d’affichage ne change l’adresse vidéo que lorsqu’il recommence une phase d’affichage, Et il o'y à que cinquante affichages par seconde Si un programme modifie plusieurs fois l'adresse de la mémoire vidéo alors que le système est encore en train d'afficher l'ancienne page vidéa, seule |a dernière modification sera prise en compte: Pour éviter cela, 1l faut attendre un réaffichage vidéo après chaque changement de mémoiré écran. L'instruction VSYNC est la solution à cæ problème: elle blaque l'ecécution du programme tant que l'affichage de l'Écran n'est pas fini. VOID XBIOS{5,L:-1,L:adr ecr,-1) VSYNC Remarque: La svntaxe Lewar signifie que le programme doit transmettre une valeur entière 32 bits à-la fonétion XETOS. 5i vous bubliéz le symbole ‘L:“, vous risquez de gros ennuis, voire même de béaux plantages. Scrolling vertical pixel par pixel d'une image Voici un exemple de réalisarion pratique du scrolling vertical par modification de la mémoire écran. Le programme éréé une zone de travail de 64000 octets. Cette zone est divisée cn deux zones mémoire de 32000 octers. Chacune de ces deux zones mémoire a la raille d’une zone étran. Lors de Pinitialisation, le programme charge une image au format Depes Elite dans chaque zone mémoire, Il déclare ensus te l’adresse travail commé nouvelle mémoire écran. L'image IMGI apparalt immédiatement à l'écran puisqu’elle se trouve maintenant dans la mémoire écran. Le programme déplace verticalement l’écran d'uné ligne en incrémentant Padresse de la mémoire vidéo de 160 oetets. L'utilisateur à l'impression que l’image est montée d'un pixel et qu’une nouvelle ligne et apparue en bas de l'écran. Certe nouvelle ligne est la première ligne de l'image IMG2 En répétant 200 fois cette apération, on va voir l’image IMGI disparaître vers le haut de l'écran et l'image [MG2 va apparaître à partir du bas de l'écran. Une fois la première bouclé términée, la mémoire écran se trouve alors à l'adresse travail+32000, c'est-à-ire à l'adresse de l'image IMG2 Timage IMG1 à complétemenit disparu de l'écran. Pour inverser le processus et revepir à l'image TMG1, 1l faut modifier à nouveau l'adresse de la mémoire vidén. La séconde partie du programme effectue un nouveau scrolling en décrémentant la mémoire vidéo par tranche de 160 octets. La mémoire vidéo revient à son ancienne valeur, Le spectateur voir l'image IMGZ disparaître vers lé bas et l'image IMG1 apparaître à partir du haut de l'écran. [ T E E V P L CT E E e S 4 SCROLLING = # LIGNE FAK LIGNE * | eh e e o e o o o o é d E RESERVE 100000 travail%=MALLOC (64000) adri=travail% @load degas(“IMGL.PI1”,adr%) adr&=travail=#+32000 Bload degas(“IMG2.PI1”,adr#) ! flflngÿtt*à*%j*#ttikt | * SCROLLING VERS LE BAS * LFRR E = NRR A RE adriketrava1i% VOID XBIDS(S,L:-1,L:adr%,-1) VOID INP(2) FOR i%=1 TO 200 ADD adrs, 160 VOID XEI05(5,L:-1,Lzadr&,-1) VSYNC NEXT 1% VOID INP(2) | dh dh e é E e o e o S e e e E C E ! # SCROLLING VERS LE HAUT “ I RXERRRRRERNRN ARÉa ÉÉN R FOR i%=1 TO 200 SUE adr#,160 VOID XBIOS(5,L:-1,L:adr¥,-1) VSYNC NEXT 1% VOID MFREE(travail# END | I Rk d d d SE SE RE ! # CHARGEMENT IMAGE * ' # DEGAS ELITE A UME * ' * ADRESSE MEMCIRE % | * QUELCONQUE. bj l HEF RNEE PROCEDURE load degas(noms , adr“) LOCAL pal5 pal$=SPACES (37) OPEN “i”,#1 ,nom$ BGFT #1,VARPTR(pals),?2 BGET #1,VARPTR(pal$) , 32 VOID XBIOS(6,L:VARPTR(pal$}} —- BGET #1,adr%, 32000 | CLOSE #1 RETURH Artention: aprés l'exécution de cé programme, la mémoire écran n'est plus à sa valeur initiale, [ faut la réinitialiser pour continuer à travailler normalement. La solution la plus prarique est de sauver l'a- ATAR| MAGAZINE fl BESTOF GRA BASIC | dresse de |a mémoire écran au début du programme afin de la restaurer plus tard. adr video%=XBI05(2} Utilisation d'un écran virtuel La technique que nous venons de voir est classique, mais peu facile à sérer. En examinant la sicuation avec un angle de vision mouns «téchMiques, mals le n:pmt]'qu:-n, on découvre une autre methode, plus simple à utiliser. La zone mémoiré de 64000 octers constitue un Ééran virtuel ‘de 320*400 pixels, La mémoire écran est une fenêtre de 320*200 pixels qui peut Être positionnée à n'importe quelle adresse mémoire grâce à la fonction XBI05(5). On peut réliser une fonction Bset ligne qui positionne la fenêtre de visualisation sur n'importe qbelle hgne de l'écran virtuel, Certe nouvelle fonction caleule l’adresse de la fen£- tre de visualisation en multipliane le numèro de la ligne | par 160 (nombre d'octets par ligne en basse résolution), La lonetion XBIOS(5) modifie l'adresse de la mémoire vidéo par l'adresse de la fenêtre de visualisation. Attention: l'adresse de l’écran virtuel doir être stockée dans la variable travail. PROCFDURE set ligne(1%)} LOCAL adrw adr&=travail#+(15”160) VOID XBIOS(S,L:-1,L:adr%,-1) YSYNC RETLRN En déplagant la fenêtre de visualisation sur l'écran virtuel, on réalise un scrolling. L'ecemplé suivant vous montre la grande simplicité d'urilisation de cetté technique, FOR Tigne%=0 TO 200 êset ligne(lignes) NEXT ligne% | Pour réaliser un scrolling vers le hawr, il suffit de déplacer la fenérre de visualisation dans le sens inrerne. FOR ligne%=200 TO Q STEP -1 @set ligne(liqnes) NEXT lignes L'exemple suivant réalise un Eümflillg haut et bas entre Z imagés. - RESERVE 100000 ravai 1&=MALLOC{64000) adr*travail* @load degas(“IMG1.PI1“,adr$) ATAR] MAGALINE adri=travails+32000 @load degas(“IMGZ.PIL”,adr%) adr®=travai 1 Bset ligne(0) VOID IWP(2) - FOR i%=0 TD 200 Bset ligne(i) NEXT 1% VOID INF(2) FOR i%=200 TQ D STEP -1 Gset ligne(1%) MEXT 1% VOID MFREE(travaiT#) END Cette techrique peut être utilisée sur des écrans virtuels de n'importc quelle taille Rien ne vous empêche d'utiliser un écran virtuel de 320*2000 pixels {prenant 320 Ko de mémoire). Avec une machine équipée de 4 Mo, on peut créer un écran virtuel d'au moins 320×20 000 pixels (3,2 Mo). Avec un STE équipé de 2 Mo de mémoire, nous avons réalisé un serolling vertical sur un écran virtuel de 320×10000 pixels occupant 1,6 Mégas octers de mémoire. Ce programme a été chargé par 50 images Degas Elste. Clest amusant, même si cela ne présente pas béaucoup d'intérêt pratique. Amélioration de la vitesse de scrolling Le scrolling pixel par pixel &st béau, mais un peu lent. Il est possible de l'améliorer en déplagant l’écran de plusieurs lignes à la fois. Avec un déplacement de deux lignes à la fois, on augmente la vitesse de scrolling d'un facteur de 2. Avec un déplacement de quatre lignes, on augmente encore là vitesse de scrolling d'un facteur de 2, ete. La qualiré visuelle du scrolling n'est pas altérde tant que le pas d'incrétmentation est Inferieur à 10 FOR 1igne%=0 TO 200 STEP 2 @set ligne(ligne*) NEXT ligne% FOR 1ignex=200 TO 0 STEP -2 üset ligne(lignes) NEXT ligne% Bug des boucles FOR-NEXT Il ¥ à un problème dans les boucles FOR-NEXT avec certaines valeurs d'incrémentation. Cé problème esé du au traitement de l'indice de boucle, Avec une boucle simple, la vartable 1 prendra successivement toutes les valeurs éntières possibles entre O er 200, FOR 1%=0 TO 200 PRINT 15 BEST GF GFA BASIC NEXT 15 Âvec un pas d'incrémentation de 2, on obriendra les valeurs-0, Z, 4, … 198, 200, : FOR 1%=0 TO 200 STEP 2 PRINT 1% NEXT 1# Par contre, la même boucle avec un pas d'incrémentation de 3 donnera un résultät curieux: la variable 1% s'arrêcera à la valeur 158. Ce la vient de la téchnique utilisée par le GEA Basic pour gérer les boucles FOR-NEXT, Lorsque le programme incrémente la variable compteur de la boucle, il teste si le résultat est supérieur ou égal à la valeur de sortie de boucle Si ce test est posinf, 1l sort immédiaterment de la boucle. Dans notre exemple, la variable de boucle est la variable 1%, Lorsque celle-cr vaut 198, le programme l'incrémente de 3. Il téste ensuite le résultat (198+3=201). Comme ce résulrar est supéricur à la valeur maximale, il sore de la boucle. FOR 1%=0 TO 200 STEP 3 PRINT 1% NEZT 1% Le même pËJEL:U[:]Ê:nl: sé r-::'pl'ülil.lit avec la valeur 6, car c'est un multiple de 3, ainst qu’avéc la valeur 7. Clest encore plus drôle avec 7, car la valeur de sortie de 12 houcle est alors 196, ; Si vous utilisez un pas d'incrémentation de boucle erroné, le scrolling vértical ne se fera pas sur la totalité de votre écran virtuel, Pour éviter céla, on peur éviter |es pas d'incrémentation dangereux ou encore pesitionner systématiquement la féenêtre de visualisation à sa position théorique de fin de scrotling. FOR 1=0 TO 200 STEP 3 @set ligne(l%) NEXT 1% Bset 1igne{Z00) Pour éviter un affichage supplémentaire, le programme peut faire un test sur la valeur de sortie de la boucle. Cela permet d'uriliser r'importe quel pas de scrolling sans risque, Dans l’exemple suivant, la valeur d'incrémentation de scrolling est stockée dans la variable pas. FOR 1=0 TO 200 STEP pas# êset ligne[l#] NEXT 1% IF 1%==200 Gcet Tigne(200) ENDIF Remarque: Les problémes posés par des pas d'incrémentation positifs se retrouvent aussi avéc des pas d'incrémentcation négatits, Une boucle FOR-NEXT allant de 200 à O avec'un pas de -3 finira avec la väleur 2, ec la même boucle avec un pas de 7 finira avec la valeur 4. Scrolling en haute résolution Les rechniques de scrolling vertical que nous venons de veir sont va- ATARI MAGALZINE lables pour la basse ec moyenne résolution, puisque ces deux résolutions utilisent des lignes de 160 octets. Le cas de la haute resolution est différent car ce mode graphique utilise 400 lignes de 80 octers. Il faut alors modifier la routine @set Tigne_hr — FOR 1%=0 TO 400 @set Tigne hr{1%) NEXT 1% FOR 1%=400 TO O STEP -1 éset ligne hr(15) MEXT |4 PROCEDURE set_ligne hr(1%) LOCAL adr% adr&travail#+(1%#86) VOID XBI0S(5,L:-1,L:adr*,-11] V5YNC RETURN Le scrolling en haute résolution est deux fois plus lent que le scrolling en basse ou moyenne résolution, car 1l y a deux fois plus de lignes à déplacer. Cependaite, rien ne vous empêche d'eccélèrer la viresse comme nous l'avons fait plus haut. Scrolling circulaire d'une image Voici un exemple qui affiche une image scrollant sur elle-même. Clest trés spectaculaire, mais facilé à programmer. Le programme utilise un écran wirtuel de 320%400 pixels (64 000 octers). L'image est chargée en mémoire à partir de la ligne Q et de la ligne 200. Elle est done présente deux endroits de la mémoire. Le programme réalise un scrolling vertical entre la ligne © er la ligne 200, Une fois ce scrolling terminé, il repositionne la fénêtre de visualisation sur la ligne 2 et recommence le cycle. À cout moment, il visualise sur l’écran une partie de la première image ec une partie de la seconde image. Clest le mélenge de ces deux images identiques qui donne une impression Les imagc—s sont ûhargfil.:ä aux acresses mémoires adrl et adr& Atten-. tiot: la routine @set lîgne calcule une adresse de ligne à partir de l'adresse adrl er non Lravail comme dans les exemplés précédents. | *x+xEttttédebaEae eS s% SCROLLING CIRCULATIRE * s D' UNE IMAGE 3 i -.l:-.l.-:l.-:l:É*##fi#kfi!ïü'ü”ü'ki“##ï i RESERVE 100000 adr1&=MAL10C(54000) adré*=adr14+32000 @load degas(“IMG1 .PI1“,adr1%) Ëload degas(“IMG1 .PI1l”,acr&} Gset ligne(0} VOTE TNP{2) BEST OF GRA RASIC I-“'I-II'-EIE.“”- zhl Qi FOR i%=0 TD 200 Üset ligne(i*) NEXT i% LOUF VOID MFREE(adr1%) END I L e B R R R “% FIXATION LIGNE. * ” # ECRAN VIRTUEL * L d E E E S PROCEDURE <et ligne(!#) LOCAL adrs adr&=adr15+(15*160) VOID XB10545,L=-1,L:adr&,-1) VSYNC RÉTURN Ce programme n'a pas de condition d'arrêt, Si vous voulez lutiliser de maniére compilée, il faut prévoir une condition d'arrëe (test avec ling en inversant le sens de la boucle FOR=NEXT. FOR 1%=200 TO Ü STEF -1 Bset Tigne(i%) “ NEXT 1 Comme dans les exemples précédents, 11 est posaible d'augmenter la vitesse de scrolling en augmentant le pas d'incrémentation entre chaque ligne. Scrolling vertical commandé par la souris Le programme survant deplace une fenêtre de visualisation sur un écran virtuel de 32Cx400 pixels. La position de la fenêtre de visualisation est commandee par la souris. Une boucle DO-LOOP permet de gérer les événements souris. Le propramme ne sort de cette boucle que si la position Ÿ de [ souris varie, où si l'utilisatéur clique sur un bouton souris (condition de sortie du programme). ¥ Le résultat est spectaculaire: le scrolling suit tous les mouvements de ‘ la souns. Un déplacement lent provoque un scrolling lent ec un déplacement rapide modifie très rapidement l'écran. ' DVSF e B e e g e b e e e ï 1.8 . SCROLLING VERTICAL * : * COMMANDE PAR LA SOURIS * | HRE R VNN e e RESERVE 100000 old ecr=XBIOS(Z) travails=MALLOC(64000) | HIDEMR adrS=travail= Bload degas(“IMG1 .PI1”,adr®) ATARI MAGAZIME adr&=travail3+32000 @load degas(“IMGE.PI1”,adr®) MOUSE xmês, ymdés, ki Bset | ignélym0r) 0 ; D . MOUSE xmes, yrrée, k' EXIT TF yme=ym0s EXIT IF kEmée=i LODP EXIT IF kmw=0 ymOEs =y Bset ligne(ymé) LODF VOID :ÆE!.I-DS{E.L:-_l,i.:nld_e:r%,-l] SHOWM VOID MFREF(travail%) END E.Emàrqug: La position Ÿ de la souris varie engre 0 et 199 alors que la nosicion d'affichage de l'écran virtuel varie entre 0 et 200, La der nièré ligne de la seconde image n'est donc jamais affichée sur l'écran. Scrolling vertical sur un grand écran On peut réaliser un scrolling sur-un écran de grandé dimension en f:;.hriqu ant l'écran au fur et à mesure de Ï“::lffir_'h.‘lgù. L'écran peut Ëtre construit avec des éléments graphiques de 16×16 pixels. L'écran virtuel est consuitué d'une série de lignes de blocs de 16×16 pisels. IL y a 320/16 blocs par lipne, c'est-à-dire vinat blocs par ligne, Tes éléments graphiques de base peuvent êÊtre stockes dans un tableau-alphanñumerique et athches avec l'instrauction PUT. UIM dessin$(300) DIM ecrant(4000,#0} | Ce système permet de creer un grand écran ne prenant que peu de place. L'écran basse résolution est de 320×200 pixcls, Il peur être dessiné avec 20”10 éléments graphiques de base 51 le nombre d'éléments graphiques ne dépasse pas 255, l’écran peur être defimi avec des entiers courts & bits. La définition d'un écran prend alors 20“10 octets, soit 200 octets. En stockant l'espacé virtuel dans ur tableau de 4000 lignes, on peut coder 200 écrans pour une taille de 30000 octets [4000 lignes de20 octets). En comparant la place mémoire prise par 200 écrans avec les 80 000 ocrets du tableau écran, on arrive à un rapport de 80, Pour faire un caléul exact, 1l faut venir compte de la place mémoire prise par les éléménts graphiques. Un élément de 16*16 pixels stocké dans une vartable alphanumérique prend 134 octérs. Les 256 éléments (de D à 255) occupent 34304 c tets, Le rapport est done de 200*32000/(80000+34304), soit 56. GET 1,1,16,16,vras PRINT LEN(vär$) La plupart des jeux d'arcades à scrolling vertical utilisent ur systeme similaire à colui-ci pour créer leurs décors de jeux. BEST OF GFA BASIC GRAPHISME STE EN GFA BASIC SCROLLING HORIZONTA Faites danser votre écran Nous avons vu comment gérer les 4096 couleurs du STE et comment réaliser des scrollings verticaux. Cet article porte sur le scrolling horizontal. Scrolling horizontal An point de vue du spectateur, un scrolling correspond au déplacement d’une fenêtre de visualisation sur une image plus grande que l'écran. I existe plusieurs techniques de programmation de scrolling, Le système d'affichage du STE peut pérer facilement des scrollings verticaux ét horizontaux, On peut réaliser un scrolling vertical en faisan: varier l’adresse de la mémoire widéo. La fonction X810S(5) permet de changer Padresse de la mémoire écran à l’octet près, Erant donné qu’une ligne fair 160 octéts en basse résolution, 1l suffit done de modifier l’adresse de la memoire vidéo de 160 octets pour décaler l'écran d’une ligne. Structure de la mémoire écran STE La mémoire vidéo basse résolution d'un STF est organisé de fmanière linéaire. Elle est coñsticuée de 200 lignes de 160 octets pour une talle totale de 32000 octets, Les lignes sont stockées les unes après les autres. ligne 1 (1460 actets) ligne 2 (160 octets} ligne 3 (1560 octets) ligne 4 (160 octets) MEMOIRE VIDEO STF 200 LIGMES DE 160 OCTETS La mémoire vidéo STE est organisée de la même mamère que la mémoire écran STE, c'est-à-dire en ]iE_'.rtr. de 160 octers. Par contre, 1l peut y avoir un décalage encre chaque ligne de l'écran. MEMOIRE VIDEO 5TE 200 LIGNES DE 160 OCTETS Le système d’affichage doit être averti de la valeur du décalage séparaut chaque ligne afin de réaliser un affichage correct. I ne doit lire que les lignes appartenant à l’écran. Ce décalage s’appelle: offset de liene. Le système d'affichage lit une ligne d'écran en tenantt compte de I'offset de ligne pour calculer l'adresse de la ligne suivante, La variable système d'adresse EHFF8Z0F contient la valeur de l'offser de ligne, Elle est mesurée en mots (1 mot = 2 octets). Si elle contient la valeur O, il n°y à pas d'espace entre les lignes. La struerure de la mémoire vidéo esc alors similaire à la mémoire vidéo du STE Clest le cas le plus courant. Linstruction SPOKE permet de modifier le contenu de la variable sysrème BHFF&20F. SPOKE &HFFZe0F,0 Effet graphique nmusufif Lorsque vous modifiez la valeur de l'offser de ligne, la mémouire écran doit avoir une strocture tenant compte de cet offset. 51 ce n'ést pas le cas, l'effet est asez amusant. Avec vine valeur différente de 0, le contrôleut vidéo saute des espaces entre chaque higne. 51 l‘écran est ordinaire, le contrôleur vidéo affiché sous forme graphique le contenu de la mémoire situé après la zone mémoire vidéo. Si vous voulez la voir, taper SPOKE BHFFS20F ,80. Le résultat cst garanti, surtout avec le bureau GEM. Les barres de l'Écran qui bougent sans cesse correspondent aux zones système du ST qui sont cont+ nuellement modifiées par le système d'exploitation, Pour annuler cet effer vidéo, taper en aveugle SPOÉKE &HFFG20F,0. Scrolling horizontal Pour réaliser un scrolling horizontal, on peur déplacer une fenêtre de visualisation sur un écran virtuel. D'écran doit être généré par le programme, La fenêtre de visualisation est l'écran du ST. On modifie le contenu de l'écran en changeant son adresse mémoire grâce aux fonctions spécialisées du STE. ECRAN VIRTUEL ECRAN PHYSIQUE: FEMETRE SUR ECRAN VIRTUEL ATARI MAGAZIME m BEST OF GhRa BASIC À chaque position de la fenêtre de visualisation correspond une adresse pour la mémoire vidéo. Pour déplacer la postion de la fenêtre, il suffit donc de changer une adresse. Le ST ne tient compte du changement d'adresse vidéo qu'après avoir affiché l'image courante (4 la vitesse de cinquante images par secondes). 5t le programme Ehfl:l'.lgl: l'adresse vidéo Ph:s mpidem ent, seule la derniere modification sera prise en compré. Pour éviter cela, après chaque changement d'adresse, 1l faut bloquer l'exécution du programme tant que le 5T n'a pas attiche l'imagc: SO rante, C'est la tâche de l'insteruction VSYNC. XB10S(5) 1 Changement adressé mémoire vidéo VSYNC | Attente fin affichage image courante Puisque le ST affiche cinquante images par seconde, la vitesse. de scrolling ne peut pas dépasser cinquante décalages à la seconde. Ceci dit, chaque décalage peur correspondre à autant de pixels que vous le P Scrolling horizontal 16 pixels par 16 pixels La structure de l'écran ST en basse résolution est telle que les pixels sont stockes par groupe de 16 dans des blocs de 8 octets, Cette struerure particuliere est liée au système de codage des pixels par plan de couleurs. On peut réaliser un scrolling horizontal sur un écran virtuel en faisant simultanément varter l'adresse de l'écran et l'offser in- ; térligne. Etant donné que le codage interne des pixels se fait par blocs de 16 pixels (8 octets), le scrolling ne peut se faire que par blocs de 16 pixels, L'écran virtuel fair 64000 octets. L'offser de ligne est de 160 octets, done de quatre-vingt mots, L'adresse de l'écran est modifiée avec la fonction XBI0S(5). Pour réaliser un scrolling horizontal vers la droite, il Faut déplacer l’adresse de Pécran logique de 8 neters à la fois, Chaque déplacement dé & octéts correspond à un déplacement visuel de 16 prxels. adr pic*=MALLOC(64000) SPOKE &HFF820F,80 FOR bloc%=0 TQ 19 adr&=adr pic%+block™8 VOID XBIOS(5,L:-1,L:adr%,-1) CVSYNC NEXT bloc® SPOKE 8HFF820F,0 VOID MFREE(adr pic*) END Ce programme est incormplét. Il s’agit juste d'un exemple montrant la téchnique de base de scrolling. L'écran virtuel est vide, Tl faut le remplir avec une image qu:]r.ünqu: pour réaliser une véritable démonstration. Si vous voulez réaliser un programme complet, inspirez-vous du programime survant. ATARI MAGAZIME Scrolling horizontal pixel par pixel Pout réaliser un scrolling horizontal pixel par pixel, il faut positionner l’écran physique par mpport à l'écran virtuel à 1 pixel prés. La variable système d'adresse 8HFFB265 permer d'y arriver. Elle contient une valeur que l'on appelle l’affeet de pixel, T_,.:.rfiqm: le mntr-fi!:ur Tifléfl Ëlflflä'l:fi nne 1i.g|:‘!|E S I'E'I'-::.I:'.‘:'m., '|.| COTIIITICMce par lire le bloc mémoire correspondant aux seize premiers pixels de la ligne. L'offset de pixe! permet de préciser auquel de ces 16 pixels doit commencer l'affichage, Avce un offést de pécel de 0, l'affichage comménce au premier pixel du bloc. Clest le mode normal d'affichage (le seul permis par le STF). Pour réaliser un déplacement de pixel, 1l suffit de modirfier la valeur de la variable &HFF8265. L'ecemple suivant réalise un scrolhng pixel par pixel sur une longueur de 16 pixels, FOR offset pixel%=0 T0 15 VSYNÉ SPOKE &nFF8265,offset pixels NEXT offset pixel% Si vous utilisez ce programme sur un écran noemal, le résultat risque d’être surprenant. Pour obtenir un scrolling correct, il faut créer un &space virmuel dont la largueur est supérieure à celle de Pécran. L'exemple suivant utilise un écran virtuel de 336 pixels de large. Sa largueur éti octers est de 168 octers. L'oifrer de figne est de E ocrers, donc de quatre mots. La taille ce l'écran virtuel est de 200×168 octers = 33600 octéts. DUFN ettt RRN EÉ E N ! # SCROLLING HORIZONTAL * * # SUR 16 PIXELS 1y D et b T e DL o ke adr_pick=MALLOC{33600) VOID XBIOS(5,L:-1,L:adr pic%k,-1) VSYNC SPOKE AHFF8265,4 FOR offset pixel%=0 T0 15 VSYNC SPOKE EhFF8265,offset pixél% NEXT offset pixels VOID MFREE(adr pick) END Si vous exécurez ce programme, vous constaterez qu'il ne fonctionne pas. La raison est que l’affset de figne est variable. Lorsque l'aifsst de pixel vaut 0, l'affset de figne est correet. Par contre, lorsque offset de pixel est différent de 0, le contrbleur vidéo doit lire les prxels restants dans le bloc de 16 pixels suivants. La valeur de l'offet vidéo doit alors diminuer de la taille d’un bloc de 16 pixels, c'est-à-dire de 8 octets (quatre mots). Voici une version corigée du programme d'exemple. Lorsque l’affser de pixel est égal à O, l'affset de ligre vaut 4. Lorsque l'affset de pixel est différent de 0, l’offrez de ligne vaut 0. Le programme de scrolling ho- BESTOFGFA BASIC rizontal publié dans Atari Magazine N°6 donnait un scrolling saccadé car l'offéer de ligne n'étant pas modifié lorsqu'il était égal à C. L d i e e d e d o é d o e e o o ol ! # SCROLLING HORIZONTAL * ! * NON SACCADE A ' * SUR 16 PIXELS ¥ | RHN É RE RR RR EEE adr_pit%=HñLLÜÈË335üÜ] VOID XBIOS(5,L:-1,L:adr_pick,-1) VSYNC SPOKE &HFF8265,4 FOR offset pixel%=0 TO 15 VSYNC SPOKE EhFF8265 offset pixel IF offset pixel%=0 SPOKE &HFF8265,4 ELSE SPOKE AHFF8265,0 ENDIF NEXT offset pixel® VOID MFREE(adr_pic*) END Attention: dans ce programime, l'offret de ligne vaut C si l’offser de poxel est différent de 0. Clest un cas particulier qui n'est valable que dans cet exemple simple. 11 ne faur pas oublier que si l'affset de pixel =t différent de O, l'offéer de ligne est égal à l’offser de ligne théorique moins 4 (dans l'exemple 4-4=0). _ _ Si vous travaillez sur un écran virtuel constitué de deux écrans mis bout à bout (160 octetsx2~320 octets, donc 160 mots), l’offset de ligne vaut 80 si l'offret de ligne est égal à D er 76 (8C4) dans le cas contraire, Exemple de scrolling horizontal pixel à pixel Voici un programme de démonstration qui effectue un serolling horizontal entre deux images Depas Efire. Ce scrolling est réalisé en déplaçant une fenêtre sur un écran virtuel. L'écran virtuel est consritué de deux images Degas Elite mises bout à bout, 5a taille est de 64000 octets (2×32000 octets). IMAGE ! IMAGE 2 Le scrolling est réalisé en déplaçant une fenêtre sur l’écran virtuel, Pour positionner l'écran physique à une position quelconque de l'écran virtuel, il faut calculer l’adresse du bloc de 16 pixels correspondant À certe position, la valeur de l'affser de pixel et la valeur de l’offier de ligne. pffsét pixel%=px% MOD 16 adrfiphy5%=fldrdpic%+{px% DIV 16)*8 IF offset pixel%=0 offset lignes=80 ELSE offset ligne*=-76 ENDIF Le numéro du bloc est obtenu en divisant la position d'affichage par 16. Comme un bloc correspond à 8 écters, on multiplie ensurte le numéro de bloc par 8 afin d'avoir l'adresse du bloc. adr_block=(px% DIV 16)*8 Cette adresse t relative à la zone mémoire contenant l'image. Pour obtenir une adresse absolue, il faut y additionner l'adresse de la zone mémoire, adr_block=adr_img%+(px%s DIV 16)*8 La valeur de l'offiet de pixel est calculé avec la fonction MODULO. offset pixel%-px% MOD 16 La valeur de l'affrer de figne vaut 80 51 l'afféer de pixel est égal à D et 76 (80-4) si l'afféer de prixel est différent de 0. La procédure Éposition fenetre(px) calcule aumnmfiquemer_l: les paramiètres de la fenètre correspondant à la pasition px, Une {ülîllü paramètres dérerminés, elle positionne l'écran physique à la position correspondant à la position px. Une fois la procédure @position fenetre créée, les routines de scrolling sont particulièrement slmpÈr. à realiser. Pour scroller une image vers la gauche, il suffic de positionner la fenêtre sur la position O de l'écran virtuel er de déplar cer cétté position vers la gauche d’un pixel à la fois. @position fenetre(0) FOR px%=0 TO 320 éposition fenetre(px#) NEXT px% Pour réliser un scrolling vers la droite, il faut positionner la fenêtre au bout de l'écran virtuel {pr=320) et déplacer la fenéere vers le bord gauche (px=0). fposition fenetre(0) FOR px*-320 TO D STEP -l @position fenetre(px*) NEXT px% Le programme stocke deux images Degas Elite en mémoire et realise un scrolling allant d’une image à une autre. Les images sont chargéés dans la mémoite écran initizle, puis recopiées dans l'écran virtuel en tenant compte de sa structure parriculière (160 ocrets de l'image 1 suivis de 160 octets de l'image 2, etc.) | RRRTERRÉRR RRN ETE ÉÉ RR ! # SCROLLING HORIZONTAL * D e e AR TR PR AR T T e e L R R ok ATAR| MAGAZIME E BEST OF GFA BASIC RESERVE 100007 HIDEM adr_pict-MALLOC(64000) adr sauve%=XEI05(2) i A dr r rrr é d e é d drrec de dr de d d k 0 0 0 E E E E E ' * CHARGEMENT PREMIERE IMAGE * D 1 1U 64 A A U o A RU E E E R E E e e e o R RR RS @load degas{“IMAGEL.PI1®,XB10S(2)) adr ecrans=XBI05(2) adr memoires=adr _ pic# FOR 1%=0 TO 199 EMOVE adr ecrans,adr mémoires, 160 ADD adr ecrans, 160 ADD adr memoires,320 MEXT 1% BMc d d e d d é e e e e e smE A TR * # CHARGEMENT SECONDE IMAGE * I E d d d A 0 e e A E A e e e e e e e x Bload degas(“IMAGEZ.PI1”,XBIOS(2}) adr ecran¥=XB105(2) adr memoire*=adr pic#+1b0 FOR 1%=0 TO 199 BMOVE adr ecran%,adr memoire= 160 ADD adr ecrans,l60 ADD adr memoire*, 320 MEXT 1% CLS PRINT “Pressez une touche pour PRINT “Commencer la démonstration” VOID INP(2) [ I *tfl*itwwwt*ttt*t%#:t*ü | * SCROLLING VFRS LA DROITE * | AARERRAE ERERN RAA RER FOR px&=0 TO 320 @position fenetre(px%) NEXT px% ï L E r d e 00 E E bl e e e d e ok ok o ok d d d d ! * SCROLLING VERS LA GAUCHE #* 1 ph d é e d e d R e d e e ek e E d FOR px%=320 TO O Gposition fenetre(px%) NEXT px VOID INP{2) | RR RN uRE ÉÉ A AN A E AN N AR RERR ' * REMISE ECRAN DANS ETAT INITIAL | HFh EEeéEE A RE e E SPOKE LHFF8265,0 SPOKE EBHFFB20F,0 VOID XBIOS{5,L:—1,L:adr sauve#,-1) VS5YNC VOID MFREE(adr pick) SHOWM EN E OE E I e RP E E TIR ' * AFFICHAGE DE LA FENETRE ECRAN * l RE ÉN A E RE R AN A IERE PROCEDURE position fenetre(px%) LOCAL offset pixel% LOCAL adr physs LOCAL offset ligne# offsét pixel&px& MOD 16 adr_phys%=adr_pici+(px% DIV, 16)*8 IF offset pixels=0 “ offset lignes=80 ELSE offset ligne=76 ENDIF VOID XBI0S(5,L:=1,L:adr phys%,-1) VSYNC SPOKE EHFFB265,0ffset pixels SPOKE EHFFEZOF,offset ligne% . RETURN ; ; I UEAAÉÉHREÉ RR kR ARt btk E RR RR E ! * CHARGEMENT IMAGE DEGAS ELITE * PROCEDURE Toad degas(nomd,adrs) LOCAL pal5 Ï pal$=sPACE*{32} OPEN “i” #1,nom$ SEEK #1.2 BGET #1,VARPTR(pal#),32 VOID XBIOS(6,L:VARPTR{pal#)) BGET #1,adr%,32000 CLOSE #1 RETURN La vitesse de scrolling horizontal peur être accélérée en augmentant le pas d'incrémentation entré chaque pixel. Avec 2 pixels, la vitesse est doublée, Avec 4 pixels, la vitesse est encore doublée, Remarque: le système de scrolling modifie l'adresse de la mémosre vidéo. Il faut remettre l'écran dans son état initial afin d'éviter les surprises désagréables. Le programme sauve l'adresse initiale dans la variable adr_sauve*, Scrolling horizontal , commandé par la souris Pour obtenir un effet spectaculaire, vous pouvez asservar le scrolling 1ux positions de la souris. C'est très facile à réaliser en affichant la fenêtre de visualisation à la position courante de la souris. ATARI MAGAZINE KIM BEST-OFGEA BASIC [ xnfs=MOUSEX EXIT IF MOUSEK⇒0 Gpostition fenetre(xmé) LOUP Cette routine fonctionne bien, mais elle présente un défaut. La fené tre de visualisation est sans cesse redessinée à l'écran. Pour éviter cela, il faut écrire une rourine qui attende un déplacement de la souris pour redessiner la fénêtre de visualisation. x 0% =MOUSEX Bposition fenetre{x0%) D0 [0 xm*=MOUSEX EXIT IF emÿe=x05 EXIT IF MOUSEK==0 LOOF EXIT 1F MOUSEK==0 @position fenetre(xm6) MUFE= AIN LOOP La position de départ de la souris est mémorisée dans la variable x. Une boucle DO-LOOP bloque l'ecécution du programme tant que la souris ne change pas de position x. Etant donné qu'il y à deux boucles DO-LOOP la condition de sortie (clic sur la souris) est tescéé deux fois (EXIT IF kmi=⇐0). Pour obtenir le programme complet, il faut reprendre le programme de scrolling et le modifier légérement. Remarqué: dans lé programme précédent, la fenêtre de visualisation est déplacée de la position © à la position 320. Etant donné que la position de la souris ne peur varier qu'entre 0 et 319, la derniére colonne de l'écran virtuel correspondant à la position 320 ne sera jamais affichée à l'écran. Utilisation simultanée des scrollings verticaux et horizontaux Après le scrolling vertical et le scrolling horizontal, voies mamtenant un programme d’exemple qui utilise simultanément les deux modes de scrolling, 11 affiche une fenétre sur un écran virtuel de 640x4C0 prxels. Cet écran virtuel est remplis avec quatre images Degas Efite. La fenêtre de visualisation est déplacée avec la souris. L'écran virtuel occupe quatre images Degas Flite, donc 128000 octets (4×32000 octers), Les lignes d'uné même image sont séparées par 160 nctets. Pour calculer l'adresse de la ligne n+1 à partir de l’adresse de la ligne n, 1l faur lui ajouter la valeur 320. Ce chiffre correspond à la longueur de la ligne (i60 octets}, additionné à Ja longueur de l’espace interligne (160 octets). On obtient donc un votal de 320 octets. L’imagé IMAGE 1 commence à Padresse de l'écran virtuel. L'image IMAGE Z commence à l’adresse de l’écran virtuel plus 160 octets. L'image IMAGE 3 commence à l'adresse de l’écran virtuel plus 32000 octers. Et enfin, l'image IMAGE 4 commence à l'adresse de l'écran virtuel plus 32160 octers (32000 +160). IMAGE 1 IMAGE 2 . La procédure Bfixe ecran(px,py) positionne la fenêtre de visualisation à la position (px,py). Nous avons vu plus haur que la posiuon de la mémoire écran est définie par une adresse, un offset de figne et un offfet de pixel. Les lignes sont séparées par 80 mots (160 octets). L'offser de Figne est done de 80 lorsque l’offret de pixel est égal à Q, et de 76 (80-4) dans le cas inverse. L'offset de péxel est défini avec l’opéraceur MODULO, offset pixel&=px4 MOD 16 L'adresse de l’écran est calculée à partir de la position x et de la position v. La position y sert à dérerminer l'adresse de la ligne. T4 position x sert à calculer l'adresse relative du débue de l'écran par rapport à l’adresse de la ligne, adr ligne%=adr picspy4”320 adr physt“adr _ ligne%+(px# DIV 16)*8 Le programme commence par remplir l'écran victuel avec les quatre imapes Degas Elire. Les images sont chargées avec la procédure @load degas dans une mémoire tampon, puis rméopiées à leurs pla:-zç;baputtim dans l'écran wirmuel. L'utilisation d'une mémoire tampon permet d'éviter l'affichage des images à l’écran lors de l'ini cialisation du programme. | HRN NRREREERTÉERR E R AR RE RE E ! * SCROLLING SUR UN ECRAN VIRTUEL * * & DE 640*400 (4 IMAGES DLGAS) * P RV S0 R R S T S e B S R A * * () ATARI MAGAZINE 1901 = ! * (C) PATRICK LECLERCO 1991 ñ | 4R RÉEÉ É AN RE E EN E R RE ! * PROGRAMMATION GFA BASIC 3.xx A I +ggqtt*#tttt*#*kik#tt*#t RESERYE 100000 HIDEM adr tampont=MALLOC(32000) adr_pi c%=MALLOC (128000) adr sauve%*=XBTOS(2) ! I E E ME M E Ac ue d d e e A d d d d E d e e e d ” * CHARGEMENT PREMIERE IMAGE * D RR e L e e = R S E]nad_degfifi[“IHflEEl,FIl”.Eflrrtflmpfl”*} adr ligne¥=adr tampons ATARI MAGATIME BEST OF GRA BASIC ddr copies=apdicr* FOR 1%=1 TO 200 BMOVE adr ligne%,adr copie%, 160 ADD adrT igne%1,60 ; ADD adr copies32,0 NEXT 1% i Lo e e m ETE R A Wl el R R W R - * CHARGEMENT SECONDE IMAGE * L r d e e d d d e A A R @load degas({“IMAGEZ.PI1”,adr tampon¥) adr_1ignef=adr tampon¥ adr coplgk=adr pics+le0 FOR 1%=1 TO Z0 BMOYE adr lignes,adr copies, 160 ADD adr1 1gne%16,0 ADD- adr copies, 320 NEXT 1% i Bl E W e e o W W W R R W * * CHARGEMEWT TROTSIEME IMAGE * | e d e e e kA e d e d e e e e e r d é E Éload degas( “IMAGE3.PI1”,adr tampons) ddr |1gne%=-adr tampon% | adr copies=adr pich+64000 FOR- 1=1 TO 200 BMOVE adr _ ligne%,adr copie%, 160 ADD adr ligne%,l60 ADD adr copies,s20 NEKT 1% l' S e r E e L L e E ' # CHARGEMENT QUATRIEME IMAGE * | xRk A A A A A AR TR A A AT AN AT ANk Bload degas(“IMAGE4.PI1t”a,mpaodntr) ädr ligne%=adr tampon% ädr copiessadr pic&+b4000+160 FOR 1%-1 TD 200 BMOVE adr ligne%,adr copie%, 160 ADD adr ligne%,160 ADD adr copief32,0 NEXT 1% UEU AAR E R A d e d PE itk INITIALISATION DE LA Ly * * FENETRE DE VISUALISATION * D ONÉTTAT E RRRÈ RA eA eE eE d E SETMOUSE 160, 100 MOUSE XiVf é, K,M @fixe ecran(xm®, ym®) XU SM I oA AR AR A Ay Akttt * Æ BOUCLE PRINCIPALE * I RÉÉARHAXEREEE RE RRd oo Lo MOUSE 0w, yis , ki EXIT IF ([xmi=⇐x0%) OB {ym&⇐yl%) EXIT IF kmis⇒{ LOOP EXIT IF kmés==0 Bfixe ecran(xms,ymé) x0é =xn - VOFS@ YMFs LOUF | VR S ÉÉÉ R TPEe RN !* REINITIALISATION DE L'ECRAN * | *#H:Ttt*t#*t:‘::‘.”‘:’ SPOKE RHFEFBPES,0 SPOKE &HFF870F,0 VOID XBIOS(5,L:-1.L:adr sauve%,-1) VSYNC VOID MFREEÇadr pic#) VOID MFREE(adr_tampons) SHOWM | END | Spde e g gk o ok e e e ey e ol o o ol ol ' * MODIFICATION POSITION * se ECRAN VIRTUEL # | RRRERERTATEARETEANETETETEEFEEX PROCEDURE fixe ecran(px*,py#) LOCAL offset pixel* LOCAL adr phys LOCAL offset lignes LOCAL adr ligne% ädr Tigne*=adr pic&+py*320 offset pixel%-px% MOD 16 adr_phïsä=adr_1îgneäü[p:ä DIV 15)#8 IF offset pixel%eD offset lignes=80 ELSE offset ligne%=76 ENDIF VOID XBIOS(5,L:-1,L:adr phys%,-1) VS5YNC SPOKE BHFF8Zb5 ,offset pixel% SPÔKE BHFFBZOF,of fset Tignes RETURN [ Wy A A A e e o i e A “ # CHARGEMENT IMAGE * v DEGAS ELITE 5 D RESREF PROCEDURE load degas{nom},adrs) LOCAL pal$ pal$=5PACE4{32) OPEN “i”.,#1,noms SEEK: #1,2 . BGET #1,VARPTR(pal#),32 ATARI MAGAZINE fi BEST OF GRA BASIC VOID XB105(6,L:VARPTR(pal#}) BGET #1,adr%,32000 CLOSE #l RETURN L’ucilisation d'une mémoire tampon pour le chargement des images permet d’éviter leur affichage à l’écran. Le tampon prend 32000 octets de mémoire. Pour éviter cela, on peut écrire une routine qui cha;rgi: directement une irflfägü‘. lJegas Etite dans l'écran campon, PROCEDURE charge degas(nomÿ,adr images) LOCAL pall LOCAL Tigne%,adr lignes pal §=SPACES(32) OPEN “i”,#1,nomf SEEK #1,7 BGET #1,VARPTR(pal#),32 VOID XBIOS(6,L:VARPTR(pa15}} adr ligne%=adr images FOR Tigne%=1 TO 200 BGET #1,adr 11gne%, 160 ADD adr 1igne%,320 MEXT ligne* CLOSE #1l HEXT ligne* Le Eîu:LrE;EmEnt des 'i,m:l,#!;i dans l’écran wirtuel ec maintenant Leaucoup plus facile à programmer. Ëcharge_fiegaa[“IHAüEl.PII”,adr…pic%} ëcharge_degaEE”IHAEEE.PII“,adr_pic%+lfiD] Ücharge_degaaf“îflflü[a.Pll”.adr;picä+33ÛÜÜ} @charge dégas(“IMAGES.PIL” ,adr pick+3Z160) Artention: la routine écharge degas est une routine spécifique qui ñe fonctionne qu'avec un écran virtuel d’une largeur de 640 pixels (320 octers de large). Pour avoir une routiné fonctionñnant avec un autré écran virtuel, 1l faut modifier la ligne ADD ade 13 gnes, 320 en tonant compte de la largueur du nouvel écran. Déplacement souris sur un écran virtuel de taille quelconque F . 1 ! . i e E Les déplacements de là fénêtre de visualisation étant liés aux déplace- ! - = . b .\. ments de la souris, la dernière ligne et la dérnière colonne de l'écran virtuel ne sont jamais affichés par le programmé, On ne peur utiliser | le système précédent que pour un écran de 639×359 pixels. Pour déplacer la fenêtre de visualisation avec la buris sur un écran virtue! de raille quelconque (mais supérieur à l'écran visible), 1l faut gérer la souris de manière differente. La position X de la souris varie entre 0 ot 319, et la position Ÿ varie entre O et 199 pixels. Pour obtenir un déplacement sur un écran de ‘dimension quelconque, if ne faut pas renir compte des déplacements absolus de la souris, mais des déplacements relatifs. Pour obtéñir un déplacement relatif, il faut positionner la souris à un emplacement orécis de l’écran et attendré que sa position change. La valeur du deplacement relatif est la différence entre la nouvelle position de la souris et sa position initiale, Dès que lc déplacement relatif est caleu- |, le programme doit repositionner la souris sur sa pesition initialé. Après un déplacement souris, le programme doit caleuler la nouvelle position de la fenêtre de visualisation. Ce calcul est effectue en additdonnant le déplacement relatif avec la position courante de ls fenétre de visualisation. Tl peut arriver que le çaleul du déplacement donne des coordonnées en dehors de l'écran. Pour éviter cela, le programme doit exercer un contrôle sur les coordonnées de la fenêtre. Lec variables xmax$ et ymax% contiennent les positions extrêmes de la fenêtre. Les positions minimales sont (0,0). xinax#=320 vmaxés=200 SETMOUSE 160,100 xaffr=-100 vaff==100 @fixe ecran(xafyfaféfs,) i Do | kkdxeddR WA AR TRk RN E ! * ATTENTE ACTION SOURIS * I #HF AAAARÉÉRRaNNVAÉRRÉÉ oo MOUSE e , v, ks EXIT IF (xmé⇐160) OR (ymé⇐100) EXIT IF kmé=e=0 LOQP EXTT IF kmfe==0. i | ek hE Al E R RR R ettt | * CALEUL POSITION X FEMETRE ” P ORF T E TR R R e LF =160 dx*=xmé-160 ADD xaff=,dx% IF xaff#=0 xaff*=0 ENOTF IF xaffa=xmax= xaff#=xmaxt ENDIF ENDIF P e e i o b e bl e b e e E E E e “% CALCUL POSITION Y FENETRE * E E E E E E ARV GR A SRR A LF ymée=100 dyf=yms-100 ADD vaff*,dy4 IF yaff==<l vaftæ=l ENDIF IF vaffs=ymaxt ATARI MAGALINE m BEST OF GRA BASIC yaffi=ymaxs ENDIF ENDIF SETMQUSE 160,100 @fixe ecran(xaffs,yatF*) LOOF Éémarque‘ en modifiant les valeurs de Imh'iti{m extrèmes de la sou- TIS, ON peut limiter le 5r.m|]1'flg à une zone prél:'ls: de l'écran virtuel, Cela peur être utile dans certaines applications, L'exemple suivant li mité les déplacements de la fenêtre de visualisation entre les coordonnees (50,50) et (200,150). xmin#=50 ymin%=50 xmax%=200 ymax#=150 ‘ 1F xaffs<xmins xafft-xmin® ENDIF IF xaff#=xmaxs xaff%=xmax EMDLF 1F vaffä<ymins yaoff==ymins ENDIF IF vaîf%=vmaxt vatTa=ymaxs ENDIF Taille des écrans virtuels La place mémoire prise par les écrans virtuels croit rapidement en fonction de leurs tailles. Un écran virtuel de 2×2 images prend 128 Ko, Un écran de 354 images prend 288 Ko. La taille d'un écran vircuel doit correspondre à oertaines conditions: elle doit être supérienre ou égal à la taille d’un écran normal et la largueur de l’écran coit être un mulriple de 16. Par exemple, On peur créer un écran virtuel de 592×257 pixels. Une largueur de 592 pixels correspond à 37 blocs de 16 pixels. Les lignes de cec écran ont une taille de 296 octets {un bloc de 16 pixels = 5 oetets}. La taille mémoire de l'écran t de 296×257 octets, soit F6072 Pour finir Maintenant que vous savez gérér les 4096 couleurs et le scrolling hard du STF, vous pouvez réaliser des programmes intéressants et de superbes démos Envoyez-nous vos réalisations, ATAR| MACAZIMNE m BEST OF GFA BASIC ST, 11, FALCON et le r Abonnez branché vous 4 este Start Micro Mugulll‘le Chaque mois: « des infos, + des tests, desconseils, « des initiations, J 1 disquette pleine de | programmes, d'images, de sons, efrc. Wotre abonnement vous donne accès à “3615 MICROHELP” Wotre abonnement vous procurera des réductions intéressantes sur le téléchargement et l’achat de disquettes de logiciels du domaine public vutre abonnement vous fera bénéficier de tarifs promotionnels sur certains logiciels du commerce Ahnn nez- vous et économisez immédiatement 80 F Bulletin d'abonnement page 130 GRAPHISME EN GFA BASIC Faites flasher vos écrans Les effets vidéo permettent d'agrémenter vos applications graphiques et vos jeux. Nous vous proposons quelques conseils et explications pour bien en comprendre le fonctionnement. Instruction BMOVE Elle permet de copier très rapidement une zone mémoire (environ 16€0 ko à la seconde). On l'urilise surtour pour les applications graphiques. BMOVE adr org, adr dest, nb octets, adr org : adresse de la zone mémoire d'origine, adr dest : adresse de la zone mémoire de destinalion, nb octets : nombre d'octets à copier. Structure mémoire de l'écran ST L'écran du 5T a une taille de 32000 octets. Le codage des informations graphiques est différent selon le mode graphique utilisé La basse résolution est organisée en 200 lignes de 320 pixels avec 16 couleurs possiblés par pixel. Chaque ligne à tne taille de 160 oetets. Un octet contient donc la représentation binairé de 2 puxels, C'est le mode graphique le plus utilisé pour les jeux. Les programmes donnés cn exemple dans cet article sont prévus pour la basse résolution. La moyente résolution est organisée en 200 lignes de 640 pixels avec 4 couleurs par pixel. Les lignes font toujours 160 pixels, mais yn octer contient la représentation binaire de 4 pixels. C'est un mode graphique rarement utilisé pour les jeux. Il sert pour les applications professionnelles réalisées par les vtilisateurs qui n'ont pas de meori teur monochrome haure résolution. La haute résolution fait 400 lignes de 640 pixels en deux couleurs. Les lignes ont une taille de 80 octets. Un octer contient la représentation binaire de & pixels. Ce modé graphique nécessite un moniteur monochrome de haute performance. La plupart des appheations professionnelles utilisent la haute résolution. Manipulation de l'écran avec BMOVE L'instruétion BMOVE permet de copier des blocs de mémoire et donc ! L ” ë P des parties de l'écran. On peut copier le contenu de l'écran en mémoire et ensuite le reatfiéher. 1 dc d d d d d e d d E ! # SAUVEGARDE DE L'ECRAN EN MEMOIRE * I RRN E e d d E LD RE adr tampon# = MALLOC{32000) |RESERVATION MEMOIRE BMOVE XB10S(2),adr tampon%,32000 !COPIE ECRAN MEMOIRE cLS 1EFFACEMENT ECRAN VOID INP(2) LATTENTE CLAVIER BMOVE adr tamnon&,XEI0$(2},32000 !AFFICHAGE ECHAN vo1D INP(2) LATTENTE CLAVIER VOID MFREE(adr tampon#) | LIBERATION MEMOIRE Certe technique fonctionne dans toutes les réolutions du ST. La foncrion «File select» et les boîtes d'alerte utilisent cenre méthode (en fait, élles ne sauvent pas toute l'image, mais sculement la partie mocifiée), Manipulation des lignes En faisant des manipulations graphiques des lignes, on obrient des effets intéressants. Il faur connaître l'adresse des lignes pour pouvoir les copier grace à BMOVE Le numéro des lignes varie entre O et 199 pour la basse et la moyenne rétolution, et entre O et 358 pour la haute résolution. Adresse d'une ligne Adr 1igne = Adr ecran+Ligne*Taille ligne Basse résolution: Adr Tigne = XBIDS(2)+1igne*160 Movenne résolution: Adr Tigne = XBI05(2)+1igne*160 Haure résolution: Adr ligne = KBIOS{2Z)+1igne*B0 Exemple simple On peut faire un petit programme qui copie la première ligne d'un écran sur tout l'écran. PROCEQURE copie ligne LOCAL adr lignels LOCAL adr copie% LOCAL ligne copie% ATARI MAGAZINE H BEST OF GPA BASIC adr Tigne(s = XETO5 (2) IADR LIGNE À COPIER FOR ligne copies = 1 TO 199 adr copie% = XBIOS(2}+1igne copiex*160 [ADR LIGHE EMUVE adr lignel®, adr copie#, L60 ICOPIE NEXT ligne copie* RETURN Amélioration de l'exemple Au lieu de copier une seule ligne, on peut en copier plusieurs à la fois, Pour cet exemple, on divise l'écran en 20 bandes de 10 lignes Flles sont numérotées de 0 à 19, La routine copie la bande D sur les autres bandes, PROCEDURE copie bande LOCAL adr orgs LOCAL adr copiet ! ADKESSE BANDE O - adr org® = XBIDS{Z) FOR bande copies - 1 TO 19 ! CALCUL ADRESSE BANDE 2 adr copie% = XBI0S(2)+10*bande copie%*160 ' COPIE BANDE 1 SUR. BANDE 2 EMOVE adr org&, adr copiex, 1600 NEXT bande copie RETLIRN Utilisation de plusieurs écrans en mémoire Ces petits programmes sont amusants, mais peu utiles. En revanche, l'intérêt est de réaliser des affichages à partir d'un où pluseurs corans stochés en mémoire. La place mémaire est reservée avec l'inscruction MALLOC. La routine load degas permet de charger une image Deges Elte à n'importe quelle adresse en mémoire On peut réaliser toures sortes d'effers comme l'affichage rapide d'une image, l'affichage à partir du haut où du bas de l'écran, l'inversion d'une image, l'allichage à partir du centré où des bords, ete. Il faut tenir compte de l’adresse des écrans dans le calcul des adresses des lignes. L'adresse de base de Pécran physique (celui qui est wisible sur le moniteur de l'ordinateur), est fournie par la fonction XBI05(2). Il ne faut surtour pas se tromper au n veau des adresses de base des écrans. Affichage rapide d’une image La technique la plus simple pour afficher rapidement une image est de la charger dans une mémoiré tarmpon, puis de la copier sur l'écran avec EMOVE Frant donne la vitesse de EMOVE, l'affichage est instantané pour l’utilisaveur (en fait, il prend à peu près 20 millisecondes). Âvec une routine de chargement directement en mémoire, l'atfichage et lent et saccadé. Affichage à partir du bas de l'écran Pour afficher une image à partir du bas de l'écran, il suffic de la charger dans uné mémoire tampon, puis d'afficher les lignes les unes après les auttes de la ligne 199 à la ligne 2, La routine aff bas du programmé d'exemple montre que cette méthode est trés simple à programmier. Affichage à partir du haut de l'écran Pour afficher une image À parcir du haut de l'ééran, il suthe de la charger dans une mémoire tampon, puis d’afficher les lignes les unes après les autrés de la ligne O à la ligne 199. La routine aff haut du programme d'exemple fonctionne sur ce principe, Affichage à partir du centre de l'écran Pour afficher une image stockee dans la mémoire sur l'écran & partir du centre, il faut afficher d'abord les lignes 99 ec 100, puis les lignes 98 et 101, et ainsi de suite jusqu'aux hgnes 0 e 199. L'effer est amusant. La rourine aff_mil ieu du programme en exemple urilise cette téchniqué, Affichage à partir des bords de l'écran Certe méthode est l’inverse de la précédente. T faut d'abord atficher les lignes C et 199, puis 1 et 198, pour arriver finalement aux lignes 99 et 100. La routine af f bord illustre cette rechnique. Affichage aléatoire , Cette méthode consiste à afficher les lignes d'une rmage dans un ordre aléaroire. Le numéro de la ligne à afficher est déterminé par “ une fonction aldatoire. Il faut tenir compté des lignes déja-affichées pour éviter de les réafficher. La solution la plus simple est d'ntiliser un tableau ne contenant que des @. Chaque fois qu’une ligne est affichée, on met Pindice du tableau correspondant à 1. Pour chercher une ligne non affichée, il suffit de lire le tableau à la recherche d'un nombræ 0. La routiné aff aléatoire du programme d'exemple montre une téalisation de cette technique Cerre routine utilise un tableau tst Tigne% pour la gestion des lignes. Elle fait un affichage ligne à ligne, mais on peut la modifier afin de travailler sur des blocs de hgnes. L'affichage de l'image se fera plus vite puisqu'il ¥ aura mouns d'étapes d'affichage Le rableau tst ligne prendra aussi moins de place [économie de mémoiré), Inversion verticale d'une image Pour inverser verticalement une image, 1l suffit de la recopier en inversant la position des lignes. La ligne © devient la ligne 199, la ligne 1 devient la ligne 198, la ligne 2 devient la ligne 197, … la ligne 199 devient là ligne 0. La routine inversion ecrän inverse l'image de l'écran physique &t stocke le résultat dans une image tampon. Une fois l'inversion terminée, elle donne le résultat en le recopiant rapidement sur Pécran physique Scrolling vertical d'une image Pour faire seroller une image sur une zone d'écran de hauteur h, il faut copier le bloc de lignes de hauteur hä partic de la ligne O de l'i- ATARI MACAZINE m BEST OF GFA BASIC mage, puis à partir de la ligne 1 de l'image, etc. La superposition rapide des blocs donnera l'impression d'un mouvement. En affichant l'image en bas de l'écran, on arrive à faire séroller un bloc de 100 ligm:s de haut d'une manière parfaite sans la moindre «bavures vidéo. La routine scroll du programme d’exemple fait d'abord uñ scrolling vers le bas, puis vers le haur. Programmes d'exemples Les rourines d’affichages ont êté réalisées en GRA Basc 303, Les exemples utilisent deux images Depas Efite chargees én mémoire au début du programme. Le choix des images se fait grâce au sélecteur de fichiers. Problèmes de synchronisation vidéo et instruction VSYNC L'image affichée par un moniteur vidéo n’est pas une image fixe. En fait, c'est un spot vidéo unique qui sé déplace & grande vitesse pour dessiner l'image. Ce spor balaie l'écran 50 fois par seconde (en terme technique, on dir que l'écran est rafraichi à 50 Hz). Donc, 50 fois par seconde, le système d'affichage parcourt la mémoire vidéo du débur à la fin (soit 32000 octets). Entre chaque balayage widéo, il ÿ à un petit temps mort {le temps dé balayage est de 16 millisecondes, et le cemps entre deux balayages de 4 milliseconces). Lors de l'affichage d'un objet sur l'écran, celui-ci se mer parfois à clignoter, l'objer peut disparaître en partie, une barre horizontale peut apparaître, l'affichage peur êcre légérement brouillé, crz Ces eflers parasites viennent d'une interférence encre le E}OEtëme !:l’:lFHf:hà[;& st la routine graphique. 51 le programme modifie une donnée de la mémoire écran au moment où le système d'affichage envoie cette donnée sur l'écran, il se produit une perturbation graphique. Pour éviter ce probléme, 1 faur travailler pem:l.fl.nt le temps libre entre chaque balayage vidéo. La fonction Vsync arrête le déroulement du programme pendant le balayage vidéo. Après l’'instruction Vsyne le programme dispose d'un temps très court pour faire un affichage graphique sans craindre de problème vidéo, Travail en bas de l'écran Le spot se déplace sur l'écran à une vitesse bien définie. Après un Vsync, on dispose de peu de temps pour faire un affichage sans parasite vidéo en haur de l’écran. En revanche, le temps disponible pour afficher quelque chose vers le bas de l'écran est plus important, puisqu'on dispose du temps entre deux balayages vidéo, plus le temps pris par le système d'affichage pour arrivér en bas de Pécran. La rourine de scrolling travaille en bas de l'écran pour profiter de ce remps supplémentaire. Remoncez la position d'athchage, et vous verrez apparaître une barre de sjït'l::l‘l.t'üf:iätiüll. La vitesse de rafraîchissement vidéo est de 50 Hz pour tous les moniseurs couleur et de 70 Hz pour le moniteur monochrome Atari. POUR TOUTES QUESTIONS, TAPEZ 3615 ATARI | VRI TTAAARÉEEEARRETTNAAETREÉ RERR A 4 ; w * * EFFETS GRAPHIQUES AVEC FONCTLON BMOVE * L * “ L RHN A RR E I RRF A S E AARR E E E EAARR E * * (C) 1990 Patrick Leclercq & ATARI MAGAZINE * I RR E FN A N R e e T d e d e e e e e S R S e N R E E ' # Programmation en GFA BASIC 3.03 * | Ah E R R RR e E R R d e A A E RESERVE 50000 | RESERVATION MEMOIRE POUR BASIC OIM tst_îîgne%{Eüü] ITABLEAU POUR AFFICHAGE ALEATOIRE imagel%-MALLOC(32000) RESERVATION MEMOIRE image?%=MALLOC(32000) RESERVATION MEMOIRE image travail%=MALLOC(32000)! RESERVATION MEMOIRE Émain VOID MFREE(image travail#} ! LIBERATION MEMOIRE VOID MFREE{imagess) ! LIBERATION MEMOIRE VOID MFREE{imagel%) ! LIBGERATION MEMOTRE END | FIN DU PROGRAMME ——s d P EN TATARRERÉÉÉTÉ ÉÉÉ E E A R ETE ETE EN E * # ATTENTE D'UN EVENEMENT CLAVIER * I AR AAARA ATR AE NARA bEkEt kEi RRR PROCEDURE att clavier VOID INP(2) RETURN L é A Al R e e C de de e e R Me e ! = CHARGEMENT D'UNE IMAGE DEGAS ELITE EN MEMOIRE * | xFh haÈRARHARERÉAAARRR AN NN RE EN ÉÉ E RR RESRE PROCEDURE load degas(nom$,adr“) LOCAL palé pal$=SPACE%(32) OPEN “i”,#99,nomt SEEX #99,2 BGET #99,VARPTR(0al$},32 VOID XBI05(6,L:VARPTR{pal#)) BGET #99 ,adr*,32000 CLOSE #99 RETURN I t#*fl*itfl!!t*fl*tk*t!!tti*ttfiiiiztfififl !* COPIE D'UNE LIGNE D'UN FCRAN SUR UN AUTRE * 1 e nn e d e d e e r e R e e e r e R e é r e e e e d e D d PROCEDURE copie ligne(l1l%,adr_imgl%,12%,adr_img2%) LOCAL adr14 LOCAL adr£% ATARI MAGAZIME m BEST OF GFA BASIC adrl®=adr imagels+115%*160 ! ADRESSE DE.LA LIGNE 1 adréf=adr imagee=+12#*160 ! ADRESSE DE LA LIGNE 2 BMOYE adrl%,adr2%,160 RETURN ! COPLE LIGNE 1 SUR LIGNE Z | ek E o e ol o e o e e e e o e e e e e e e e n S l e ! * AFFICHAGE D'UN BLOCK DE LIGNES SUR L'ECRAN * | oo ot o g ok v v o e e e e o o o e ok AN E e d o ok b o e e e E S R RE PROCEDURE aff_h1uck{1lä,nïä.adr_imglä,ïE%,adr_îmgä%} LOCAL adrl% LOCAL adrê% LOCAL taillet adrl%=]1%*160+adr imgl© adr2%=12%*160+adr img2' tailles=nbl*”150 | ADRESSE BL@C 1 | ADRESSE ELOC 2 ! TAILLE DU BLOC VSYNC ! ATTENTE SYNCHRO VIDEU EMOVE adrl%,adr2%,tailles ! COPIE DU BLOLC RETURN I ok hk bk E A A RE AN NN N R E i v o e e o É e e o ol i ol i ol ol ol e e o * # AFFICHAGE DE L'IMAGE A PARTIR DU BAS DE L'ECKAN * 1 d dc e e e d e d e e e e e e d e e E e A S r E e d e é n d e e e d e PROCEDURE aff bas(adr_image*} LOCAL ligne*# FOR ligne*=199 TO D STEP -1 VSYNC @EÜPÎE_ÏîgnE{lîgnE%.ûdfi_ÎMEgEÈ.ÎîgnE%,ïHIüE[E}} NEXT ligne% RETURN [ i e e L é é è e e e T e s T TSR e L é e r e b | * AFFICHAGE DE L'IMAGE A PARTIR DU HAUT DE L'ECRAN * T T o E e d e e r e e e d e e D A S ol DEDE PROCEDURE aff haut(adr image%) LOCAL Tignes i FOR ligne%=0 10 190 VSYNC @copie ligne{ligne%,adr image%,]igned,XB10S(2)) MEXT ligne* RETLIRN I e d ércépércdr r drar d 06 d RR RE E É RE É E A d A E A A R A E d E E A R E E R E ' # AFFICHAGE IMAGE A PARTIR DU MILIEU DE L'ECRAN * E rrn d e e d e e r e e e e e e e A r e d E PROCEDURE aff milieu(adr image*) LOCAL lignel% LOCAL lignez# LOCAL 1% lignel*=99 lignez%=100 FOR %=1 TO 100 VSYNC @capîe_ïîgne{1îgnel%.adr_1mage%,11gne1%.ïHIDS[E}} @cüpîg_11gne{1ignefiä.aür_îmmge%,î1gneE%.1BIü5[E}} DEC lignel5 INC lignez* , NEXT 1% RETURN | e lenle ool É E E e el R R ! # AFFICHAGE IMAGE * T T T e e ba bbb 5 3t PROCEDURE aff_hflrdziafir_jmage%} LOCAL lignel% LOCAL lignee* LOCAL 1% lignel%=0 ligne:*=199 FOR i%=1 TO 100 VSYNC @cüpîe_jigne[ligflelä.adr_?m&ge%.Iigflelä.ïEIÜSEE]] Écopie ligne(lignez%,adr image%,lignez*,XBI0S(2)) INC lignel®% DEC Tigne?¥% NEXT 1% RETURN 1 R ab é 5 i UR A E E i ok r e e e o e e o r e v o | * AFFICHAGE ALEATOIRE D'UNE IMAGE * | e e T P e R R d R R e RE PROCEDURE aff aleatoire(adr image%) LOCAL Tigne% LOCAL i% FOR i%=0 TO 199 ! INIT TABLEAL DE LIGNES AFFICHES tst ligne“(i#)=0 NEXT 1% FOR i%=1 TO 200 REPEAT | RECHERCHE D'UNE LIGNE NON AFFICHE lione&=RANDOM(200) UNTIL tst lignes{(ligne%)=0 tst ligne%{ligne#)=1 ! MARQUAGE LIGNE Écopie ligne(ligne%,adr image%,ligne%,XBIOS(2)) NEXT i% — RETURN ATARI MAGAZIME H BEST OF GFA BASIC | kxR dandd bbb AT Er d e d e e e e r I E ' # INYERSION COMPLETE DE L'ECRAN * | HEFN NNN E TRk il É E PROCEDURE inversion écran LOCAL lignel% LOCAL ligne?% L} ligne=%=199 FOR lignel%=0 TO 199 Bcopie ligne(lignel%,XBI0S(2),] 1gned%, image travail%) DEC Tigne2% NEXT lionel® VSYNC BMOVE image travail*,XBI05(2),32000 RETURN 1 EHAETANTbE EeE E E2 E A “ # ROUTINE DE SCROLLING #* D o e i o o TRN R e e R PROCEDURE scroll(adr image%) LOCAL ligne* FOR ligne%=0 TO 100 STEP 1 aff*hlnck[iigne%.lflfl,adr_imagE%,lflfl.EEIGS{E}} NEXT lignet FOR ligne&=100 TO 0 STEP — @aff block{lignes,100,adr_image%,100,XE105(2)) NEXT ligne% RETURN | ÆE TRATRÉE Rl bWk VR E A A E ! # DEMONSTRATION DU SCROLLING * I MPE RERA RE RRN E R PROCEDURE demo scroll(adr image%) LOCAL i% FOR i%=1 TO 2 éscroll(àdr imâge*) NEXT 1% RETURN — FROCEDURE demo graph Baff haut{imagels) Batt clavier Gaff haut(image2%) @att clavier Baff bas(imagels) @att clavier Paff bas(image2*) @att clavier gaff bords{imagels) fatt clavier Paff bords(image2*) Gatt clavier Gaff milieu(imagel*) Batt clavier Baff milieu(image?%) Patt clavier Binversion scran Batt clavier @inversion écran datt clavier gaff aleatoire(imagels) att clavier Paff aleatoire({mage25) @att clavier éscroll(imagel#) Batt clavier @scroll (image#*! Batt clavier RETURN | VRShRR | # ROUTINE PRINCIPALE * I xR RR RRR E v PR T E PROCEDURE main LOCAL fond$ LOCAL f2$ FILESELECT ”=.PI1“,” “,fonds ! SAISIF NOM IMAGE @load degas(fondS,imagel&} | CHARGEMENT IMAGE FILESELECT “*.PI1”,” “F2S @load degas{f2$, imageë*) Batt clavier Bdemo graph 1 RETURN SI VOUS N'AVEZ PAS LE COURAGE DE TAPER TOUS LES LISTINGS, COMMANDEZ LA DISQUETTE BEST OF GFA BASIC AVEC LES IMAGES AU PRIX DE 70 F SEULEMENT. Ban de commeande en poges 5Û ATARI MAGAZINE m BEST OF GFA BASIC - - GRAPHISME EN GFA BA_'SIC 1096 IMAGES UNE DISQUETTE Economisez de la place mémoire Les images des jeux d’arcades sont construites à partir d'élements graphiques collés les uns contre les autres, codant ainsi une image écran en quelques centaines d'octets. es éléments dépendent du typé de décor. Pour dessiner un temple (sujet classique des jeux d'arcades/aventures), il fauc des colonnes, des murs, des symboles bizarres, des portes, des éléments de décors, etc. Les colonnes peuvent être conçues de plusieurs déments: un socle de base, un élément intermédiaire et un élément terminal. Pour dessiner une colonne à un endroit quel- “ conque, il faut d'abard mettre le socle, puis un ou deux éléments intermédiaires avant de mettre l’'élément terminal. La taille de la colon ne n'est déterminée que par le nombre d'éléments intermédiairés. Âvwec les mêmes éléments de base, on peut avoir de grandes ou de toutes petites colonnes. Pour dessiner les murs, trois ou quatre éléments différents suffisent. En les alternant, on peut créer un mur tout à feit valable. Pour rompre la monotonie, on peut aussi insérer des éléments de décors comme des vases, des autels ou des dessins étranges reproduisant les traits d’une divinité quelconque On peut dessiner un temple avec environ 40 éléments graphiques de base. Is peuvent être utilisés pour dessiner plusieurs salles du temple. Construction d'images en GFA Basic Avant tout, il faut définir la taille des éléments graphiques et la raille des images construites. Cet article ne traité que de la basse résolution (320×200 pixels en 16 couleurs). | C'est la résolution la plus ucilisée, aussi bien pour les jeux que pour le graphisme pur. Les éléments font 16×16 pixels. Ce n'est pas une obligation, mais c'est devenu une norme de fécto. 11 suffit de regarder les images des jeux d'arcades pour en être convaincu. Avec 18×10 éléments, on obtient une image de 288×160 pixels. C'est un format assez courant. Pour obtenir une image prenant pratiquement tout l’écran, il faut utiliser un format de 20×12 éléments (320×192 pixels), mais il vaut mieux laisser de l'espace pour athcher différents intervenants (décors divers, scores, nom du logiciel, * nombre de vies, éle.) En prenant des éléments de 1620 pixels, on peut couvrir entitrement l'écran avéc un format de 20×17 cases, T;:lilln d'un élément graphique Un élément de 16×16 pixels (basse résolution) stocke dans une væ riable alphanumérique prend 134 octets, La place mémoiré nécessaire pour 256 cléments est de 34304 octets. (e e 05e d e e e d n E A e e d é d d e d d e * * CALCUL DE LA TAILLE MEMOIRE * ” # D'UN ELEMENT DE lbxl6 PIXELS * 1 VR i R W E o o e e R É GET 1,1,16,16,var} GET 1,1.16,16,var} PRINT LEN{vari) Stockage des éléments en mémoire Les instructions graphiques du (GEA Basie (PUT et GET) stockent les données praphiques dans des variables alphanumériques. Les éléments graphiques sont donc stockes dans un tableau alphanumériqué. Une variable nb_élements® perme: de connaitre le nombre d'éléments en mémoire, DIM element${256) nb_elements==U Pour éviter de perdre de la plact en mémoire, les tableaux commencent à l’indice 1 erâce à Pinstruction OFTION BASE L Sauvegarde avec l’instruction STORE À prémière vue, la rechnique de sauvegarde la plus simplé serait d'utiliser l'instruction STORE qui permet dé sauver un tableau alphanumérique avec une seule instruction. Mais cette méthode ne fonctionne pas toujours correctement. L'instruction STORE utilise les codes de contrôles 10, 11 et 27 pour repérer les fins de lignes et la fin du fichier, Lorsque ces codes sont présents dans une chaîne alphanumérique (ce qui arrive souvent avec des données graphiques), l'instruction RECALL qui doit recharger le tabléäu s2 trompe de ATARI MAGAZINE RM BEST OF GFA BASIC repére er charge les lignes n’importe comment. En résumé, STORE n'est efficace que pour sauver des textes ASCIT normaux (codes commençant à 32). Sauvegarde avec l'instruction BPUT L'instrucrion BPUT permer de sauver une zone de mémoire dans un fichier. Grâce à cette instruction, on peut sauver les éléments graphiques les uns derrière les autres dans un fichier. La procedure Save element(nom$) du programme GEN_IMGS utilise ce système, Elle sauve au début du fichier la palette de couleurs des éléments. Les donndes graphiques sont relues avec Pinstruction BGET qui permet de lire des données à partir d'un fichier. La procédure Load element (nomf) du programme AFF IMES fonctionne de cette manière. Stockage des images en mémoire Pour mémoriser une image, il faut un tableau de 18×10 éléments, 5% y a moins de 256 éléments, ils peuvent être codés sur des octets (symbole |}, Une image prend alors 18×10 octers =180 octets. On peur avoir 720×1024/180 images sor une disqueute, soit 4096 images. DIM images/|(10,18,10) Le tableau images | () peut contenir 10 images. Clest un chiffre auss: valable qu’un autre pour un programme de démonstration, mais céla peut tour aussi bien être 50, DIM images|(50, 18,10) Le GEA Basic ne peut pas manipuler des tableaux de raille supérieure à 32 Ko. Le rableau image|() ne peut donc contenir plus de 177 images (32000/180). I est possible de les répartir sur plusieurs tableaux. Si l y a plus de 256 éléments possibles, on peut les coder avec des entiers courts (16 bitssymbole 6. I1 peut alors y avoir 63536 éléments différents. Le codage d'une image prend 360 oecrets {18x10x2}. On peut avoir 720×1024/360 images sur unc disquette, soit 2048 1mages. L DIM images&(10, 18,10) [ ne peut y avour plus de 90 images dans le tableau images&() à cause de la limitation de 32 K6 pour un tableau. Il faut donc stocker les images sur plusieurs tableaux. Affichage d'une image Pour afficher une image, il faut afficher chaque élément graphique à sa place. La procédure Aff_image() affiche l'image num_image* à partir de la position graphique (pos _x0%,pos_y0%). On peut alfi chér une image à n'importe quel endroit de l'écran. Les vanables pxs et pyk contiennent la position d’affichage de l'élément courant. Après l'affichage de chaque élément, on incrémente px de 16 pixels. De même après l’affichage d'une ligne, on incrémente py% de 16 pixels. ATARI MAGAZINE | A EEEkEARRAANAAFARARAAAAN E AR h kbR R R RE RE E ! * AFFICHAGE IMAGE num image% A LA POSITION 3 | * (pos x0*,pos yD%) * I RRN d d e d d e É A e e d RRN PROCEDURE Aff image (num_image®) LOCAL 1x%,144 LOCAL px*,py | INIT POS X IMAGE py*=pos y0% I INIT PAS Ÿ IMAGE FOR iy%=1 T0 10 — ! BOUCLE DES LIGNES FOR ix%= 1'TO 18 ! BOUCLE DES CASES PUT px%, py%, imagés |(num îmage#, ix*, iv) pr%=pos_x0%- INC px%,10 I PASSAGE POS X SUIVANTE NEXT 1x* ! FIN BOUCLE CASE INC py+,16 1 PASSAGE LIGNE SUIYANTE pri=pos_x0% ! RETOUR DEBUT LIGNE NEAT 1y% | FIN BOUCLE LIGNES RETURN [ FIN ROUTINE Sauvegarde des images sur disque Le tableau contenant les images est sauvé grâce à la fonction Save tableau(). Certe fonction calcule l'adresse et la taille d'un tabléau d'octers avant de sauver le tout dans un fichier binaire, Les informations permettant de comprendre le codage des rableaux sont présentes dans le manuel du GE4 Basic 3.0 au chapitre «Vartables et gestion de la mémoires, La fonetion Save tableau n'est valable qué pour des tableaux d'octets. Pour sauver un aurre tvpe de tableay, il faut augmenter la raille mémoire des cases (1 octet pour un tableau d'octet, Z'octets pour un tableau d'entier court (&), 4 octets pour un tableau d'entier long (). Lecture des images à partir d'un disque Le rableau des images est chargé en mémoire avec la routine Load tableau qui relit un tableau sauvé avec la procédure Save tableau. Cétté rourine ne peut relire que des tableaux d’octets. Système de construction d'images complet Pour avoir un système de construction complet, il faut un ueiliraire de cr@tion des éléments graphiques, un utilitaire de «fabrications des images, et un système d'affichage- Les programmes GEN ELEM EDIT IMG et AFF_IMGS sont des utilitaires écrirs en GFA Basic 3,0. [Is remplissent chacun une fonction bien précise dans la «chaîne de fabrications des images. Programme GENELEM Ce programme est un convertisseur d'images. Il lit un ensemble d'éléments graphiques stockés sur des images au [ormat praphique Degas et génère un fichier binaire réutilisable par d'autres programmes. Les éléments graphiques de base sont dessinés avee le logicicl de dessin Degas Efite. Une fois fes images terminées, le program- BEST OF GRA BASIC meur stôcke la position de tous les éléments graphiques dans le programme GEN ELEM grâce à l'instruction DATA, Une tois lancé, le programme lit toures les images les unes après les autres, et génère le fichier d'éléments graphiques. Programme EDIT_IMG Cet urilitraire serc à «fabriquers les images. L'utilisageur peut l'employer pour les modifier à volonté 11 se présente sous la forme d’une carte avec un menu (sauvegarde des images sur disque, lecture d'un jeu d’images, sortic du programme) en bas à gauche, le dessin d’un élément à droite, et un numéro de carre compris entre 1 ec 10 affiché aussi à droité. Si l'utilisateur clique sur une case de l'image, l'élément de la case ct remplacé par l'élément courant. Cest ainsi qu’il est possible de placer n'importe quel élément à n'importe quelle position de l'image. L'éditeur permet de travailler sur 10 images à la fois, Le numéro de l’image courante est affiché en bas à droité de l’écran, Le programme peut être modifié pour travailler avec n'importe quel nombre d'images. Programme AFFIMGS Ce petit programme est une démonstration du système de construction des images, Il lit un fichier d'images et les atficke les unes après les autres. Pour obtenir un affichage rapide, ce programme utilise une astuce courante dans la programmation des jeux: Pimage est construité dans une image de travail situé en mémoire, Lorsque le dessin est terminé, on récopie l'image de travail sur l’écran, L'utilisateur à l’impression d’un affichage instantané, mais ce n'est qu'une 1k luston. B e e e i e v i e e r r e E e d e e e e r e e e e | # = = ! * GENERATION DU FICHIER D'ELEMERTS GRAPHIQUES 7 L + * M e E E E E E RE E T ue A A e A F E E E R I e d e E r E i Wk Rk e d é e e e Ak E AR * Programme, GEN ELEM * 25 o ki e v e kel o o e o p e r r E [ T ey e TP S e e s P L e R R R d e u e e e E * (C) 1990 Patrick Leclercq & ATARI MAGAZINE 7 d k e e p e r e e r e e e é e e e e e e e E E A d E E de é e d r T E E N E e e e S E E * Cet utilitaire génêre un fichier binaîre contenant |es “ éléments grephiques à partir du nôm d'une image DEGAS, “ ot de la liste des positions des éléments (stockées * dans des lignes de DATA). ' & e e é r d S e d SEN L LV RE R e e Ah A E VARIABLES GLOBALES : elament$() : Tableau contenant les éléments graphiques nb elementss : Nocbre éléments dans le tableau elements{) - nüä_'image.'li- : Nom image DEGAS contenant les éléments à lire * nom fichiert - Mom fichier contenant les éléments graphiques pal:elmentsi: palette de couleurs des éléments ATAR| MAGAZISIE RESERVE 50000 OPTION BASE 1 OIM element$(256) nb elementss=0 RESTORE | READ mom images ILECTURE OU MOM DE IMAGE A LIRE READ nom #ichiers ILECTURE NOM FICHIER BIMAIRE À GENERER flÏflflfldlEEü![flüm'iflfi'!]E“ 1LECTURE DE L'IMAGE DEGAS ELITE Blecture elements ILECTURE ELEMENTS GRAPHIQUES IMAGE Ésave elements{nom fichiers)[SAUVER DISQUE FICHIER ELEMENTS En — IFIN DU PROGRANME 1 RESERVATION DE MEMDIRE FOUR BASIC 1 LES TAREFAUX COMMENCERT A 1 | TARLEAU LES ELEMENTS GRAFHIQUES ! NOMBRE D'ELEMENTS DANS LE TAGLEAU i | dhhéthadvaaere aé dbala éek ' & LECTURE IMAGE DEGAS ELITE * I AERRAAE sk RE RE É b b L bR REN PROCEDURE Toad degas(noms) LOCAL pal$ i palÿ=eSPACE#(2) ! RESERVATION MEMOIRE FOUR PALETTE OPEN “j#1 ,n“omE | OUVERTURE DU FICEIER : SEEK #1.7 | ON EVITE L'INDICATEUR RESOLUTION BGET #1,VARPTR(pal$),32 | LECTURE DES 32 OCTETS DE PALETTE pal element$=pals | MEMORISATION PALETTE DES ELEMENTS VOID XEIOS(6,L:VARPTR{pal5)}1 MODIFICATION PALETTE SYSTEME EGET #1,X6105(7),27000 | LECTURE IMAGE CLOSE #l | FERMETURE DU FICHIER RETURN kAN R LR e e Rk T WA SE | # SAUVEGARDE DES ELEMENTS GRAPHIQUES * E B R E E E E E d 1 e e e E S R d e e e d e e É E E ! = FORMAT DU FICHIER GINATRE : n ' = — Palette couleur des éléments (32 octets); * — Kombre d'éléments du fichier (1 octet); ' * — Elément graphique 1 {134 octets); * ”% — Elément graphique 2 (134 octets); * ! #* — Fiément graphique n (134 octets); * « * — Dernier élérent graphique (134 octets); * d é A bk el e sk e e e e t e e Y R dh c E E E PROCEDURE save elements(nom$) LOCAL i% 1 OPEN “o“,#1,nomf BPUT #1,VARPTR(pal element$),32 OUT #l,nb élements® ECRITURE NOMERE ELEMENTS FOR %=1 T0 nb elements® DEBUT BOUCLE LECTURE ÉPUT &1,VARPTR(element$(i%)), 1341 ECRITURE DE L'ELEMENT i% NEXT 1% | FIN BOUCLE LECTURE CLOSE £1 FERMETURE DU FICHIER RETURN OUVERTURE DU FICHIER ECRITURE FALFTTE ELEMENTS — — — —— Ë é E RR * LECTURE D'UN ELFMENT GRAPHIQUE * e r t e r e rr r e e e e e e e e t t r ch 0 1 é e d r d e d E E r E A = numx - Numéro de |l'élément a lire * BEST OF GFA BASIC ! * posx% : Position X de l'élément # ! #* posye : Position Ÿ de l'élément * ï *#t#“*#%*#Hhk#i*fitt*fittfitâ##*È*i*iil i *gufikiik#u*kfii*htttt+*filiiktlkutbilirt#i##i*#l*#ttt * % | ”{pstruction GET fonctionne avec 4 paramétres : ; * * xl, yl, xZ, y2. La fonction lec element doit fabriquer “ * les coordonnées x2 et yF à partir des position posat et * ! * posy#. Etant donné que les éléments graphiques ont une ! * taille de 16 pixels, i1 faut rajouter (16-1) à la | # coordomnés de début de l'élément pour obténir la ! * coordonnée de fin. Pourquoi (16-1) et non 16 ? ! * Le premier pixel compté aussi dans la lonqueur de Ÿ « * l'élément. Avec un début de 10, un élément d'une longueur * !* de 16 pixels se termine au pixel 25. Les pixels 10,11, w | * 19,13,..,24,25 constituent cét élément. C'est pourquoi on + * = “* utilise la formule (16-1). f 5n dh e e e e e e e E e e e e e e e S e S SE PROCEDURE lec elément (num®, posx#,posy#) LOCAL posx2s, posyes I posx£*=“posx4+[16-1] posyé*=posyt+{161) ” LECTURE ELEMENT mun GET posxŸ,posys,posx2*, posy2%,element${rumé) RETURN —. — I ek kb d e e e d e e r e e E E ! * LECTURE DE TOUS LES ELEMENTS GRAPHIQUES * L ud e e o ok cr e ok e r e e e e e e e V F PROCEDURE Tecture clexents LOCAL pxt,py L} [X READ px* EXIT 1F pxs==1 | LECTURE PREMIERE OONNEE | TEST SI DOKNEE DE FIN 1) INC nb elements' ! LIN ELEMENT GRAPHIQUE DE PLUS READ pyt 1 LECTURE POSITION Y ELEMENT élec element(nb elementst,px%,py#)1 LECTURE D'UN ELEMENT LOGP tETURN I e e e d e e e e e e e rr pl d AT R E E E ' * DEFINITION DES ELEMENTS * | e é d e E ' DATA Nom image DEGAS ELITE ” DATA Nom fichier éléments & générer “ DATA x.¥ ' DATA x,y ‘ DATA <L (=1 = INDICATEUR DE FIN DE DATA) DATA DESSIN.PII DATA ELEMENTS.ELE DATA 1, 1 DATA 18, 1 DATA 35, 1 DATA BB, 1 DATA-105, 1 DATA 120, DATA 137, DATA 154, DATA 171, OATA 188, DATA 206, DATA 222, DATA 239, DATA 256, DATA 273, DATA 250, DATA —l i el el R T RE TT E e e E R P kR EEthdt it e m e c d d E I d * #* EDITEUR D'IMAGES CONSTRUITES * 4 r e e é e e e e e A E e e E E E E de m d SREENE E * Programme FDIT IME * ok de e dr e gkt e e e e r e e e e p g E ttutrhhhekkebedéhbdde é RESRE RE É SE E = (C) 1990 Patrick Leclercq & ATARI MAGAZINE * ! * Programration Interpréteur GFA BASIC 3.03 * | LRN RE e i b o É o S e o E o ol R TR e E ! i&ttttttt*ttttt*k*lû*liTtiTËÊ * WARTABLES GLOBALES DU PROGRAMME = D oaEEret RkRENd Rd kRakdt - * element${) :Tableau contenant les &léments graphiques ' nb etementst Mh éléments graphigues dans elementd() ' images | () :Tableau contenant le codage des imacés ! ronesi() :Tableéau conterant les zones de clics ‘ nb zones% :Nombre de zones dans tableau zonesk() \ sortiés ‘Condition de sortie du pry element courant® :Num élément selectionné par utilisateur | num image® :Numéro de l'îimuge én cours d'édition ' posx0% Position x d'affichage de l'image courante ! posy0 ‘Fosition y d'affichage de l'image courante - clie x :Pos x dérnier clic dans zone écrän “alicy :Pos y dernier ciic dans zone écran RESERVE 50000 OPTION BASE 1 DIM images|(10,18,10) !TABLEAU POUR LES I™AGES IRESERVATION DE MEMOIRE POUR LE BASIC ” ES INDICES DE TABLEAU COMMENCENT A 1 DIM element3(2756) ITABLEAU POUR LES ELEMENTS nb elements#=0 DIM zone%{10,4} ITABLEAL POUR LES ZONES DE CLICS nb zones+-0 émair lAPPEL PROCEDURE PRINCIPALE END T |FIN DU PROGRAMME 1 i L e d r btk d r e d r “ * ATTENTE D'UN CLIC SOURIS * T wEERTEE AT T AR Akdd PROCEDURE att clic(VAR xm,yms) AIARI MAGAZIME m BEST OF GFA BASIC :}Efififl! =-j.ll.| .:.:: P' H dsF E = P LOCAL Kms i REPEAT MOUSE Xmyérné s, l,em UNTIL kmi=l ‘ RETURN T T E E A e A d E E E * * ATTENTE ARRET CLIQUAGE | PE E E A SE R AR AR R E RE PROCEDURE attüclic REPEAT UNTIL MOUSEK=Ù RETURN 1 wEggkdEdtkFdrrbEbdbbryr Adebbyd '+ TEST SI UNE POSITION (px/py} * ' * EST DANS UNE ZONE (x1,v1,x2,ÿ2} * | #pdmadFRd Tttt Rbd -t é é k e Aobishd FUNCTION tst zone(pxh,pyt, x14, yl%,x25, y2%) LOCAL r* r%=FALSE IF 2) r%=TRUE ENDIF RETURN r% ENDFUNC 1 é e d e e e e e o ol SÉ D d E ' = SAUVEGARDE D'UN TABLEAU D'OCTETS SUR DISQUE * | RH E r E ÉÉ R À E PROCFDURE save tableau(nom$,VAR tab|()) LÜCAL nb dinfé LÜCAL nb_elemt LOCAL adr data% LOCAL taille datas nb_dimk=INT[ARRETR(tab[-()}#41 ! NOMBRE DE DIMENSTONS adr data=LONG[ARRPTR(tab{{}}} ! ADRESSE TABLEAU nb_elemt=0DIM7{tab|{}) | NOMBRE ELEMENTS TABLEAU taille datatenb_elemssnb dimé*s | TAILLE DU TABLEAU BSAVE nom$,adr data%,taille data ! SAUVEGARDE ZONE TABLEAU RETLRN i 1 Sk deddok & R ok e i ok i e i gl e s ol RE RE A ETE ' # LECTURE D'UN TABLEAL D'OCTETS * | AA AN E É É ÉÉ E E PROCEDURE Înad tableau(nom®,VAR tab]{}) LOCAL adr datas adr data%=LONG{ARRPTR(tab]{})} TAOR ZONE MEMOIRE TABLEAU BLOAD nom$,adr datas ICHARGEMENT TABLEAU RETURN i tt*ttttttiiiiLtt#ti#tt*#t*tt#t*ttt * * INITIALISATION DU TABLEAU DES IMAGES * ATARI MAGAZIME D o e e o é T e e e e c e r e e o o R v T r PROCEDURE init _images LOCAL 1%, %%, 1y% I FOR i%=1 70 10 FOR ix%=1 TD 18 FOR iy4=1 TO 10 images | (1%,1x%, 1y5)=1 NEXT 154 NEXT 1X% NEXT 1% RETURN I HR NaKEÉNTÉ TVRE TRÉ É RR E E ” * TMITIALISATION DES ZONES DE CLIC * D ETE i R o e É L e e i i el e PHOCEDURE init elic LOCAL x1&, 1%, x2%,¥2% nb zonest=û oo READ x1% EXIT IF x18=<2 INC nb zones* READ y1% READ x2% READ y2% zone%(nb zoness, l)=x15 zoné%{nb zones%,2)=yl% zone%(nb _ zones‘,3)=x2% zone%(nb_zonest, 4)=y24 LooË — | RETURN i I d ko s A A R A É E R R ' = DEFINITION DES ZONES DE CLIC * 1 mt e e e e bR A é e d d & ' DATA xi, y1, x2, y2 ' DATA x1, yl, xé, ¥2 ' DATA -1 (INDICATEUR DE FIN DE DONNEFS) DATA 35 , 197, 165, 19/ DATA 253, 190, 285, 197 DATA 253, 16/, Z85, 174 DATA 35, 16/, 165, 177 DATA 35, 177, 165, 187 DATA 200, 190, Z18, 197 DATA 200, 147, 215, 174 DATA 16, 3, 303, 162 DATA -1 1 1 T il i il o ol e o e e e el i T ' * LECTURE DES IMAGES * | HÉÉTÉETTÉTTÉTTTTETTTeE PROCEDURE lecture images LOCAL nomk LOCAL pathi i pathé=D1R$(0)+“4#.IMG” FILESELECT pathé,“ *,nom} IDETERMINATION CHEMIN COURANT |APPEL SELECTEUR DE FICHIERS BEST OF GFA BASIC IF nomf⇐”“ ITEST SI PRESENCE D'UN MOM HIDEM | EFFACER SOURTS Éload tableau{nom$,images | ()} ICHARGEMENT TABLEAL IRAGES num_images=1 FINIT TMAGE COURANTE Baff image VAFFICHAGE IMAGE COURANTE Baft num image IAFE MUMERO IMAGE COURANTE SHOWM LAFFICHAGE SOURTS ENDIF RETURK 6h ok o o R R Y R A S “ * * SAUVEGARDE DES IMAGES * | e il e e i i e e i e o PROCEDURE sauver images LOCAL nomd LOCAL pathd pathf=0IRE (0)+“¥\, IME” FILESELECT path$,” “.nom3 IDETERMINATION CHEMIN COURANT JAPPEL SELECTEUR DE FICHIERS IF nomf⇐“* ITEST SI NOM DE FICHIER HIDEM 'EFFACER LA SOURIS Bsave tableaufnom$,tmages|()) !SAUVER LE TAËBLEAU THAGES SHOWM IAFFICHAGE SOURES ENDIF RETURM 1 A e A r A e E E R é E e e e e e e ke e o ” + ROUTINE DE LECTURE DES ELEMENTS GRAPHIQUES * 0 deéeede e rr e o e e d e d e e e e e é e e e e d E PROCEDURE Toad elements(nomd } LOCAL 1% | VARIABLE LOCALE POUR BOUCLE LECTURE LOCAL pals 1 OPEN “i”,#1,nom$ pal$=sPACE{(32} BRET #1, VARPTR(pal5),32 VOID XBIOS(6,L:VARETR{pal#}} nb elesentst=INP(#1} IOUVERTURE DU FICHIER 1LECTURE DE LA PALETTE . IDÉCLARATION PALETTE !LECTURE NOMBRE ELEMENTS FOR 1%=1 TO nb elementsw IDEBUT BOUCLE LECTURE element{{(i%)=5PACES(134) ! RESERVE MEMOIRE POUR ELEMENT BGET #1 ,VARPTR(element${1#)), 134!LECTURE D'UN CLEMENT NEXT i% 1FIN BOUCLE LECTURE CLOSE #l !FERMETURE DU FICHIER RETURN ti**f**t**#***#****flkfl‘**!"‘*****t*** ' = AFFICHAGE U'UN- ELEMENT GRAFRIQUE #* 1 2R d e 1h E É e d e r e r - se e r s e e rh c p F 1 e e e r e e e e e e e e d e e e e e e e r É e ! * La position d'un élèment sur l'écran se calcule de * !* 13 maniére suivante : ” ! % px& = (colonnes1}*16+posx06 # ! * le numéro x de l'élément varie de 1 à 18 F " * Affichage élément 1 a posx+ ï * * Affichage élément 2 à posx3+16 ¥ B dh e gt o oy e i o e o o oo o e i e B o e e e o ke e e e e PROCEDURE aff element(colonnes,]ignes) LOCAL px%,py% LOCAL num_el ement* num elementt=images| (num image*,colonnes, | ignet) pat=(colonne*-1}*16+-posx0# pyt=(1ignet-1)"16+posy0t PUT px*,pyk,element#{num_elément#) RETURK | ek ok e & i il el e e kel ol i e T ok e o TR ! # AFFICHAGE DF L'IMAGE COURANTE * D d d ki e d e e d e ik é d é e u d PROCEDURE aff_image LOCAL ix%,ivs FOR iy*=1 TO 10 FOR ix%=1 TO 18 Baff element(ix%,iy%) NEXT ix% NEXT TY4 RETURN Pk WA E R R i R ki e e g e o kel e e o e R e E ' % AFFICHAGE DE L'ELEMENT COURANT SUR L'ECRAN * 1 rr e d d d e e d e e e d d e e e A É E PROCEDURE aff el courant PUT 201,175,elerentd [element courant*) RETURN L e e W e d r e e d d e ok e T 1 “ d e e e dF E ' * AFFICHAGE DU NUMERD D'IMAGE SUR L'ECRAN * I rr e v e e e e e e e e e d o o e e d o e E e e o A d E PROCEDURE àff_num image PROX 254,175,284 189 'EFFACEMENT Z0KE D'AFFICHAGE TEXT 264,185,num image% !AFFICHAGE NUMERO IMAGE COURANTE RETURN 1 Rk dkEddrFEdbrddretdhddh il ! * AFFICHAGE ECRAN EDITION * | é e É R r e d E PROCEDURE aff edit CLs | EFFACEMENT DE L'ECRAN L P&ox 15,2,304,164 ! ZONE DE L'IMAGE BOX 35,167,165,197 | ZONE DES COMMANDES TEXTES LINE 35,177,165,177 LINE 35,187,165,187 TEXT 50,175, "SAUVER IMAGES" TEXT 45,185, "LECTURE INAGES" TEXT 46,195, SORTIE EDITEUR“ BOX 200,167,217,197 ! ZONE DE L'ELEMENT COURANT LINE 200,174,217,174 LINE 200,191,217,191 ! : ! POSITION ELEMENT COURANT : 201,175 EOX 253, 167,285,197 LINE 253,174,285,174 LINE 253,190,285,190 ! ZONE DE L'IMAGE COURANTE Baff image ! AFFICHAGE IMAGE COURANTE ATARI MAGAZINE W BEST OF GFA BasIC Re Ss e N - I - 5 E ——lE P "ïfi' £ Eflff_E]_EflErflfit ! AFFICHAGE ELEMENT COURANT Baff_num_image ! AFFICHAGE MUMERO IMAGE COURANTE RETURK ë e e i 3 v e o e r e e e r i e E e e e e e o e e e A ol ol e o ol i ok e “ # MIDIFICATION DE LA CASE SELECTIONNE PAR L'UTILISATEUR 7 *++**g***tù#lt*p**ktuflp‘fi:t**#t*tt*tt**:*#tt*ttktt*fit*ttt*ü 8 e e o d e rr e e gl u o el e i m o e e e e e e r e e e e r F *. CALOUL POSITION CASE : " 4 Le calcul de 1a position de la case cliqué par $ * l'utilisateur se fuil en deux temps ! S = — 1} On calcule la position relative de clic par & = rapport au bord de l'image (on soustrait la 4 « position de l'image à Ta position de clic), l ; pxfexc5 i—poisxc0% et pyt=clic y=—posyls “ * — 7) On divise le résultat par 16 (taïlle d'une case) * = at on ajoute ! puisque le résultat de la division* % vas de 0 à 17 pour les colonnes à la place de 4 * 1l à 18, et de D à Ÿ pour les lignes à Ta place de* F 1 à 10. e Æ A Ë * TEST D'ECRITURE : ï * Avant de modifier le contenu d'une case de l'image, la * * routine regarde si celte case ne contient pas déja la * * bonne valeur. Cela évite un accès vidéo inutile. A * L'affichage est plus agréable comme ça. f cec ue e d e e ce d r r r e e e r e e e e e m e S e ok e R R PRÜCEQURE modif case R i i LOCAL colonne* LOCAL Tignes LOCAL pxs py5 LOCAL element* px4=clic xk-posxûs POS X RELATIVE 1 py&=clic _y+-posylé L PU5 Y RELATIVE colonne%=INT{px#/16}+1 ! NUM COLONNE TABLEAL | NUM LIGNE TABLEAU ligne“=INT{(pys/16)+1 elemen| (ntum *ima=ge*i,comlonane®g, !l eignse#) IF element courant#<>elements images | {num_ionnem%, al iggne%e)-c%leme,nt ccouoralnt® HIDEM @aff_glem&nt{:u]unne&,]igne%} 5 HO EMDEF ETURN é e e e e e e e e E T e e e S e e « DECREMENTATION DE L'IMAGE EN COURS D'EDITION * e e e r e e e e e e e d e d cè dh e e e d e r d A d E d E S AR d e E EN E t Les images vont de 1 à 10. La routine vérifie 51 A = l'utilisateur tenté d'actéder à une image inférieure § 1 * cuc d d kR ke RN R AR AR e SRR TRk ik e r o RN PROCEDURE dec_imaye TF num_images=l ! TEST SI DECREMENTATION POSSIBLE DEC num imaget | FASSAGE IMAGE INFERTEURE HIDEM ! EFFACER LA SQURIS Jaff image | AFFICHAGE MOUVELLE IMAGE Saff num image ! AFFICHAGE NUMERC NOUVELLE TMAGE SHOWM | AFFICHAGE SOUMIS APRES MODTF ECRAN ATARI MAGALIMNE ENDIF RETURN 1T e e sy o o e i sy e s E o e E S e e e el e r e d ok E * INCREMENTATION DE L'IMAGE EN COURS D'EDITION * e e e E r e E S S E R e e e e e e e Q e e c v e e d r r c e f E SE E é e e e E u p e e e f e * Les images vont de 1 à 10. La routine vérifie s1. * * l'utilisateur tente d'accéder à une image =10, 7 ti*ttt*itk#tt*ttt*tt*tti*t**:tk#t**t*k****liil**ÿtï*fi* PROCEDURE înc_image 1F num imoge=10 ITEST SI INCREMENTATION POSSIBLE FlHÈEËiifi} INC num images IINCREXENTATION IMAGE HLDEM LEFFACEMENT SOURLES aff image JAFFICHAGE NOUVELLE IMAGE Eaff num irage 'AFFICHAGE NUMERQ NOUVELLE IMAGE SHCWM lAFFICHAGE SOURIS ENDIF RETURN | wRdEREd kR E E E d kR d e d A d R E | « DECREMENTATION DE L'ELEMENT COURANT * L é e 3 e e e E É T o o T E 1 E PROCEDURE dec_elément IF element courant®==] DEC element courants HIDEM - 1 éaff el courant SHOWY . . @atilclic EXOTF RETURR I se e é d e rr dc r d e c e e e t e 6 e p e e " * INCREMENTATION DE L'ELEMENT COURANT * Lh e é e e e S e e A e E SE PROCEDURE inc element IF element courant#nb elementss: INC element couraniy HIDEM Baff el courant SHOWM Fattüclic ENDLF RETURN L h d e o e e e o e o e o e O r r Q ! * TEST.DE SORTIE DU PROGRAMME * | e FÉ e REN E TEIETE V d e e e r e r e É E d E d E it EN RE RE ket * Cette routine met à jour la condition de sortie (sortiex)* ! * En fonction de la variable de réporse de la boife 7 -* c'alerte, : 2 * sortie® =0 == l'utilisateur ne veut pas auitter le pra; “ * sortie® =1 = l'utilisateur veut quitter le prds # p e e “ e ce kAR n T E e d e d E d E R E E PROCEDURE tst sortie LOCAL tsth LOCAL m$ BEST OF GFA BASIC m="Voulez—vous vraiment|quitter l'éditeur ? ALERT 2,m#,1,“Mon|dui",tst* IF tstw=e sortie#el ENDTF RETURN L =1} A i e e v e A A o ke el m e o o o e E * EXECUTION DES FONCTIONS DE L'EDITEUR * e e e e e e e e e e e e e e e e e o o A e E PROCEDURE exec fonction(evf) SELECT evw CASE 1 éattüclic Btst sortie CASE Z édec image CASE 3 @inc_image CASE 4 Battûclic Fsauver images CASE 5 Battlclic @lecture images CASE 6 Bdec element CASE 7 éi_ enlemecnt CASE & Émodif case ENOSELECT RETURN ] Wik e e d d RN AT R é E E R * RECHERCHE DE LA 70NE DE CLIC * se cr o e oy e o A o r e e e v e e e “ h d e ***l“kqi**t*ttt*tt*#fifiPi*tt*#tikflfi#i**tttit***ik:**#**t***# * Cette routine renvoit le numéro de la zone “ * correspondant aux coordonnées pxs et pys. 51 aucune zone * * ne correspond aux coordonnées, elle renvoit 0. = t;t*tt*k**kbi*tt**j**:**++fifiuittt*t**ti*llikit*#*##i**liilt* FUNCTION chezronec (eh, peys) LOCAL 1% LOCAL mum_zones LOCAL x1%,v1%,x2%,y2% num_zona%=0 FOR i%=1 10 nb_zones x1%=#one*[{i#,1} 1 LECTURE x1 ZONE 1% vlt=rone#(iw,7) | LECTURE %1 ZOME i% w2%=zone%(i%,3) ! LECTURE %2 ZOME i% véiezonet(i%,4) 1 LECTURE w2 ZOME i% 1F @tst zone(pk.pyk,x1%, y1%. k2%, y25) ! TEST ZONE #% num zonek=ik ENDIF HEXT i% RETURN num zone% ATAR| MAGAZIME ENDFUNC L eh e ik AR Rk A R E RS ÉÉÉ R * * ATTENTE SELECTION FONCFION EDTTEUR * ] *tt**;aæætw*u:*w:**#:i*#üùktt**tàtëlkiw* i ***fiit*#tt*#ffl##i**ih*#'**tt**tifilikii*#ti#tt*#“*#i**lt*#t*# | % Cette routine attend que l'utilisateur presse sur. une ' % zone de clic correspondant à une fonction de l'editeur. ! t*ttt#**kk:tw#tfl*tt**:t*ttt*:ifl*t**:i****Pii*t**t*##i**fiti*t i : Sortie du programme : CliC zone passage image inférieure : Clic zone passage image supérieure ; €lic zone sauvegarde imagés - Clic zone lecture imègés * 0ME H— « Ëlie-zone incrémentation élément courant L 0 U O O #= 4 3 # (i position clic FUNCTION att zone clic LOCAL zone clic® RFFEAT éatt clic{clic x*,clic v | ATTENTE CLIC SOURIS zune:filitfi=@nhurnhe_zflne[c11:_;#,c11:_j%} | TEST CLIC ZONE UNTIL zone clic&0 | ATT CLIC ZOME RETURN zone clic* | RENVOT KUMERO ZOWE DE CLIC ENDFUNÉC i i ok EaddERdd d rr e é d b d E ! = FONCTION PRINCIPALE DE L'EDITEUR * | i s o el ol e T e e RR E A RE e e EN PROCEOURE edit LOCAL zone click F sorties#=0 ! CONDITION DE SORTIE - Q H zoné click~@att zome clic ! ATTENTE D'UN ORDRE Eeuec_fnnctian{zune_;11cÆ:! EXECUTION DE LA FORCTION EXIT IF sortie*=l ! TEST SI COWDITION DE SORTIE =1 LOCP RETURN ï 1 dh d d é d d d e d S ' # PROGRAMME PRINCIPAL * | P e S = E E E PROCEDURE main posx0==15 1 POSITION X DE L'IMAGE posydé=3 | POSITION Ÿ DE L'IMAGE num image*%=1l | INIT NUMERD IMAGE element courantä=l ! INIT NUMERO ELEMENT COURANT ginit clic | 1 INITIALISATION DES ZOKES DE CLIC @init images 1 INTTIALISATION IMAGES DE DEBUT éload elements("ELEMENTS.ELE") ! CHARGEMENT ELEMENT 5 paff edit ! AFFICHAGE DE L'ECRAN D'EDITION SHOMM 1 AFFICHAGE SOURLS Bedit ! PROCFOURE D'EDITION RFTURN 1 b b ik A e e o o É e e r e e e d kb BEST OF GRA BASIC w Æ - Élic zone décrémentation élément courant & : Clic dans l‘image. clic »% et clic y* contiennent * *t**It**ttt*****i**ùfiùùlt*****iiihlkttt*tittt*k“iHt**fii*#**+ e T L S i e i,— p T-" * | # AFFICHAGE DES IMAGES CONSTRUITES * 1 = L | RR ETE ok e o o e S RE E dxhadthEttartEiTrEaNd bE ‘ © _ programme AFF IM6S * En é c SE R IS ETE E E SE T A A u e d e d u r R e r r e r ! # ) Patrick Leclercqg & ATARI MAGATINE * | NN el i E ÉÉ E i e E e S E el R RESERYE 50000 ! RESERVATION MEMOIRE POUR LE BASIC OPTION BASE 1 DIM images|(10,18,10) ! TABLEAU POUR LES IMAGES DIM e ement§{256) ! TAELEAU POUR LES ELEMENTS nb elements-2 ! NOMBRE ELEMENTS EN MEMOIRE ! LES INDICES DE TABLEAU COXMENCENT À 1 ecran travall#=MALLOC(32000) ! 32000 OCTETS POUR ECRAN TRAVAIL émaîn ! APPEL ROUTIME PRIRCIPALE VOID MFREE(ecran travail&} ! LIBERATION RAM ECRAN TRAGAIL END ! FIN DU PROGRAMME I ARk EArEA ARt kR A AR R AR bR R R F R e d R d * #* DEFINITION DE L'ECRAN DE TRAVAIL DU SYSTEME * L e e e e e e e e e e e e e e o ol e e ol e e u " " i PROCECURE def ecr log(ecran logiques) VOID XBI05(5,L:ecran Togique*,L:i-1,-1) RETURK ! I g ol e ol ol e e o u D e A O " * * LECTURE D'UN TABLEAU D'OCTETS * L RN R A U T R E RE PROCEDURE 1nad tableau(nom$, VAR tab|()) LOCAL adr datas i adr datat=LONG{ARRPTR(£ab] (}}} BLOAD nomt,adr datas RETURIN i 1 e e dc nn e o ok e e ce ok e B h m e de b e s o e e b \ # LECTURE DES CLEMENTS GRAPHIQUES. * 1 é É i E r e ol e É S S i D o PROCEDURE load elements(nor$) LOCAL 1% LOCAL palf i OPEM "i" , #1,nomi palt=sPACE$(32} BGET #1,VARPTR(pal51,32 VOID XBI05(6,L:VARPTR(pal$}} nb_elements*=INPF(#1) | QUVERTURE DU FICHIER 1 LECTURE DE LA PALETTE I DECLARATION PALETTE ! LECTURE MOMERE ELEMENTS FOR 1%=1 TÜ rlll-_E'llîfifltfiäfi ! DEEUT BOUCLE LECTURE element${i%)=5PACE$(134] ! RESERVATION MEMOTRE BRET #i,VARPTR(element$41%));134 ! LECTURF ELEMENT i% REXT i% | FIN BOWCLE LECTURE CLOSE #l ! FERMETURE DU FICHIER RETURN | ÉÉN E ol o i o o o ol e o o e i ATARI MAGAZINE ' * AFFICHAGE D'UN ELEMENT DE L'IMAGE * e L Sk e e e e e c e e e e E e E de e e e e o d e r e e e e e rr e e ok e r t rl ol o e e ol o o " i S E d E ! # imaget - Numéro de l'image à afficher “ ' * colonne® : Numéro de la colonne de l'élément (l à 18) * ' % lTlgne% : Numéro de la ligne de l'élémant (1 4 10) “ 1 E E d e r é s s PROCEDURE aff element(image%,colonned, Jignet) LOCAL pack, Dy LOCAL num elements I ' LECTURE NUM ELEMENT num. el ementi=images | (image%, colonnes, ligne#] * CALCUL POS X ELEMENT px&=[colonnes-1}*16+posx0% * CALCUL POS Y ELEMENT pys=({1igne#-1)"16+*posy04 " AFFICHACHE ELEMENT PUT px&,pyé,element${num elements) RETURN I drdrkabvrd i e s v ok o e e ol e s o R O " * AFFICHAGE D'UNE IMAGE * L ÉRTAAREd oA dodeA okR e ÉTEA U ke e E e e ke E ke e o e o e g d e sl o ol el g o ol o r e el o e 0 o e ot e o i e o * L'affichage ne se fait pas sur l'écran physique (l'écran” * # l'Écran visible), mais sur un autre écran situé en # ! * mémoire (ecran travail%). Une fois 1'affichage X | * complétement terminée, le programme recopie l'écran de * * * travail sur l'écran physique qräce à la fonction Bmove. * * * Cette méthode permet d'obtenir un affichage ultra-rapide“ * * plus agréable à l'oeil. up L é b b i ol e e S e e e e e o o o q e S S p e" i e e PROCEDURE aff image(num images) LOCAL ix%,iy4 @def ecr log{ecran travail&}l| ECRAN TRAVAIL = ECRAN LOGIQUE cS O ! EFFACEMENT DE L'ECRAM LOGIQUE FOR iy&=1 TO 10 FOR ix<=l TO 18 Baff element(num imagek,ix%,iy%)! AFFICHAGE D'LN ELEMENT NEXT 1X% MEXT 146 Édef ecr log(XBI0S{Z)) | ECRAN PHYSIQUE - ECRAN LOGTQUE BMOVE ecran travail®,XET05(2),32000 ! A7F ECRAN DE TRAVAIL RETURN i = | ANA o e ek E E ' € PROGRAMNE PRINCIPAL * 1E 4 E R E A E E d o de 3 d E o e FROCEQURE main LOCAL 1% i posxûs=lh L INIT PDO5 X IMAGE posy0#=3 ! INIT FOSI Y IMAGE @load elements("ELEMENTS.ELE") | CHARGEMENT ELEMENTS @loëd tableau("IMAGES.IFG",images|()) ! CHARGE CODAGE IMAGES FOR i%=1 TO 10 Baff image{i%) VOID INP(2) NEXT i% RETURN | AFFICHAGE IMAGE 1% | ATTENTE CLAVIER BEST OF GPRA BASIC GRAPHISME EN GFA BASIC FABRICATION PAR ASSEMB IMAGES SE SPRITES Un légo informatique Voici une technique permettant de dessiner des images à partir de sprites qui est beaucoup utilisée par les développeurs de jeux vidéo pour fabriquer des images avec peu de place mémoire. Qu'est-ce qu'un sprite ? Un sprite est une image pouvant s'afficher en superposition sur un fond graphique quelconque. Contrairément à une image rectangulaire ‘affichée avec l'instruction graphique PUT, un sprite peut avoir n'importe quelle forme. | Les sprites peuvent être utilisés pour réaliser des animations divers (monstres de jeux vidén, vaisseaux spatiaux, lettres se déplaçant sur l’écran, ete.) Os peuvent aussi être utilisés pour dessiner des images à partir d'éléments graphiques de base. Affichage d'un sprite Le GEA Basic dispose d’une instruction SPRITE mais celle-ci est tellement peu PË]'EÜI'…EIHOE q'l_lpfil_ll.':. N FH-:.':;E['IT.E dl LEIL I-IHÉ'].Ë'Î- POUE TLOHIS. Elle ne peut afficher que des sprites dessinés en deux couleurs et ne pouvant faire plus de 16x16 pixels. Pour afficher un sprite en 16 couleurs et de dimensions quelconque, il faut uriliser les opérateurs gra phiques logiques. Un sprite est constitué de deux images: la forme et le masque La forme contient le dessin du sprite réalisé sur un fond de couleur 0. Le masque est un dessin en couleur © réalisé sur un fond de couleur 15. Les pixels en couleur D du masque correspondent aux pixels affichables de la forme. Les pixels en couleur 15 du masque correspondent aux pixels non alfichables de la forme. Le masque doit être affché avant la forme. Le masque est affiché avec l’opérateur graphique logique AND ec la forme avec l'opérareur graphique logique OR L'instruction PUT peut afficher une image avec un opérateur graphique logique. Le type de l'opération logique doit Être précisé apres la variable alphanumérique (1 pour opérateur AND et 7 pour opérateur ÜR), ! Opérateur AND | Opérateur OR PUT px,py,masque$,| PUT px,py; formes, ? Un article présentant les Üpémt-::ur: graphiques logiques ct quüïq'.l-::-: exemples d'utilisations dans ce numéro. Génération d'un sprite Pour avoir un sprite, il faut dessiner le masque et la forme. Le dessin du masque est une opération délicate. C'est souvent la hantise des sraphistes, On peut simplifier les opérations en générant le masque ét la forme à partir d’une seule image. Cette image doit être dessinée sur un fond de couleur 15. On dit alors que la couleur 15 est une couleur transparente, puisque les pixels en couléur 15 du sprite ne seront pas affichés sur l'écran. Puisque la couleur 15 n'est pas affichee sur l’écran, les sprites ne sont pas dessinés en 16 couleurs, mais en 15 (de la couleur Q à la couleur 14). Table des couleurs VDI Avant d'étudier la transformation d’une image en masque et sprite, il faut étudiér la manière dont le GFA Basic gère les numéros de couleurs. Les fonctions graphiques du GF4 Baste n'utilisent pas le codae normal des couleurs, mais le codage couleurs des fonctions graphiques VI (implantés dans les ROMS du 5T). Par -E]{f:mpk, le numeéro de couleur VDI n:-:rrr-:apnud à la couleur 15, Lorsqu'une fonction graphique du GÆ4 Basic dessine un pixel en couleur 1, elle écrit dans la mémoire vidéo la valeur 15 cc non la valeu1r. teeeee==== fussus ismit #. Fun=us=zen +-----acumem | | Numéro | Muméro | | Mumëro | Numéro | | Couleur | véritable | | couleur | véritable | | GFM/VOI | couleur | | GEM/VDI | couleur d{csuestiees Lo L t e PE e e fommmmm——— + e | 0 [ £l S p 7 | [t el R i, -y S|[OS | 2 | ! [ B 3 | | 3 æ PR = 0l | 1= | 4 D LR i M | M5 ekl T i A = . | [ | E I b T = I | dl | 5 el E RE E | Fau=s=——-——=- S RE + F-ponmen-- TGSS + ATARI .MMGAEIHLW GESTOF GRA BASIC N — —s se Le çudgäç de couleur VIN n'est pas utilisé par ous e programmes ST. Les logiciels de dessin graphiques (Deges Efite par exemple) urilisent les vrais numéros de couleurs. Les opérateurs graphiques logiques qui agissent sur les couleurs au niwau codage binaire ont besoin des vrais numéros de couleurs. Pour obtenir la couleur 15 dans la mémoire écran, il faur utiliser la coulsur 1 en GFA Basic. Fabrication d'une forme de sprite L'image de base du sprite est le dessin du sprite réalisé sur un fond de couleur 15, La forme est le dessin du sprite réalisé sur un fond de couleur Ü. Pour générer une forme à partir d'une image de base, il faut changer tous les pixels de couleur 15 en couleur 0. Pour le GFA flasic, en tenant compte du transcodage de couleur, il faur convertir tous Jes pixels de couleur 1 en couleur O, La procédure Ëgen forme fabrique ure forme à partir d'une image de base, L'image de base est située à la position (px5,py5). Flle mesure tx% pixels de lange et ty% pixels de haut | ULAREHHAAARRREETE ÉÉ R SREE SREE ! * FABRICATION FORME SPRITE * I RRFN ERETRÉEEeaa E N PROCEDURE gen forme[pxs,pyt, L%, L) LOCAL xpos*, ypos® FOR ypost=pyt TO pyttys-] FOR xpos®=px= TÜ pxi+ixs-1 IF POINT(xpos%,yposs)=1 COLOR 0 . PLOT xposs,yposs ENDIF NEXT xpos NEXT wposs RETURN Fabrication d'un masque de sprite L'image de base du sprite est le dessin du sprite réalisé sur un fond de couleur 15. Le masque est un dessin en couleur 0 réalisé sur un fond de couleur 15. Pour générer un masque à partir d'une image de base, il faue changer tous les pixels de couleur aurre que 15 en couleur O, En tenant compte du codage couleur du GE4 Basic, 1l faut convertir tous lés pixels de couleur autre que 1 en pixels dé couleur O, La procédure Égen masque fabrique un masque de sprite à partir d'une image de base située à la position (px%, py%). Elle mesure px* pixels de large et py* pixels de haut. 1 -ll.-g:*-‘_—***lfi'k#'.l':l:t:'::':'.'::':*:fi:*:‘::‘::t‘fl"fi"fi"fi"fi'fi"fi' ! * FABRICATION MASQUE SPRITE * I E a T TR TS CM E E e e E E A d d d A S PROCEDURE gen masque{px®,pyé,tx4, ty4) LOCAL xpos%,yDos%h FOR ypos%=py% TO pyettys-1l FOR xpos%=px= TO pxéttxs-1 IF POINT(xpos*,ypos&)<=1 COLOR O PLOT xpost,yposs ENDIF NEXT xpos% NEXT yposh RETURN Le programme GENSPRIT Le programme GENSPRIT fabrique des sprites (masques et formes) à pareir d’une image Deges Elite et les stocke dans un fichier disque. Le contenu de ce fichier peut être utilisé par divers autres programimes. d bN RR R e e REF É GENERATEUR DE SFRITES p e g e o o A T A R R é o d o d E RE O * Programme GENSPRIT.GFA — * E E ue r e r RE ETÉT TRI AXX * (C) 1991 Atari Magazine * * (C) 1991 Patrick Leclercg * PR E E e E d3 EN RESERVE 50000 OPTION BASE 1 DIM sprites(255,2) * spriteh(né,1) = Masque sprite n% “ spritef(n&,2) = Forme sprite n Émain END R o o b Tk M B o B A e o N T ! * PROCEDURE PRINCIPALE * | ÉF AAAARANRR RR RR RE E FROCEBURE main @gen sprites @sauve sprites["SPRITES.BIN") RETURN =U E E E E S E E E E r S — rrr S hhh k khh de o é ok W Wl e r d e o e e e * CHARGEMEMT IMAGE DEGAS ELITE * P R R E R AR R A ds d R E A AR E E E FhEEA kAR ERRAAAFELF TR AR AR RE RRES E * Cette procédure stocke la palette = | * de couleur de l'image DEGAS dans ” ! % 14 variable globale palettet. r D E RN W A R e e e d d ol ke d d E o E PROCEDURE loäd degas(nom$) palettef=SPACES(32) OPEN "i",#1,nom$ SEEK #1,2 BGET #1,VARPTR(palettei),3? VOID XETOS(6,L:VARPTR(palette#])) BGET #1,XET0S(2) , 32000 CLÔSE #l RESERVE MEM OUVRIR FICHIER SAUTER ENTETE CHARGE PALETTE MODIF PALETTE CHARGE IMAGE FERMER FICHIER s —— - — — ™ =— LIs ATARI mmaa.äuNF BEST OF GFA BASIC e B P R o e B B B e R e EE e Y T T e b b L R e DL LS é r e e d e ' * FABRICATION MASQUE SPRITE * 1 e e e e d ol r e iy o e e d ok o o o e e R PROCEDURE gen masque (px, pys, ta%, tys) LOCAL xpos%,yposs FOR ypos%=py¥ TO pyx+ty%-1 ! BOUCLE EN Ÿ FOR xpos%=px% TO pa%+tx%-1 | BOUCLE EN X ÏF POINT(xpos%,ypos%s)==1 ! TEST COULEUR <=15 COLOR À ! FIXE COULEUR PIXEL PLOT xpos%,ypos% ! TRACE PIXEL ENDIF NEXT xposs NEXT ypos% RETURN — r B BE ORI T O B R UER SRR r E I ek ÉN b E ket = AW ! * FABRICATION FORME SPRITE ”* | tkhéaa e ki R R d e R A R T A ko PROCEDURE gen forme(px*,pyfé, tx%, tyé) LOCAL xpos%,yposs FOR ypos*=pys TO pys+tys=-1 | BOUCLE EM Y FOR xpos%=px% TÜ pa%+tx%-1 ! BOUCLE EN X IF POINT(xpos%,ypos%)=1 | TEST SI COULEUR 15 COLOR O ! FIXE COULEUR PIXEL PLOT xpos%k,yposs ! TRACE PIXEL ENDIF NEXT xpos NEXT ypos% RETURN P E P P E P A A TT E TT C OR R | e e e e T E r V r e e e e e e e ' * SAISIE D'UN SPRITE SUR L'ECRAN * | VRN TTAAREÉEtERREREE RR v e E RE RE PROCEDURE 5&151&_5prite[nä,pnä.ÿyfi,t:ë.tï%} LOCAL image$ LOCAL px?%,pyes pxi4=pxs+txs=1l pyZE=pyi+iy%-1 GET px%,py¥%s,pxe%s,pye%s, images | MEMORTSE IMAGE Bgen masque(px%,pys,txs, Lyk) ! FABRIC MASQUE GET pxH,pyt.px23,py2$,spritet(ns,1) ! SAISIE MASQUE PUT px%,py%, image$ Égen forme(px®,pyés, txés, Lyk) RETURN P TEI BN T L NN N SR LR | RESTAURE IMAGE | FABRIC FORME GET pxd,pys,px?%,pyes,spriteb(n®.2) ! SAISIE FORME | e e 3 & 0 RR W WO R ki o e ek ' # GENERATION DES SPRITES * | HE TEI ER X PROCEDURE gen sprites LOCAL nom_image$ LOCAL n% LOCAL pxs pys LOCAL tx%,ty DO READ nom_imaged LIRE NOM IMAGE EXIT IF nom image$="#FIN" 1 TEST SI FIN @load degas(nom imagef! | CHARGE IMAGE Do READ n% ! LIRE NUMERO SPRITE EXIT IF n%=-1 | TEST SI FIN SPRITE READ px* | LIRE POS X SPRITE READ pys | LIRE POS Y SPRITE READ tx* ! LIRE TX SPRITE READ 1y% ! LIRE TV SPRITE 1 INC nb spritess UN SPRITE DE FLUS Bsaisie sprite(nk,px®,pyt,txe, tyk) LOOP LOOP RETURN P ETE E E P r r M r R rr rr e R e r e e e e e e e M e M e e e 1 éh e E S E e e r é e e e d d e e ue e ' * SAUVEGARDE DES SPRITES SUR DISQUE * E A kAR At e rr d e d e e 1 A R E E E RE RE PROCEDURE sauve sprites(nom$) LOCAL n% LOCAL taille* LOCAL adr_masques LOCAL adr_formes OPEN "o",#1,nom$ EPUT #1,VARPTR(palette$),32 !5AUVER PALETTE FOR n&=1 T0 255 ° taille*=LEN(sprite5{n&,1}}) — !TAILLE IMAGE IF taillete=0 IPRESERCE SPRITE ? BPUT #1,YARPTR(n%),4 ISAUVER NUM SPRITE BPUT #1,VARPTR(taille*),4 !SAUVER TAILLE adr masque*=VARPTR(sprite$(n#,1)) IADR MASQUE BPUT #1,adr masqueS,tailles I5AUVER MASQUE adr formeS=VARPTR(spritef(n®,2)) — !ADR FORME BPUT #1,adr forme%,taille* ISAUVER FORME ENDIF NEXT n* n==0 ; | INDICE FIN DE SPRITE BPUT #1,VARPTR{n%),.4 ISAUVER INDICE FIN DE SPRITE CLOSE #1 ! FERMETURE FICHIER RETURN 1 ATARI MAGAZINE m BEST OF GFA BASIC N . --““F———-_“---H________------------ | RR RE AN LRk kR TR AT Ak kT oy ! * FORMAT DE DEFINITION DES SPRITES # i h;xgttt**tt*fliE!w*flfi#*ti****iiïättt*** —— - DATA IMAGEI.FIl DATA 1,0,0,32,20 DATA 2,34,0,21,20 DATA 3,61,0,9,44 DATA 4,76,0,72,18 DATA -1 —0 N N N N N E E srr DATA IMAGEZ.PI1 DATA 5,158,0,33,41 DATA 6,201,0,21,27 DATA 7,232,0,40,47 DATA -1 [ ——————E DATA IMAGE3.PIL DATA 8,277,0,9,10 DATA 9,292,0,12,17 DATA -1 DATA *FIN Ce programme peut générer des sprites à partir de plusieurs images Degas Elite. Le nom des images est stocké dans les lignes de DATA avant la position des sprites. La valeur -1 indique la fin des sprites de l'image couranté. La chaîne de caracrères *FIN indique qu'il n'y à plus d’images à charger et donc plus de sprites. Les sprites sont dessinés sur un fond de couleur 15, Is sont définis dans le programme sous la forme d’un numéro, d'une position PX, d'une posidon PY, d’une largeur TX et d'une hauteur TY. Le numéro est le numéro de référence du sprite Les numéros de rélérence n'ont pas besoin de se suivre. Il est possible de définir le sprite 12 À la suite du sprite 6. Cette technique permet d'insérer un mouveau sprite dans la liste sans être obligé de renuméroter tous les sprites suivanits, Fonctionnement de GENSPRIT Les sprites sont stockés dans le tableau sprite$(). Le masque du sprite n* est stocké dans la variable sprite$(n&,1} er la forme dans la variable sprite$(n%,2). Le tableau sprite$(} est déclaré avec 255 éléments, mais peut être agrandi à volonté La routine @load degas charge une image Degas Elite sur l’écran. A la différence des routines de chargement présentés habituellément dans cette rubrique, la palette de couleur de l'image n’est pas stockee dans une variable locale, mais dans la variable globale palettes. Le contenu de cette variable est utilisée par la procédure ©sauve sprites. | | La procédure Bgen_masquel px%, py%s, txs, t v&) fabrique un masque à partir de l’image située à la position (px*, py&) et de dimensions (tx%,ty%). La procédure Bgen forme(px*,py&,tx#, ty%) fabrique ue forme de sprite à partir de I'image située à la position (pxk,pyé) et de dimension [txs tyé). La procédure Ésaisie _sprite fabrique le masque et la Fcrrmc_ld’ufu sprite ec sauve le tout en mémoire, Le dessin du masque modifie l'image originale du sprite, c'est pourquoi @saisie sprite sauve dans image$ l’image du sprite et la réaffiche après avoir généré le masque. La routine Bgen sprite supervise la fabrication des sprites, Elle charge les images Degas Elite, lit les données des sprites et appelle les procédures de fabrications du masque et de la forme. Clest la routine la plus impartante du programme. Sauvegarde des sprites :n::gn fichier disque La procédure Ésauve sprites(nom$) sauve les sprites dans un fichier disque portant le nom nom$. Le fichier commence par 32 octets contenant la palette de couleurs utilisée par les sprites, suivis du stockagé des sprites. Les sprites sont scockés sous la forme du numéro de sprite (4 oetets), la taille d’un élément graphique (4 octets - taille du masque et de la lorme), du masque et de la forme. La fin du fichier est signalée par la valeur 0 stockée sur 4 octets. BPUT #1,VARPTR(n%),4 BPUT #1,VARPTR(taille*),d [es variables n et taille% sont sauvées sous la forme d'unc zoné mémoire de 4 octers car elles occupent 4 octets en mémoire. La fonetion VARPTR{var) fournis l’adresse de la variable var (quelque soir le type de variable). ; Amélioration de GENSPRIT 1l est possible de stocker les coordonnées des sprites dans un fichier texte et de modifier GENSPRIT pour qu'il extraie les informations dont 1l à besoïn à partir de ce fichier. Cela évite de modiliér le programme pour générer un nouveau fi chier de sprites. Cela permet aussi d'avoir une version compilée de GENSPRIT ne prenant que peu de place disque e s'exécutant plus - pidemert que la version interprété. Le fichier texte pourrait ressembler à cec w A e A e ol o r o oA i e e e r ok oy E E -* DEFINITION SPRITES * ; HR g ok e ok okl e ok e e RR RE IMAGE1.P[1 10 037 20 = 34 Q 21 20 361 0 9 44 4 76 0 72 18 TMAGEZ . P11 5 158 0 33 41 é 201 0 21 27 7 232 0 40 47 IMAGE3.PTI1 & 277 09 10 à 292 0 12 17 *FIN - ATARI WHEWHEH OFGFA BASIC Vous pouvez aussi ajoutez à GENSPRIT la possibilité de sauver des sprites dans un fichier qui en contient déja, évitant ainsi de redessiner des sprites déja faits. Il est possible de stocker le numéro et le nombre d'octers d'un sprire dans une vartable de type entier 16 bits (symbole &), Cela représente une économie de 4 octers par sprites. Mais il faut fairé attention à ne pas mélanger les symboles % et & dans le corps du programme. EPUT n&,VARPTR(n&,) ? BPUT taillek, VARPTR(taille&),2 Si le nombre de sprites ne risque pas de dépasser 255, 1l est méme possible de stocker le numéro de sprite dans une variable du type byte (symbole |). Cette varable n'occupe qu'un vetet. La sauvegarde de cet octet peut se faire avec l'instruction BPUT, ou avec l'instruetior OUT. EPUT n| ,VARPTR(n|},1 OUT #l,n| Utiliser des variables de différents types en GEA Basic est risqué, car 1l est facile de r_'ha.ngtr Wift '::}lml.üle k en %, ou [ en %, voire méme d'oublier complètement le symbole de rype. Ce genre d'erreur est toujours très difficile à repérer, Pour éviter cela, il est préférable d'utiliser un type unique de vatiable et de s’y tenir. 5i l'utilisation d’une variable particulière vous permet d'optimiser votre programme (gain de place mémoire ou de vitesse d'ecécucion), 1l faut mettre de nombreux commentaires dans votre programme, de manière à ne pas oublier que cette variable est différente des autres. Fabrication d'une image par assemblage de sprites Le programme DRAWIMG fabriqué des imagés én affichant les uns par dessus les autres plusieurs sprites. Ces sprités sont chargés à partir d'un fichier disque généré par le programme GENSPRIT. DE ok b AN RE E N e D d e é r B L CONSTRUCTTON D* IMAGES * N A FARTIR DE SPRITES 7 | deded o ok s ke o de ko ok ok e e W e i e T E | * Programme DRAWIMG.GFA 5 ! '.t'.l.-l.tttt***tt*tfl'*'fl"fi*#It*t**#*fi! x (C) 1991 Atari Magazine ; * (C) 1991 Patrick Leclerca * I HFEERP R e ce e e S e e e e e S e C RESERVE 100000 OPTION BASE 1 o s e r e i o e -t - e e e i S P - e e e e Ty i —HRR RR E ' * MEMORISATION DES SPRITES * DR E R E N E A RE DIM sprite5(200,2) ' spritef(n#,1} = Masque sprite n% | sprites(n*,2) Forme sprite n% — E S E E E S E E — — — ——— — S E E U o o e e RR R e e e ol o o ke bR e A ETE ! = MEMORISATION DES IMAGES * R TRR E E S DIM image%(50,40,3) DIM taille image*(50) | image%(img®,n#,1) = Num sprite n% * imagé%(imgé,n#,£) 1 Emain END 1NA AN YW REER ' # PROCEDURE PRINCIPALE * I o ol L d e e e de 056 o r i e r r i d e e EN PROCEDURE main Bcharge sprites("SPRITES.BIN") Binit_images Bdemo images RETURN - image img® Pos À sprite n% - image img® * image%(img%,n%,3) = Pos Ÿ sprite n%- image img% = ——R R S S B O S S r sC E R N A OE . O R é e L e e e é r é é d d e e d E : # DEMONSTRATION CONSTRUCTION IMAGES = | XE EARÉÉETEEÉEREÉ AÉRT RAS R&RA TN &ÉR PROCEDURE demo images CLS UJR LOCATE 1,1 INPUT "Mum image (0 pour fin) ",img% EXIT IF img#=0 CLS PRINT img# @draw imaçe{img#, 100,100) LOOP RETURM | RAAHRETEEEEATERAAARREÉÉÉRRRE ' # AFFICHAGE D'UN SPRITE ?* \* DU TABLEAU sprite$() * I VRRRERERTEETTTERTERTEERrTENFRE # n : Numéro sprite # E px% : Pos X sprite ¥ |* ps : Pos Y sprite # l'VRRRAERTRER NETER E TE E TEETTE PROCEDURE aff sprite(n%,px%,py#) PUT px%,py&,spritet#(n&,1},1 PUT px%,pyé,spritef(n&,#),7 RETUREN PE g vy E E e e E E e e e g RE S I AT E E E d d d E E e d d EN \* AFFICHAGE DE L'IMAGE img& * ATAR| MAGAZINE mEEÈÏ OFGRA BASIC | AFFICHAGE MASQUE | AFFICHAGE FORME i - - 0 i 1 =—e ; =— = = .--I.:| el | ! = Ë 0 e e r e Tt et e e e “ f e e e e e S E * img5 : Numêrô image 7 * posx* : Position X affichage * * posys : Position Y affichage *, e e v v e e e d e i iy o i i e d A A E PROCEDURE draw_image [1mg%,posx%, posys) LOCAL n% LOCAL sporites LOCAL px#,py FOR n&=1 T0 taille image%(img%) spritet=image*(img#,n#,1l) ! NUMERO SPRITE pxk=images (img%,n%,2)+posx% | PX SPRITE pys=image%(imgs,nw,3)+posy* ! PY SPRITE Gaff spri te(spritex,pxé,py&) ! AFF SPRITE MEXT n% RETURN SE E T E E A r r r r r r e r r r e e e M e e f e d e e d d e e e e e r e d r é e e e d e * CHARGEMENT DES SFRITES * u À PARTIR DU DISQUE w < de-de de et A A e e e r e e e é f R E SE * Les sprites sont lus à * * partir du fichier nom$ * I s e W W W ko oo o o o ol o el i o e e e PROCEDURE charge sprites(noms) LOCAL pal} LOCAL n% LOCAL taïlle% LOCAL adr masques LOCAL adr formes OPEN "1" ,#1,nomk pal$=SPACES(32) BGET #1,VARPTR(pal$),32 ! QUVERTURE FICHIER | RESERVE 32 OCTETS | CHARGE PALETTE VOID XBIOS(6,L:VARPTR(pal%)) ! CHANGE PALETTE CO BRET #1,VARPTR(né, )4 EXIT IF n%=0 BGET #1,VARPTR{taille%).4 | CHARGE NUM SPRITE | TEST FIN FICHIER | CHARGE TAILLE SPRITE spritef(n&,1)=SPACES(taille%) ! RESERVE MEM MASQUE spritet{n#,2)=SPACE$ (taille%) ! RESERVE MEM FORME adr masque%=VARPTR(sprite$(n#,1}} ! ADR MASQUE adr forme*=VARPTR(sprite$(n&,2}) BGET #1,adr masques,tailles BGET #1,adr formes,taille# LOOP 1 CLOSE #l RETURN _._l_r-|_|_|.u|_|-"-----———h------—----- D e e oy e e e o ol d o e ok o e el e A O O T o CC \ * INITIALISATION DES IMAGES * ] ADR FORME ! CHARGE MASQUE ! CHARGE FORME ! FERMETURE FICHIER ATARI MAGAZINE L RR RR AI R NNN A É E RRN FROCEDURE init_imagés LOCAL num image% LOCAL nb_sprites% LOCAL n%,px%,pys RESTORE def_images Do READ num image* EXIT IF num imaget=0 nb spritess=0 Do READ n EXIT IF n%=-1 READ px%,py% INC nb spritesk imagek (num image%,nb_sprites%,1)=n% image%{num image%,nb_sprites%,2)=px% image%(num image%,nb_sprites%,3)=py% LOOP taille image%(num image%)=nb_sprites* LODP RETURK o e e R e e o e N N B i ***1**titt****fli!iittt***** * DEFINITION DES IMAGES = g e g o e e e T R R o o R RE DATA num sprite,px,py DATA num sprite,px,py DATA =1 def images: | ol i Wk ik o e dr e e e i * * PREMIERE IMAGE * TLRSU US ok REN DATA 1 DATA 1,10,10 DATA 2,20,20 DATA 3,40,40 DATA -1 — | AN AAEEEERH ! * SECONDE IMAGE * E TT o ok ol e ol ol e RE RR A A A S DATA 2 DATA 4,10,10 DATA 5,16,15 DATA 6,30,30 DATA -1 | RENAAATE | * TROISIEME IMAGE * | whRr Rkr ki L DATA 3 DATA 2,0,0 DATA 7,3,3 DATA B,28,37 BEST OF GFA BASIC DATA 9,20,:0 DATA -1 | dededede i @ ok o o b ke oo e o o o ol kel ' * QUATRIEME IMAGE * | T o T e ÉÉ RE DATA 4 DATA 2.0.0 DATA 7,5,5 DATA 1,2,7 DATA -1 ï g A d d de 0 ol o o A e S | * FIN DE DONNES ™ S whEEEETdktdthk kAW DATA © Chaque image est définie par une série de sprites. Ceux-ci sont eux-même définis par un numéro de référence ct uné position d'athchage. Ils sont affichés dans l'ordre d'appararition: le premier sprite est affiché en premier, suivi du second, etc, La position d'atfichage est relarive au bord de l'image. L'image peut être affichée à n’importe quel endroir de l’écran. La valeur -1 signale la fin d'une image. La valeur O signale que la dernière image vient d'êcre définie, Les numéros des sprites sont les numéros de références qui ont Été assignés aux sprites dans les instructions DATA du programme GENSPRIT, Fonctionnement de DRAWIMG Les sprites sont stockés dans le programme DRAWIMG de la même manière que dans le programme GENSPRIT, c'est-àdire dans le tableau sprite$(). La procédure Bcharge sprites(nom$) charge les sprites du fichier nom$ dans le tableau sprite$(). La valeur © est le signe de fin de fichier. La taille et le numéro des sprites qui sont stockés sous la forme de 4 octets sont lus avec l'instrucoon B6ET, PROCEDURE charge sprites(nom$) LOCAL pal$ LOCAL n# LOCAL taille® LOCAL adr masque* LOCAL adr _formes L OPEN "1" ,#1,nomk pal$=SPACE$(32) BGET #1,VARPTR{pal%).3? VOID XBI0S(6,L=VARPTR(pal5)} Do BGET #1,VARPTR{n%),4 EXIT IF n%=0 BGET #1,VARPTR(taille%.)4 spritef{n*,1)=SPACE$(taille%)} spritef(n*,2)=SPACE$(taille*) adr_maquE%;UAHPTH{SpthE$[n%,ljj BGET #1,adr masque%,taillew adr_forme%=VARPTR{sprite{n%,2)] BGET #1,adr forme%,tailles LOOP CLOSE #1 RETURN La procédure ouvre le fichier en lecture, charge les 32 octets de la palette de couleur des sprites, puis utilise la fonction système XBIOS(6) pour remplacer la palerte l’écran par la palette des sprités. La procédure @init_images charge la définition des images à partir des DATA, Les images sont stockées dans le rableau image=(}. Le tableau tai ! le image%(img%) contient le nombre de sprites de l'image img% La routine Éinit images utilise une double boucle D0-LO0P La boucle interne s'oceupe de lire la position des spntes définissant une image. La sortie de la boucle est assurée par une inst ruction EXIT IF lorsque le programme rencontre la valeur -1 sigralant la fin de l'image courante, La rourine @draw image affiche l'image img& à la position posxs et posy&. Elle lit les donnés définissant le sprite et utilise la procédure Gaff sprite qui affiche un sprité à une position quelconque de l'écran. Leur position d'affichage sur l'écran est calculée en ajoutant la position relative du sprice et sa position d'affichage sur l’écran. PROCEDURE draw image(img®,posx®, posy#) LOCAL n% ; LOCAL spritez LOCAL px%.py% FOR %=1 T0 taille imagek(img¥) spritet=image%{img&,n#,1) pxi=image%(img&,nt,#)+posx* py*=image%{(img®,n#,3}+posys Baff sprite(sprites, px* , py&) NEXT n RETURN La procédure @demo images est une procédure de démonstration qui permet de visualiser les images existantes. Flle demande un numéro d'image à Putilisateur et dessine celle-ci. 51 lutilisateur frappe sur la touche [0], le programme s'arrête, Cette procédure n'a pas grande importance. Ce n'est qu’un banc d'essai vous permettant de tester le générateur d'image et l'utilisation de la fonction Bdraw_image. Amélioration de DRAWIMG Le programme DRANIMG peut être grandement amelioré au niveau de la création des images. Au lieu d'écrire des numéros de sprites dans des DATA, 1l serait préférable d'avoir un éditeur permettant de séléctonner et de positionner les sprites À la souris. L'auteur de ces lignes à réalisé l y a qL;E-iquas' années un programme de ce type en TURBC Ü C'est parfaitement réalisable en GFA Basic en moins de 100 lignes. : Les informations définissant les sprites peuvent êtré stockées dans un fichier disque. Cela permet d'économiser de la place mémoire si les images sont dessinées avec de nombreux sprites. ATARI HA:}AHHEOEEES‘I OF GFA BASIC Erant donné que les positions des sprites sont définis de manière relarive à la position d'affichage de Pimage, les variables stockant ces positions d'affichages peuvent être du type byte (symbole |} Cela permet d'économiser 3 octets par variables, done & octets par sprites, Le scul inconvénient de certe technique, c'est qu'un sprite ne peut être affiché à plus de 255 pixels du bord haut gauche de l'image, C'est un défaut plutôt mineur! Si le nombre de sprites cst inférieur à 255, on peut aussi mémorisér les numéros de sprites dans des variables de type |. Cela permet d’économiser encore 3 ocrets par sprite. La taille mémoire nécessaire pour mémoriser un sprite est de 3 octets, alors que DRAWIMG gutilisé 12 octers pour faire la même chose. Si le nombre de sprites est compris entre 255 et 65535, on peut utiliser une variable de cype & {l ::H.‘Ll:l:s} pour mémoriser un numéro de spritr_ La place mémoire prise par la définition d’un sprite est alors de 4 octéts. Le codage des images peut être mémorisé dans une zone binaire et non dans un tableau. Cela permet d'utiliser juste la quantité de mémoiré nécessaire à une image. La plupart des programmeurs de jeux utilisent des données stockées directement en mémoire et non dans des tableaux numériques. Le programme DRAWIMG stocke un fichier graphique dans un seul rableau alphanumérique, mais rien ne vous empêche de charger plusieurs blocs de sprites dans différents tableaux. Vous pourrez avoir par exemple un tableau contenant des éléments de visages, un ta bleau contemant des éléments de votures, et un tableau contenant des élements d'animaux. Performances Cette technique permet de dessiner des images avec Irés peu de mémoire, Frant donné que le codage d'une image ne contient que des références de sprites, la taille de l'image n’a pas de rapport avec son occupation mémoire. Une image de grande dimension dessinée avec peu de sprites peut n'occuper que quélques dizaines d'octets, alors gu'une petite image dessinée avec beaucoup de sprites peut oceuper une centaine d'octets. S l’on ne considère pas la taille mémoire prisé par les éléments graphiques de base, il est possible de coder un nombre gigantesque d'images sur une disquerte ou en mémoire. En considérant qu'une image moyenne est fabriqué avec 30 sprites (ce qui est déja beaucoup), le codage de cette image occupe 121 octers (4x30 octets pour les sprites et 1 octet pour le nombre de sprites). On peur mettre 6093 images de 30 sprites sur une disquette double face. Cer exemple est théorique, car les images ne seront pas toutes dessings avec 30 éléments, mais il met en évidence le gain de mémoire permus par cette technique. Applications La technique consistant à dessiner des images par assemblage (ou collage) de sprites peut êÊtre urilisés dans de nombreux cas de figures. Voici quelques exemples: dessin d'animaux fantastiques, fabrication de visages, habillements de personnages, dessin de ruelles médiévalés Vous pouvez vous amuser À dessiner des animaux fantastiques à partir d'éléments simples (cornes, faces bestiales, têtés de démons, corps hideux, jambes de cheval, etc.) Un éditeur de créatures fantastiques ATAR| MAGAZINE fonctionnant en haute résolution et réalisé en 3 jours à eu un grand succes pendant la fête d'une école primaire. On peur déssiner des visages en prenant des formes de visages ct en Ÿ rajoutant des éléments de bases. Ces éléments sont; cheveux, yeux, nez, bouches, mentons. On peut aussi y rajourer des éléments divers comme des handeaux, des lunettes, des monocles, quelques cicatrices, etc. Awec une cinquantaine d'éléments graphiques occupant environ 60 Ko, on peut creer plusieurs centaines de visages différents. On jouant sur certains éléments comme les veux ou la bouche, il est même possible de faire varier l'expression d'un visage (amusement, colère, peur, eté..). Âvec une quarantaine de sprites représentant des murs, des toits, des chemindés, des portes et des fenêtre, il est possible de dessiner un grand nombre de maisons différentes, et même des rues. Pour la petite histoire, tous les éléments graphiques du jeu de rôle DONJON MASTER (murs, créarures, portes, écritures sur les muts, ete..) sont dessinés entièrement avec des sprites. Pour finir Les programmes de cet article sont disponibles en téléchargement sur le 3615 ATART, Tls sont livrés dans un fichier binaire compacté autodécompactable et ne coûrent que quelques francs de téléchargément. TELECHARGEZ DES CENTAINES DE LOGICIELS SUR LE 3615 ATARI BEST OF GGFA BASIC GRPHISME EN GFA BASIC INSTRUCTION Copie rapide’ COPY 310CS L L'instruction RC COPY est une instruction gruphique du GFA Basic 3.0 permettant de réaliser des affichages rapides et des effets spéciaux graphiques. La voila disséquée pour vous. Copie de blocs RC_COPY permet de copier des blocs de pixels d'un écran à un autre, Les écrans d'origine et de destination peuvent être les mêmes. Elle fonctionne dans les 3 résolutions graphiques du ST et est environ 7 fois plus rapide sur une machine équipée d’un blittér que sur un STF de base. Sa syntaxe est la suivanté: AC COPY ecranl, x1, yl, tx, ty TO ecrand, x2, y?@ ecranl:Adresse de l'écran d'origine x1:Position X du bloc de pixel yl:Position Y du bloc de pixel Lx:Largeur du bloc de pixel ty:Hauteur du bloc de pixel ectran:Adresse de l'écran de destination x#:Position X de destination y2:Position Y de destination Création d'un écran en mémoire Un écran est une zone mémoire de 32000 octers. Cette zont mémor re peut être créée en déclarant une variable alphanumérique de 32000 octets. ecran$=SPACES (32000) adr ecri=VARPTR(ecran3) L'adresse des variables alphanumériques peut varier à la suite d'une restructuration mémoire {garbage collection). Il faur denc recalculer fréquemment l'adresse du tampon mémoire Pour elfacer l'écran, il suffira de mettre une chaîne vide dans ecran§, ou d'effacer la variable ecran$ avec l'instruction ERASE On peut aussi réserver de la mémoire grâce à l'inscruction MALLOC, La zone mémoire ainsi déclarée sera fixe. En général, les allocations de mémoire sont réalisées au début des programmes. L'instruction MFREE permet de désallouer une zone mémoire créée par MALLOL. adr écr4=MALLOC(32000) VOID MFREE(adr _ecr®) Remarque: l’instruction MALLOC renvoie la valeur © si la reservation mémoite n'a pu avoir lieu (manque de mémoire disponible). Copie d'écran On peur copier un écran sur un sutré grâce à BMOVE, une mstruction de copie de mémoire. L'exemple suivant copie 32 000 octets de Fadresse ecranl® à l’adresse ecran?%, Les 32 000 octets se trouvant l’adresse ecran?% sont effacés par l'opération de copie. BMOVE ecranl%, ecran£*, 32000 L'adresse de l’écran physique (celui qui est affiché à l'écran) peur être decerminée avec la fonction XBI0S(2). On peur donc copier le contenu de l’écran physique en mémoiré et vice-versa. EMOVE XBIOS(2), adr ecr&, 32000 BMOVE adr ecr%, xBIOS(2), 32000 Fabrication d'un écran aléatoire Paur tester des routines graphiques, il faut avoir une image de test. Celle-ci peut etre chargée à partir d'un disque, ou fabriquée sur place. Nous vous propasant ici une petite routine fabriquant une image _ aléaroire. Elle s'adapte automatiquement à la résolution de l'écran, grâce à la fonction XB105(4) qui indique la résolution courante du sySbèmme. PROCEDURE gen ecran LOCAL 1%,c$,nb car% SELFCT XBIOS(&) CASE D nb_cars=40 CASE 1 nbk cars=a( CASE 2 nb_cars=al ATARI MAG.#EIHEW BEST OF GRA BASIC - ENDSELECTS FOR 1%=1 TO 24 c{=CHR$ (RANDOM(26)+65} PRINT STRINGS(nb car%,c#); NEXT 1% c$=CHRÉ{RANDOM(26)+65) PRINT STRING${nb car%-1,€$); RETURN La procédure GEN_ECRAN affiche 25 lignes de caractères, Le dernier caractère de la dernière ligne n'est pas affiché afin de ne pas déclencher un serolling d'écran qui effaccrait la prermière ligne. Affichage d'un morceau d'écran Le programme suivant charge unc image aléatoire dans un écran virtuel À l’adresse adr ecr& Un morceau de cetre image est cnsuite recopié sur l'écran physique avec l'instruction RC_COPY. RESERVE 100000 adr ecr%=MALLOC(32000} BGEN ECRAN EMOVE XBIOS(2), adr ecr%, 32000 CLS VoTD INP(2) RC COPY adr ecr%,0,0,100,100 TO XBI0S(2),0,0 VoID INP(2) VOID MFREE [ali'r'_üf::l“iä] END L'écran virtuel est erdé avec l'instruetion MALLOC. La mémaire prise est libérée en fin de programme par l'inseruction MFREE Le programmé fonctionne dans les 3 résolutions. Copie de blocs de pixels directement sur l'écran L'instruction RC COPY peur être urilisée pour copier des blocs de piwels directement sur l’écran physique. Ces blocs ne doivent évidemment pas éofméider, RC COPY XBIDS(2),0,0,32,32 TO XBI0S(2),100,100 C'est plus rapide et cela prend moins de mémaire que la combinaison classique des instructions GET et PUT. GET 0,0,31,31, IMGS PUT 100,100, IMGS Affichage d'une image ligne à ligne Linstruction RC COPY permet d'afficher une image hgne 2 ligne. Pour des raisons de simplicité, nous allons commencer par étudier l’affichage ligne à ligne uniquement en basse résolution. L'écran ast divisé en 20 lignes. Etant donné qu'il y à 200 pixels de haur, chaque ligne à une hauteur de 10 pixels (200/20=1C). Les lignes sont mumérotées de 1 à 20, ATART MAGAZINE PROCEDURE aff ligne (ligne%) LOCAL ylä y1% = (1igne%-1)*10 RC COPY adr ecr%,0,y1%,320,10 TO XBI05(Z),0,¥1% RETURN Pour affichér une image à partir du haut de Pécran, il faut afficher les lignes dans un ordre croissant. La procédure AFF_HAUT affiche une image 4 partir du haut. Cet exemple est incompler. 1l manque linitialisation de l’écran virtuel (avec SPACES ou MALLOC), et la tabre cation de l'image de test (avec GEN ECRAN), PROCEDURE aff haut FOR 1%=1 TO 20 Gaff ligne (1%) PAUSE 2 MEXT 1% RETURN Pour afficher une image à partir du bas, il faut afficher les lignes dans un ordre décroissant. La procédure AFF_BAS affiche unc image à partir du has de l'écran. PROCEDURE. aff bas FOR 1%=20 TO 1 STEP -1 - Baff_Tigne(1%) PAUSE 2 NEXT 1% RETURN L'instruction PAUSE Z sert à fixer un délai de temponsation entre l’affichage des lipnes. En augmentant ou en diminuant le paramètre de temporisation, vous ferez varier la vitesse d'affichage de I'image. Affichage ligne à ligne multi-résolution Programmer une routine multi-résolution pose toujours quelques problèmes. Ül faut déterminer les paramétres qui dépendent de la résolution et écrire une routine d'initialisarion. Dans le cas présent, les paramétres dépendant de la résolution sont la largeur d’une ligne (variable x1%), et la hauteur d’une ligne {variable y14). La routine DEF LIGNE caleule leur valeur en fanction du môde sräphique. Flle doit impérativement être appelée au début du programme sous peine de mauvais fonctonnement. PROCEDURE def ligne SELECT XBIOS[(4) CASE 0 x1%5=320 y1%=10 CASE 1 x1%=640 y1#=10 CASE 2 X1%=b40 y1*=20 BEST OF GRA BASIC ENDSELECT RETURN PROCEDURE aff ligne(lignes) LOCAL py* pyé=(1ignet-1}#y1% RC COPY adr ecr,0,pys,x1%,y1% TO XBI0S(2),0,py* RETURN Les procédures AFF_HAUT, et AFF_BAS du paragraphe précédent fonctionnent parfaitement avec la nouvelle procedure AFF LIGNE Il est amusant de voir la mème routine graphique fonetionner dans les 3 résolutions du ST, En anticipant un petit peu, On pourrait imaginer des routines graphiques lonctionnant dans tous les modes graphiques 5T &c TT. La plupart des programmes professionnels sur IM PC et comparibles urilisent un système graphique similaire à célui que nous venons d'étudier. Il existe tellement de cartes graphiques diffcrentes sur IBM PC que c'est une obligation pour les programmeurs. Affichage d'une ligne sur deux On peut obienir un bel effet graphique en affichant les li;g:n:ï impaires, puis les lignes paires, L'exemple suivant fait apparaître une image à partir du haut, mais le principe fonctionne aussi pour un affichage à partir du bas, PROCEDURE aff haut? FOR 1%=1 TO 19 STEP 2 Paff ligne (1%) PAUSE & NEXT 1% FOR 1%= 2 TO 20 STEP Z Gaff ligne (1%) FAUSE 2 NEXT 1% RETURN Cette technique d'affichage peut être utilisée avec d'autres écarts de ligne. Afficher une ligne sur 4 donne un trés bel effer. Affichage des lignes à partir des bords de l'écran Avec cerre technique, l'imagé apparaît à partir du haut et du bas. Les lignes 1ignel% et lignez# sont affichés quasi-simultanément par la routine. L'instraction PAUSE 1 impose un petit délai d'artenté entre les différentes étapes d'affichagelignel%= 1l lignez*=20 FOR i 1 TO 10 Baff ligne(lignels) Baff ligne(lignez#} PAUSE 1 INC lignes DEC 11gness NEXT i% En inversant le sens d'affichage des lignes, vous pouvez afficher une imagé à partir du milieu de l'écran. Jignel%=10 ligne2%-11 FOR 1%=1 TO 10 Gaff ligne(lignel%) Ëaff_]1gne{lîgnEÈ%} PAUSE 1 DEC lignel% INC ligne£z* NEXT 1% Affichage d'une image colonne par colonne De la même manière que l'on affiche une image ligne à ligne, on peut afficher une image colonne par colonne. Le principe est le méme, seul le sens d'affichage diffère. L’écran est divisé en 20 colonnes, En basse résolution, les colonnes ont une largeut de 16 pixels (320/20) er une hauteur de 200 pm::ls En movenne résolution, les colonnes ont une largeur de 32 pr xels {HÆHËÜ_‘] et une hauteur de 200 pixels. En haute résolution, les colonnes ont une largeur de 32 pixels (640/20) er une hauteur de 400 pixels, PROCEDURE def colonne SELECT XETOS5(4) CASE O xchks16 ycs=2UU0 CASE l xcis=i; vc===00 CASE & . k=32 yc#=400 ENDSELECT RETURN La procédure DEF COLONNE initialise les variables xc% et ¥c% en fonction de la résolution du sysetme. Elle doit être appelée avant d'utiliser la procédure AFF_COLONNE Le plus simple est de l'uciliser au début du programme. PROCEDURE aff colon ne(colonne%) LOCAL px* pxé=(colonnes-1}*xc% RC COPY adr ecr&,pxé,0,xc*,yc# TD ABIOS(2) ,px%.0 RETURN La procédure AFF_COLONNE affiche la colonne colonnet en tenant compte de la résolution. Les colonnes sont numérorées de 1 à 20. En ATARI MÈGÆINEm BEST OF GFA BASIC & affichant les colonnes dans un ordre croissant, l’image s'atfiche à partir de la gauche. PROCEDURE aff gauché ! LOCAL c% FOR c%=1 TO 20 ; Baff colonne(c®) PAUSE 2 - NEKT c% RETURN En affichant les colonnes dans uh ordre décroissant à partir de 20, l'image s'affiche à partir de la droité de l'écran. PROCEDURE aff droite ; LOCAL c% FOR c%=20 10 1 STEP -1 3 Gaff colonne(c*) , PAUSE 2 NEXT c% RETURN Affichage d'une colonne sur deux De la même manière que l'on peut afficher une ligne sur deux, on peut afficher une colonne sur deux. Lexemple suivant affiche les colonnes impaires, puis les colonnés paires. PROCEDURE aff qauchez LOCAL c% FOR c%=1 TO 19 STEP Z @aff colonne(c“) PAUSE 2 MEXT €* FOR c&=2 TO 20 STEP Z Baff colonne(c*) PAUSE 2 NEXT c* RETURN Vous pouvez aussi afficher une image colonne par colonne à prartllr des bords nu du centre de l'écran. Inspirez-vous des techniques daffichages ligne à ligne. Découpage d'une image en petits rectangles Au lieu de découper l'écran en lignes et colonnes, on péur I découper en petits rectangles. Cela permet de créér n:læ: nouveaux el fets graphiques, Afin d maintenir une compatibilité avec IEIE programmes précédents, l'écran est découpé en 20x20 blocs (soit 400 blocs). En basse résolution, un bloc graphique fait 16x10 pixels. En moyenne résolution, uñ bloc graphique fait 32x10 pixels. En haute résobution, un bloc graphique fait 32x20 pixels. La procédure DEF ELOC initialise les vatiablés Xb% et ybé# en fonction de la résolution du système. Elle doit être exécutée au débur des programmes. PROCEDURE def bloc SELECT X8105(4) CASE Ü xb==16 yhiz=10 CASE 1 xb%=32 vb*=10 CASE Z xb%=37 yh%=20 ENDSELECT RETURN La procédure AFF_BLOC copie un bloc graphique de l’image stockée à l'adresse adr_ecr% sur l'écran physique. Les lignes et les colonnes définissant la position des blocs sont numérotées de 1 à 20. PROCEDURE aff bloc(Tigne%,colonnes) LOCAL px*, pys pxs= (colonnes-1}*xb# py&={1igne-1}*ybw ‘ C COPY adr_ecr%_pïä,pfi,ïb%,ïbä TO XBIOS(2) px , py RETURN La routine AFF BLOC peur être utilisée pour réaliser des affichages sophistiqués comme l’affichage aléatoire, ou l’affichage en diagonale. Affichage aléatoire L'ordre d'affichäge des blocs est détermine au hasard, Le programme doit garder la trace des blocs déjà affichés atin de ne pas nî'Fichn.îr deux fois le même. Le tableau bloc%() contient la liste des blocs déja affichés à l'écran. Au début, les cases de ce tableau contiennent toutes 0. Lorsque le programme affiche un bloc sur I scran, il met lla valeur 1 dans la case correspondant au bloe affiché La routine de tr rage aléatoire sait qu’un bloc n'est pas encore affiche si la case équivalente de blocs () contient la valeur 0. DIM block(20,20) ARRAYFILL bloc%(),0 FOR j&=1 TO 400 RÉPEAT c*=RAMD(20}+1 |&«RAND[(20)+1 UNTIL blocs(15,c%)=0 Gaff bloc(1%,c%) block(1%,c%)=1 NEXT 1% L'instruction ARRAYFTLL bleck(),0 met là valeur O LE_:I.I'.I.E routes les cases du tableau bloc%(}. L'instruction RAND(n) fournit un nombre aléatoire compris entre Ü et n-l. La formule RAND(n) +1 donne doné: ATARI MAGAZINE RLF BEST OF GFA BASIC nn nombre aléatoire compris entre 1 ec n. Associé à la procédure DEF BLOC, ce programme permet de réaliser une routine d'affichage aléaroire fonctionnant dans les 3 résolutions du ST. Amélioration de l'affichage aléatoire Si vous avez exécuré la routine d’affichage aléatoire, vous avez dû remarquer que l’affichage des derniers blocs st un peu lent. Le programme peine un peu pour trouver les 5 ou 6 derniers blocs non affichés parmi les 400 blocs possibles. Ceci dis, le GE4 Basic est tellement rapide qu'il met moins d'une seconde à trouver le dernier bloc {en version interprétée). Pour éviter ce petit ralencissement, il faut arrêter le calçul aléatoire des blocs avant la fin, et afficher rapidement les derniers blocs resrant. On peut, par exemple, n’afficher que 395 blocs et utiliser une routine supplémentaire utilisant le tabléau b oc%() pour connaître les blocs non affichés. nb blocs*#=395 FOR i%=1 TÜ nb blocs* *. , AFFICHAGE ALEATOIRE NEXT i% FOR c%=1 TO 20 FOR 1%=1 TÜ 20 IF block(1%,c%)=0 Baff bloc(1%,c%) block(1%,c%)=1 PAUSE 1 ENDIF NEXT 1% NEXT c% L'instruction PAUSE 1 évite que les derniers blocs ne soient atfiches trop rapidement, Vous pouvez la retirer si vous trouvez qu'elle ne sert à rien. Vous pouvez faire varier le nombre de blocs affichés aléatoirement, en modifiant la variable nb_blocs% (elle contient 395 dans le programme d'exemples). Affichage d'une image en diagonale Les routines d'affichage en diagonale donnent toujours un résultat agréable à regarder, mais elles sont un peu plus difficiles à programmer que les autres. Nous avons vu que l'écran est divisé en 400 blocs. Ces blocs sont organisés en 20 lignes et en 20 colonnes. C'est une situation idéale qui simplifie considérablement la programmation. Les diagonales sont à 45 deprés. Pour tracer une diagonale, il faut partir d’un bloc graphique, puis décrémenter régulièrement la position du bloc courant avant d'arriver au bord de l'écran. La diagonale commençant au bloc (10,10) est constituée des blocs (10,10), (9,9), (8,8), ... (1.1). PROCEDURE diagonale(1%,c%) REPEAT Baff bloc(l%,c¥) DEC c% DEC 1% UNTIL (c*<1) OR (1%=1) RETURN La procédure DIAGONALE cesse le dessin lorsque le bloë à afficher sort des limites de l’écran, c'est-à-dire lorsque le numéro de ligne devient inférieur à 1, ou lorsque le numéro de colonne devient inférieur à 1. Cette technique trace une diagonale en direction du coin haut gauche de l'écran. On peut tracer des diagonales suivant d'autres directions (vers le coin haut droit, vers le coin bas gauche, ou encore vers le coin bas dront de l’écran), A titre d’exemple, [a rourine DTAGO BIS trace une diagonale ën direction du coin haut droir de l'écran, Cette nouvelle routine s'arrêre lorsque le bloc à afficher est hors de l'écran, c'est-à-dire lorsque le numéro de ligne est inférieur à 1, ou lorsque le numéro de colonne st supérieur à 20. PROCEDURE diagû_bîa{Ï%.c%} REPEAT @aff bloc{1%,c%) INC c% DEC 1% UNTIL (c*=20) OR [1%<1) RETURN Affichage d'une diagonale particulière 1l y a 39 diagonales sur un écran. La diagonale 1 est située en bas et à gauche de l'écran. La diagonale 39 est située en haut ét à draite de l'écran. Pour réaliser diverses routines d'affichage, 1l faut pouvoir afficher sélectivement n'importe quelle diagonale, La routine AFF DIAGONAL est capable d'afficher une diagonale de l'écran à partir de son numéro, ‘ PROCEDURE aff diagonal (numé) LOCAL ligne% LOCAL colonne* 1F num%<=20 ligne*=20 colonne*#=num ELSE ligne%=40-nums colonne*=20 ENDIF Pdiagonale(lignet,colonnes} RETURN Cette routine reconstitue la position du bloc de départ à partic du numéro de diagonale, - Affichage en diagonale de la gauche vers la droite La procédure IMG DIAGONALE] affiche une image en diagonale en partant de la gauche, Elle affiche les différentes diagonales les unis après les autres. La routine est trés simple, car le travail à été décomposé niveau par miveau,. : ATARI …HEW BEST OF GFA BASIC =] - |'|l' PROCEBURE img diagonalel LOCAL d% FOR d%=1 TO 39 Gaff diagonal (d%) FAUSE 1 NEXT d RETURN Affichage en diagonale de la droite vers la gauche La prü«._“'È;ÏLu'E ÏHE_ÛI:ÜLÉÜHÈLEË affiche wne imvage en dëfigfllnnït en partant de la droite, La diagonale 39 est affichée en premier. PROCECURE img diagonalel LOCAL d% FOR d%=39 TO 1 STEP -1 Gaff diagonal (d%) PAUSE 1 NEXT d% RETUEN Affichage d'une diagonale sur deux En affichant une diagonale sur deux, on obtient un effet graphique assez joli. La procédure AFF_20TAGONALE affiche une image à partir de la gauche. Elle a été écrite en modifiant la procédure IMG_DIAGDNALEL Vous pourrez modifier de la même manière la procédure IMG DIAGOMALEZ pour obtenir un affichage à partir de la droité. PROCEDURE aff 2diagonale LOCAL d% FOR d%=1 TO 39 STEP 2 Baff diagonal(d%) PAUSE 1 REXT d% FOR d%= 2 TO 38.5TEP Z Gaff diagonal (d%) PAUSE 1 NEXT d RETURN Bibliothèque d'images Vous pouvez utiliser RC_COPY pour créer une petite bibliothèque d'images. Le principe de base est de dessiner des images avec un logiciel de dessin type Degas Elite, puis de charger en mémoire l'image écran générée par le logiciel graphique. 11 suffira ensuite d'utiliser RC COPY pour recopier les images sur l’écran physique. La procédure LOAD IMAGE charge l'image nom$ à l'adresse adr_ecr $i / cette variable ne contient pas l'adresse d'une zoné mémoire de 32000 octets préparée avec MALLOC ou VARPTR, vous risquez de provoquér Un Sup-E:rh-E; p'flIll:argn: de la machine. ATARI MAGATINE PROCEDURE load images(ncmé) OPEN "T1*,#1,nom$ SEEK #1,34 BGET #1,adr ecr%,32000 CLOSE #1 RETURN La position et la taille des images doivent Être mémorisées dans un tableau numérique. Ces données doivent être chargées dans le & blean au début du programme. Ce peut être fait avec des Instructions DATA, où én lisant le contenu d'un fichier. DIM image%(100,4) ! image%(n,1) = position X ' image“{n,&) = position y * image%(n,3} = largeur {t;} ' image%({n,4} = hauteur (ty) La procédure AFF_IMAGE affiche à la position (X%,y#) de l'écran, l'image numéro n& L'image Degas Elite doit être chargée en mémoire à l'adresse adr ecr FROCEDURE aff_îmage{xä,yä,nàj LOCAL pxt, pré LOCAL Tx%, Lys ox% = image%{n#,1) pyk = image%(n%,7) tx = image%(n#,3) tys = image%(n%,4) RC COPY Eü?_gtrë,pxä.pyä,tlä,ty% TO XRIOS(8),x%, ¥5% RETURN Extension de la bibliothèque d'images Le système de gestion de bibliothèque d’images que nous venons de voir ne peut pas en gérer beaucaup. On est vite limité par la taille maximale d'une image. On peut avoir davantage d'images en travaillant sur plusieurs fichiers Degas Flite. LOAD IMAGE doit être modifiée pour charger une image Degas à une adresse particulière. PROCEDURE load images(nom$,adr_img*) OPEN "1",#1,nom$ SEEK #1,34 BGET #1,adr img*, 32000 CLOSE #1 RETURN Le tableau image%() doit contenir une case supplémentaire pour contenir le numéro d’écran de l'image n% L'exemple déclare un Lableau de 100 images, mais il peut être beauconp plus grand avec ce système d’écrans multiples (1 000 images par exemple). DIM image=(100,5} Les nouveaux écrans doivent être créés au début du programme. Les adresses peuvent être mémorisées dans un tableau. La réservation de BEST OF GrA BASIC zone mémoire se fait avec l’inseruccion MALLOC. L'ecemple suivant réserve de la place mémoire pour 4 images. DIM adr ecran%(4) FOR i%=1 T0 4 adr_ecran(i%)=MALLOC(32000) NEXT 1% Attention: 4 écrans de 32000 octets représentent 128 000 octets, Il est possible que le système manque dé mémoire (surtout sur 520) si la mémoiré est déja bien encombrée (programme important, tabléaux de grande taille, nombreux accessoires, programmes résidents, ctc.) Pour plus de sécurité, il faut contrôler la bonne exécution des rèservations mémoirc, FOR i%=1 TÜ 4 adris=MALLOC({32000) [F adrk=0 PRINT "Erreur mémoire” END ENDIF adr_ecran*(i%}=adr& HEXT i% Une fois le programme terminé, la mémaire réservée doit être libérée. Cetté opération se fait avéc l’instructon MFREE FOR i%=1 T0 4 VOID MFREE(adr ecran%(i%)) NEXT 1% Ë La procédure AFF_IMAGE s’utilise toujours de la même manière pour le programmeur. Par contre, il y à une différence importante au niveau interne: la routine détermine l'adresse de l'umage DEGAS ELITE avant d'appeler 'instruction RC COPY, PROCEDURE aff image(x%,v%,n%) LOCAL px=, pys LOCAL tx%, tys LOCAL num _image*# LOCAL adr img# px = image%(n%,1) pys = image%(n%,2) tx* = image%(n%,3) ty% = image%(n#,4) num _ imge = imâge%(n#,5) adr img%-adr ecrant{num_imgé) RC COPY adr imgé,px*,pys, L%, 1y TO XÉIOS(4),x#, y5 RETUEW Une image est définie par 5 paramétres: position X, position Y, largeur (tx), hauteur (ty) et numéro de l'image Degus contenant cette 1MMmAge, Les positions des images peuvent être définies en mémoire dans des lignes de DATA La valeur À sert d'indicateur de fin de donnéés. images: DATA px,py,tx, Ly,num image DATA 10,10,32,32,1 DATA 80,10,12,17,1l DATA 10,10,32,32,2 DATA -1 La routine INIT IMAGES lit les informations stockées dans les lignes de DATA et les stocke dans le tableau image%(). La variable nb_images% contient le nombre d'images lues. PROCEDURE init_images LOCAL px%, pys, tx%, tys LOCAL num_img% LOCAnL% n&=0 RESTORE images BQ READ px® EXIT IF pu%=-1 INC nf% READ py5,tx%L,y READ num_img% image%{(n%,1)=px* imageX(n%,=p2y)% images(n%,3)=tx% image#{n%,4)=ty4 image%(n*,5}=num_i mgé LOOP nb_imagess-ns RETURN Le chargement des images Degas doit se faire au debut du _ programme, mais aprés la réservation mémoire. L'exemple charge une bibliochèque d'images utilisée par un min-jeu de rôle. Bload ecran("OBJETS.PI1", adr ecrans(1}) @load ecran("ARMES.PI1", adr ecrans(2)) @load ecran("MONSTRE.PI1", adr_ecran%(3)) @load ecran("VILLE.PI1", adr_ecran%(4)) Scrolling d'une zone de l'écran Une routine de scrolling permer de simuler le déplacement d'une fenêtre virtuelle sur une image de grande dimension: Au point de vué téchnique, il s’agit d’un affichage rapide de bloc d'images. L'instruction RC_COPY permet de réaliser cela facilement, Il faut travailler très rapidement pour obtenir un scrolling de grande dimension parfaitement fluide. Clest impossible à realiser avec AC COPY sur uh STE, car la routine est trop lente. On ne peut obtepir que des scrollines de toutes petites dimensions. Lexemple présenté dans eer article ne fonctionne correctement que suf Un STE, ou un MEGA ST avec blicter actif. La routine AFF_ZONE affiche au milieu de l'écran un bloc graphique de 192x64 pixels. Ce bloc graphique provient d'un écran virtuel s1- ATARI …ÏIHEW BEST OF GFA BASIC mué à l'adresse adr ecr% La routine prend le bloc situé à la posttion (0x%, pyé) de l'écran virtuel et le copie à la position (64,68) de l'écran visible, Afin d'éviter des bavures vidéo, AFF_ZONE arcend que la barre synchronisation vidéo ne soit pas spr l'écran pour résliser le transfert de pixels (grâce à l'instruction V5YNC), PROCEDURE aff;;uneipm#,py%} VSYNC RC COPY adr ecrs,px%,.py%,192,64 TO XBIOS(Z),64,68 RE TURE L'exemplé suivant efféctue un scrolling vertical (du haur vers le bas) de 101 pixels, 1l est réalisé en recopiant 101 fois une partie de l'écran ädr ecr® sur l'écran en changeant à chaque fois la position du bloc graphique d'un pixel. L'instruction 80X affiche un rectangle graphique autour de la zone de scrolling. Ce rectangle n'a pas de réélle wilité pour le scrolling, 11 est juste là pour des raisons esthétiques. L'esthétisme est une chose importante en informatique, quoi qu'en pensent beaucoup de proËTE.[ E] ITIÉLIT S, COLOR 2 BOX 63,67,256,132 FOR pyé=0 TO 100 Gaff zone(100,py5) NEXT pys Pour réaliser un scrolling du bas fi…rs le bas, il faut afficher les blocs graphiques dans le sens mverse, FOR py%=100 TO Ü STEP -1 paff zone(100,py%) NEXT pyF La vitesse de scrolling dépend du pas d'incrémentation des pixels. Le pas d’incrémentation est le nombre ajouté à une position d'affichage pour obtenir une nouvelle position, Il était de 1 dans les exemples précédents. Vous pouvez augmenter la vitesse de scrolling en augmentant le pas d'incrémentation. Lexemple suivant urilise un pas d'incrémentation de 2, afin de doubler la vitesse de scrolling, FOR pyx=1 TO 100 STEP 2 Gaff zone{100,py%) NEXT py% Vous pouvéz aussi vous amuser à réaliser un scrolling double en modifiant simultanément les positions X et Ÿ du bloc graphique. nxw={] pyé=l FOR i%= 0 T0 199 Gaff zone{px%,py%) INC px% INC pyi NEXT i% Encore plus fort: faites un scrolling double avec des pas d'incrémentation différents pour les deux axes. px==0 =0 FOR i%= 0 TO 150 Baff zone(px&,pyé) ABD pxt,é INC pys NEXT i% Que vous utilisiez un blitter ou non, il est impossible de réaliser un scrolling plein écran suffisamment mpide avec l'insrruction RC_COPY, Cela ne vous en empêche pas de l’utilisér pour réaliser divers petits effers g[fl;-ll.'li-læufiä.- Le nom d'un logiciel accompagné d'un petit dessin peut apparaîtré en scrollant dans une petite fenêtre, Un long rexte peut être visualisé par petits bouts dans une fenêtre Une série d'icônes peuvent défiler sur l'écran. Certains jeux d'aventure utilr sent une routine dé sctollings pour faire défiler doucement leurs di- Vers textés. Rafraïchissement de fenêtres graphiques Lorsque vous modifiez les caractéristiques d'une fenêtre graphique GFM (taille, position, déplacement dans la fendtre avec les ascenscurs, ctc.), la fenêtre est redessinée. Cette opération (redraw dans la terminologie GEM, redessin, ou encore rafraîchissement) peut Erre réalisée par l'instruction RC_ COPT Une fenêtre graphique est définie par ces paramètres écran (position - de la f‘enêtre sur l'écran, caille de la fenêtre visible), et par un paramiétre interne (position de la lenétre visible par rapport à la fenêtre virtuelle). La fenêtre virtuelle est stockée quelque part en mémoire. fenetre - Adresse mémoire de la fenêtre virtuelle xpos — : Position X de la fenêtre visible par rapport à la fenêtre virtuelle ypos — : Position Y de la fenêtre visible par rapport à la fenêtre virtuelle; Lx : Largeur de la fenêtre visible: ty : Hauteur de la fenêtre visible: px : Position X de la fénêtre visible sur l’écran: py : Position Ÿ de la fenêtre visible sur l'écran. RC COPY fenetre, xpos, ypos, tx, ty TO XBIOS(Z), px, py TELECHARGEZ DES CENTAINES DE LOGICIELS SUR LE 3615 ATARI ATARI MAGAEIHEH BEST OF GFA BASIC GRAPHISME EN GFA BASIC TEURS LOGIQUES Manipulez les pixels Les fonctions graphiques logiques du GFA Basic permettent de réaliser de nombreux effets graphiques (affichage de sprites, vidéo inverse, effets spéciaux, etc.) Découvrons-les ensemble. Fonctions graphiques de base Le GF Basic peut stocker en mémoire et afficher des blocs graphiques grâce aux instructions GET et PUT. L'instruction GET permet de stocker un bloc graphique dans une variable alphanumériqué, alors que PUT permer d'afficher le contenu graphique de la vanable n'importé où sur l'écran. GET x1,y1,x2,y2,img} PUT x,y,imgt L'instruction PUT recopie intégralement sur l'écran les pixels mémorisés dans la variable imy}. On peut aussi mélanger ces pixels de l’image avec ceux de l'écran. Ce mélange peut se faire de différentes manières grice à ce que l'on appelle des opéraceurs graphiques logiques. ' Les opérateurs graphiques logiques Les opérateurs graphiques logiques sont des fonctions grapaiques qui peuvent faire «fusionners plusicurs pixels entre eux au niveau des couleurs. Les opérateurs graphiques logiques sont des fonctions qui servent à mélanger deux images entre elles, Le résultar obrenu dépend des images, mais aussi du type d'opérateurs graphiques utilisé Le mélange se fair pixel par pixel. Pour chaque pixel, la couleur résultante dépend de la couleur initiale, de la nouvelle couleur et de l'opérateur logique. Les opérations entre couleurs de pixels se font au piveau binaire, c'est-à-dire qué les opérateurs graphiques logiques Lravaillene bit à bit, Les opérateurs binaires les plus utilisés sont AND, OR, XOR et NOT. Opérateur graphique logique AND Lersqu'on applique Popérateur AND à deux bits, le résulrat ne vaut 1 que s1 les 2 brts sont à 1. Û 0 0 AND O G AND 1 1 ANDO 1 AND1 Û 1 Lorsque l'opérateur graphique logique AND est appliqué à 2 pixels, le résultat dépend du codage binaire de la conleur des pixels, Par exemple, en appliquant l'opérateur graphique AIND sur un pixel de couleur 13 et un [l-'iït_:] de couleur 6, on obtient un pi:{tl de couleur 4. 1101 (13 en décimal) 0110 (06 en décimal) ---- AND 0100 (04 en décimal) Mise en oeuvre de l'opérateur logique AND Pour eflectuer une opération graphique logique AND entre deux images, 1l faur stocker l'une des images dans une variable alphamumérique avec l’inscruction GET, puis l'afficher sur l'autre image avec l'instruction PUT en spécifiant le parametre supplémentaire 1. GET x1l,ÿ1,x2,ye, 1mg8 PUT px,py,img$,1l Ce petit programme fait une opération logique AND entre l'image définie par les points (x1,y1,x2,52) et l'image commençant aux coordonnées (px,pv). Après son exécution, l'Image commençant aux coordonnées (px.py) est la résultante des ? images de départ. Intérêt de l'opérateur logique AND L'opérateur AND est Lrès pratique pour réaliser des affichages en ombre chinoise- Prenons une image basse résolution faite urique ment avec des pixels de couleur 0 et 15. En affichant cette image sur l'écran avec l'opérateur graphique logique AND, on observe un phénomène très umportant: les pixels de couleurs 0 sont bien visibles sur l’écran, mais ceux de couleur 15 ont disparu. La couleur 15 se code 1111 en binaire, et la couleur © se code 0000 ALARI .‘-MGAEIMEE BEST OF GFA BASIC 3 @ 2Eh en binaire. Lorsque la routine d'affichage à fait un AND logique entre les pixels de l'écran ec ceux de l'image de test, tous les pixels ANTDés avec la couleur O se sont retrouvés 2 0, alors que tous les ANDés avec |z couleur 15 n'ont pas été modifiés. n AND 0000 = D (0000 = 0 en décimal) n AND 1111 = n (1111 - 15 én décimal) On appelle certe technique affichage en ombre chinoise car elle ne permet d'afficher que des images d'une seule couleur. Fm%rumme de démonstration de l'opérateur logique AND Avant d'Étudier le programme de démonstration de l’opérateur graphique logique AND, il faut savoir que le GAA Basic utilisé sa propre table de couleurs, En elfet, après une instruction DEFFILL 2 1 tracera des rectangles graphiques de couleur 1, et non 2. Ve la table de conversion couleurs récls/couleurs GE4 Bastc: - Couleurs réelles 01234567 89 1011 12 13 14 15 Couleurs GFA Basic 0 2 3 6 4 75 89 10 11 14 12 15 13 1 Les seules couleurs qui ne sont pas modifiées sont les couleurs 0,4 et 12. En fait, il he s'agic pas d’un bug du GFA Baste, mais du système graphique VDI présent dans les ROMs du STE. II faut utiliser la couleur 1 pour obtenir à l'écran la couleur 15. Arrention: les logiciels de dessin graphiques travaillent avee les véricables numéros de couleurs, c'esc-à-dire que les pixels traces avec la couleur 15 sont en couleur 15, Le programme de démonstration affiche une petite image conslituée d’une bande de couleur © ¢t d'une bande de couleur 15 (couleur 1 pour le GF4 Basic). Cette image est stockée dans la variable alphanumérique image$. Elle est affichée à la position (100,10) grâce à Finstruction FUT. Elle est ensuite affichée avcc l'opérateur logique AND à la posimon (200,10). DEFFILL 2,6,2 PEOX 0,0,319,199 DEFFILL 0,1 PEOX 10,10,60,60 DEFFILL 1 PBOX 20,20,50,50 DEFFILL O PBOX 30,30,40,40 GET 10,10,60,60,imaget VOID INP(2) PUT 100,10, images VOID INP(Z) PUT 200,10,imaget,l VOID INP{2) ERD En &xécutant ce programme, vous pourrez vénfier que les pixels de couleur O sonr affichés sur l'écran ec que les pixels de couleur 13 ont disparu. Cette rechnique fonctionne aussi en moyenne et haute résolution, mais les numéros de couleurs changent. Etant donné que les couleurs en moyente résolurion sont codés sur 2 bits, il fauc travail ler avec les couleurs © er 3 {0 et 6 en tenant compte de la bug des couleurs VDI). De même pour la haure résolution, il faut travailler avec les couleurs 0 et 1 (D et Z pour tenir compte de la bug des couleurs- VDT). Opérateur graphique logique OR Lorsqu’on applique l'opérateur OR à deux bits, le résultat ne vaut 1 que si au moins l’un des deux bits &t à 1. Ü OR Q = UUR 1= 1 U@R) = 1 U1R = En appliquant l'opérateur graphique OR sur un pixel de couleur 13 et un autre de couleur 6, on obtient un pixel de couleur 15. 1101 (13 en décimal) 0110 (Dh en décimal) ---- DR 1111 {15 en décimal) Les propriétés importantes de l‘opérateur graphique logique OR sont les suivantes: n OR 0000 n OR 1111 | 1111 Démonstration de l’opérateur logique OR L'opétareur graphique logique OR est obrenu de la mamière survante: PUT px,py, imagef,7. Le même programme de démonstration que AND donne le résulrar suivant: tous les pixels de couleurs 15 sont visibles après l’affichage en mode OR, alors que tous les pixels de couleurs © ont disparu. C'est un résultat inverse de celui obtenu avec l’opérateur logique AN DEFFILL 2,2,7 PBOX 0,0,319,199 DEFFILL 0,1 P&0X 10,10,60,60 DEFFILL 1 PEOX 20,20,50,50 DEFFILL Q PEOX 30,30,40,40 GET 10,10,60,60, image$ VOID INP(2] PUT 100,10,image$ ATAR mmzwffi BEST OF GFA BASIC VOID INP(Z) PUT 200,10,imaget,7 VOID INP(2) END De la même manière que pour l'opérateur AND, on peur uriliser Popératenr OR en moyenne et haute résolution en changeant le numéro des couleurs. Opérateur logique XOR Lorsqu'on applique l’opérateur XOR à deux bits, le résultat ne vaut 1 que s1 seulement l'un dés deux bits esc à 1. 0 0R 0 = 0 0R 1 = 10 0*" 10R ] " e e T En appliquant l’opérateur graphique OR sur un pixel de couleur 13 et un de couleur 6, on obtient un pixel de couleur 11. 1101 (13 en décimal) 0110 (06 en décimal) ---= H 1011 (11 en décimal) L'opérateur graphique logique XOR est réversible, c'est-à-dire que l'on permute une opération logique pour revenir aux données de départ (13 XOR 6 = 1Let11 XOR 6 = 13). n XDR a b XOR a Utilisation de l'opérateur logique XOR L'intérêt de XOR est de pouvoir afficher un objét sur 'éeran, et de revenir à l’image initiale en réaffichant l’objet une seconde fois. Cela peut paraître curieux, mais fonctionne bien. Le programme de démonstration suivant vous convainera. ' DEFFILL Z,2,2 P8OX 0.0,319,199 DEFFILL 0,1 PEOX 10,10,60,60 DEFFILL 1 PEOX #0,20,50,50 DEFFILL O PEOX 30,30,40,40 GET 10,10,60,60, imageï VOID INP(2) PUT 100,10, image$ vVOID INP(2) i |'WÉETÉT ÉR ETRE REE E ! * AFFICHAGE MODE XOR * 1E E R RR R UR A R N d d E E SE E PUT 200,10,image$,6 VOID INP(2) 1 khe e d kL : * REAFFICHAGE MODE XAOR * 1 Ph R R R R E s E É UEU e d PUT 200,10, image$,6 VOID INP(2) END Les premiers jeux d'arcades sur micro-ordinateur urilisatent le mode graphique XOR pour afficher leurs sprités. Le résultat était plutôt Curieux au niveau des couleurs, mais cela fonctionnait rapidement et les urtilisareurs de l'époque n'én demandaient pas plus. Opérateur logique NOT L'opérateur logique NOT est un peu particulier, puisqu'il ne travaille que sur un seul nombre Les bits du nombre sont inversés (les 0 deviennent des 1, et les 1 deviennent des C). NOT 1 = 0 NOT O. = 1 1101 (13 en décimal) —- NÛT 0010 (Z en décimal) On obrient le mode logique NOT en donnant le paramêtre supplémentaire 12 à l’instruction graphique PUT. PUT px,py,image$,12 L'opérateur logique NOTI sert notamment à inverser les couleurs d'une image. Cela peut être utile pour alficher des zones d'écran en vidéo inverse. Le programme de démonstration suivant Invérsé une image de test, DEFFILL 2,2,2 PBOX 0,0,319,199 DEFFILL 0,1 PBOX 10,10,60,60 DEFFILL 1 PREOY 20,20,50,50 DEFFILL À PROX 30,30,40,40 GET 10,10,60,60, images VOID INP{Z) PUT 100,10, images ATARI MÆË:ÆliHEË BEST OF GFA BASIC VOID INP(2) PUT 700,10,image$,12 VOID INP(2) . END Les autres opérateurs graphiques logiques Le GFA posside 16 opérateurs graphiques logiques. Nous n'avons présenté que les 4 principaux, Vous pourrez rouver la description des 12 autres modes à la page 196 du manuel du GÆd Basee 3.0, Applications des opérateurs graphiques logiques Flles sont très nombreuses. INous allons vous en présenter plusieurs que vous pourrez réutiliser dans vos programmes, Visualisation d'une icône en vidéo inverse La vidéo inverse æst un moyen pratique de visuäliær une option ou une commande en cours d'exécution. Par exemple, le burcau de GEM visualise en vidéo inverse le fichier courant, c'est-à-cire le f1- chier sur lequel l’utilisateur vient de cliquer. Vous pouvez faire la même chose en utilisant l'opérateur graphique logique NOT. La vidéo inverse peut être urilisée pour visualiser une action en cours. Supposons que vous aycs pmgmmmë LI pfitit soft de g-r:l:t[nn utilisant un système de commande à base d'icônes. Lorsque l'iatilisateur clique sur une icône, celle-ci passe en vidéo inverse et ne revient en vidéo normale que lorsque le craitement est termuné. Le propramme suivant montre comment ce système peut fonctionner, Lorsqu'une routine de traitement est exécutée, elle efface la souris, saisit le dessin de l'icône dans une variable alphanumérique et réaffiche ce dessin en vidéo inverse grâce à l'opérateur graphique logique NOT. Une fois le traitement achevé, Ia routine réaffiche l'icôné normale avec PUT, PROCEDURE exec impression HIDFF GET xl,yl,x2,y2,iconef PUT xi,yl,icone$,17 IIIIII IIIIII PUT x1,y1,icone$ SHOWM RETURN Cependant, au lieu d'afficher l'icône en vidéo inverse, vous pouvez vous amuser à afficher une petite image visualisant le tratement en cours. Pour une impression, ce peut êtré une plume et du papier. Pour un tri, un facteur regardant une énorme pile de papier d’un air découragé, etc. Affichage d'une police de caractères L'opérateur graphique AND permst de programmer une routine d'affichage de curactères. On peut ainsi créer de nouveaux câractéres de n'importe quellé taille e les unhiser dans les programmes en GFA Basic. MNous avons vu que l'opérateur graphique AND peut äfficher des dessins dont seuls les pixels en couleur O sont visibles. 51 ces pixels visibles forment la matrice d'un dessin, 1 suffit alors d'afficher le dessin d'un caractère en mode AND) pour voir apparaître celui-ci. La matrice du caractère doit être dessiné dans la couleur O, et les autres pixels doivent être en couleur 15. PUT 100,100,caracteres,l Les difflérentes matrices doivent êtres stockées dans un tableau alphanumériqué. Pour afficher le caractère n, il suffit d'afficher le dessin mumérg 1. DIM car$(255} PUT 100,100,car${n) Les caractères sont toujours affichés avec la couleur 0. Cela peut paraftre contraignant, mais il n'en est rien, Comme par hasard, bezucoup de logiciels commercialisés n'affichent que des catactères en couleur @ {ou en couleur 15). La meilleure manière de créer vos nouveaux caractères ost d'utiliser un logiciel de dessin type Degas Fitte, Une fois les caractères dessines, il faut utiliser un programme de saisie générant un fichier binaire. | RR ÉÉ NN NEAEEE - A GENERATEUR DE * ! = POLICE DE CARACTERES * L RR R RR R OE ÉÉ RE RE À RESERVE 50000 DIM cark(255) @charge degas("POLICE.PI1") ésaisie car Ésauve police("POLICE.CAR") END | HR TAA deh ek RR N VS ! # POSITION DES CARACTERES * Lo g o e d r À d e o E " DATA px, p¥. num car ' =1 = fin de DATA DATA 0,0,65 DATA 8,0,66 DATA 16,0,67 DATA 24,0,68 DATA 32,0,69 DATA -1 PROCEDURE saisié car LOCAL px,py,n 4] READ px EXIT IF px=-1 READ py FOEHHJflÈEfiIHüEIIËiËIEEËTEËHÊEËEHËE READ MN GET px,py,px+7,py+7,car${n) LOOP RETURN PROCEDURE sauve police(nom$) LOCAL i, OPEN "o",#1,nom$ FÜR 1=0 TO 255 1=LEN(car$(1}) IF [=0 OUT #1,0 ELSE OUT #1,1 BPUT #1,VARPTR{cars(i)),] ENDIF NEXT 1 RETURN Le programme suivant charge la police de caractères POLICE. CAR en T ol e e o e ol ol e o e Y T T f S ok AFFICHAGE . ' * POLICE DE CARACTERES * RESERVE 50000 DIM car$(255) Ëcharge police("POLICE.CAR") DEFFILL Z PEUX 0,0,319,199 Bafftext(30,30,"HELLO WORLD™) VOID INP(Z) END PROCEDURE afftext(px,pv,m$) LOCAL i,xaff,n xatf=px OR i=1 TO LEN(m$) cS=MID${(m#,1,1) n=ASC{c$} IF LEN{car${n)}==0 PUT xaff,py,car$(n},1l ENDTF ADD xaff,8 MEXT 1 RETLIRN PROCEDURE charge police(nomf) LOCAL 1,1 OPEN "i",#1,nom$ FOR 1=0 TO 255 1=INP(#1) 1F 1=={ carf(i)=SPACES$(1) BGET #1,VARPTR{car$(i)),] ENDIF NEXT 1 RETURN L'affichage d'iun message complet se fait caractère par caractère, La routine AFF MESSAGE affiche un message à la position (px*,py%). I peut arcmver que le programme tente d'afficher un caractére qui n'a pas été redéfini. La routiné d'affichage reste done la caille de cer$(n) pour vérifier si le dessin du caractère n'existe Cere routine d’affichage fonctionne avec des caractères d’une largueur de & pixels, mais rien ne vous empêche de la modifier pour des caractères plus larges. Police de caractères de couleur 15 En affichant les caractères avec l'opérateur graphiqué logique AND, on obrient des caractères de couleur C En urilisant l'opérateur graphique logique OR, on peut obtenir des caractères de couleur 15, Il faut alors modifier le dessin des caractères, Les matrices dorvent être dessinées en couleur 15 sur un tond dé couléur O. Affichage dans n'importe quel sens La routine AFFTEXT présenté plus haur affiche les rextes de la gauche vers la droite. Vous pouvez la modifier pour qu'elle affiche les textes vers le bas ou vers le haut en incrementant ou décrémentant la position py d'affichage. La routine AFFTEXTZ affiche le rexte en direction du bas. Après chaque affichage, la position courante d'affichage est augmentée de & pixels, PROCEDURE afftext?{px,py.m$) LOCAL 1 LOCAL xaff LOCAL yaff LOCAL n xaff=px yaff=py FOR i=1 TD LEN{m%) c4=MID$(m#,i,1) n=ASC(c#h) IF LEN(car#(n}}<=0 PUT xaff,yaff,carf(n),l ENDIF ADD yafîf,8 NEXT 1 . RETURN La routine AFFTEXT3 affiche le texte en direction du haut de l’écran. Après chaque affichage, la position y d'affichage est diminuée de B pixels. PROCEDURE afftext3({px,py,m#) LOCAL 1 LOCAL xaff ATARE MAGAZIN Efi BEST OF GFA BASIC LOCAL yaff LOCAL n xdff=px — A yaff=py FOR i=1 TO LEM(m$) c$=MID4 (m#,i,1} n=ASC{c}) IF LEN{car}{n})==0 PUT xaff,vaff,cart{(n),;1 ENDIF SUB yaïît,8 MEXT 1 RETURN Une variable SENS AFFICHAGE peur contenir le type courant d’fii-‘ chage. La routine générale d'affichage peut sélectionner une routine d'affichage spécifique en fonction du contenu de SENS_AFFICHAGE PROCEDURE affmessage(x,y,m#) SELECT sens affichage CASE 1 Gafftext(x,y,m5) CASE 2 Gafftext#[x,y,mé) CASE 3 GafFtext3{x,y,m$) ENDSELECT RETURN En utilisant des méthodes plus complexes, on peut afficher des textes en suivant une forme géométrique, ou le bord d'une image. Le problèmé est de déterminer Palgorithme caleulant la position d'une lettre quélconque. Disparition progressive d'une image En urilisant l'opérateur graphique logique AND, il est possible de faire disparaître progressivement une image. En affichant un masque fait de 2 couleurs (0 et 15) avec l'opérateur AND sur l’écran, on cache certaines parties dé l'écran. Pour effacer progressivement une 1mage, il faut afficher une séric de masques avec de plus en plus de pixels de couleurs 0. Le dernier masque doit être entièrément en couleur 0. PUT px,py,masquelf,1 PAUSE L% PUT px,py,masque2b,l PAUSE t% PUT px,py,masque3h,1l PAUSE t% PUT px,py,mesque45,1 Lés instruetions PAUSE servent à diminuer la vitesse d'effacement de l'imaisé, Säns ces temporisations, Peffacement se ferait trop rapidement pour être visible. Les masques d'effacement peuvent être générés de manière aléatoire par une routine spécifiqué, mais aussi dessinés avec un logiciel graphique. L'imagé est progressivement envahic par la couleur C. Ce procéidé d’effacement n'est donc valable que sur un fond de couleur 0. En remplagant l'opérateur graphique logique AND par l'opérateur graphique logique OR on obtient un effacement progressif en couleur 15. Cette autre technique n'est valable que sur un fond de couleur 15. Apparition progressive d'une image En inversant le processus, il est possible de faire apparaître progressivement une image. C'est une techtique très utilisée par les programmeurs de jeu pour afficher les titres de leurs logiciels. En général, ces ticres sont affichés sur un fond de couleur 0, donc avec l’opérateur graphique AN L’affichage est plus difficile à réaliser que l'effacement car il doit être réalisé dans un écran virtuel afin d'obtenir un bel effer visuel. Le programme suivant recopie l'écran dans un écran virtuel d'adresse adr ecr®, L'affichage sur l'écran physique est réalisé avec l'instruetion EMOVE On peur aussi utiliser l'instruction RC_COPY L4=2 ! adr ecri=MALLOC{32000) BMOVE XBIOS(2e)cr,k,a 3d20r00 VOID XBIOS(5,L:adr ecr®,L'XBI0S(2),-1) PUT px,py,imagel PUT pï,pï,masquE1È,1 BMOVE adr ecr%,XBIOS(Z),32000 PAUSE t4 PUT px,py,images PUT px,py,masquel$,1l BMOVE adr ecr%,KBI05(2),32000 PAUSE t% PUT px,py,images PUT px,py,masquel$,1 EMCVE adr_ecrä,ïfilüä[fi},ï?Üüfl PAUSE t# PUT px,py,images PUT px,py,masquel$,1 BMOVE adr ecr“%, XBIOS(322)00,0 VOID XBIOS(5,L:XBI05(2),L:XBI05(2},-1) On peut aussi remplacer les masques aléatoires par des masques péométriques pénérés par programme, On peut ainsi allicher une image sous la forme de petirs cercles ou de petits rectangles s'agrandissant pour reconstituer l'image complère. Cela peut aussi sérvir pour les effacements d'images. Avec des masques assez grands, on peut même faire une image qui s'affiche à partir d'un nom. Cela permét de faire un effet trés spectaculaire, mais qui prend bésucoup de place mémoure. Affichage de sprites de dimensions quelconques Un sprite est une image qui peut s'afficher sur un fond quelconque. Contrairement à l’affichage en ombre chinoise, les sprites doivent ATARI MAGAZIN E BEST OF GFA BASIC être de plusieurs couleurs. On ne peut afficher un sprite avec un seul opérateur logique. Il faut faire deux opérations graphiques logiques à ]fl Eiui'l.l'.'. Un sprite est constitué d'un masque et d'une forme. La forme contient le dessin proprement dit du sprite, et le masque contient les informations sur les pixels de la forme devant être affichée. Le dessin du sprite est fait sur un fond de couleur 0. Le masque est un dessin de couleur O sur un fond de couleur 15. Les pixels én couleur O du masque correspondent à ceux de la forme devant être affichée. La technique à mettre en oeuvre est la suivante: l’image résultante doit être de la couleur de la forme si le masque est à G, et de la couleur du fond si le masque est à 15. L'affichage d'un sprite se fait pixel par pixel. Le principe est toujours le méme: si le pixél de masque est à 0, le pixel de forme est affiché: et si le pixel de masque est à 15, le pixel de l'écran n'est pas modific. On arrive à ce résultat en deux étapes: le masque est d’abord affiché avec l'opérateur logique AND, puis la forme est affichée avec l’opérateur logique OR L'affichage du masque se fait avec le mode logique AND. Les pixels de l'écran qui se trouvent en interaction avec les pixcls du masque de couleur & se changent en conleur O (puisque n AND O = Q), Les pixels de l'écran qui entrent en interaction avec les pixels en couleur 15 du masque ne changent pas de couleurs (puisque n AND 15 = n} On 2 alors une image en ombre chinoise de la forme à afficher. L'affichage de la forme se fait ensuite avéc le mode logique OR Les pixels de l'écran qui se trouvent en interaction avéc les pixels de couleur O de l'image restent inchangés (puisque & OR n = n). Les p& xels de l'ombre chinoise prennent automatiquement la couleur des pixels de la forme (puisque n OR 0 =n). PUT px,py,masque$,1 PUT px,py,forme,/ Fabrication automatique des masque et des formes - Il n’est pas très facile de dessiner les formes et les masques des sprites. Pour éviter cela, le plus simple est de dessiner une seulc image et d'écrire un petit programme générant automatiquement la forme et le masque du sprite. Cette tachnique est celle de la couleur transparenté. Le sprite est dessiné avec un logiciel graphique. L'uné des couleurs (généralement la couleur 15) est dite transparente, c'est-à-dire qu'elle ne sera pas affiché à l’écran et correspond aux pixels de l'écran qui ne doivent pas être modifiés par l'affichage du sprite. Une fois le sprite dessiné avec une couleur transparenté, il faur générer le masque et la forme. Le masque est généré en remplagant la couleur transparente par 15, et les autres couleurs par 0. La forme est générée en remplaçant la couleur cransparente par 0. Le programme suivant fabrique un masque ct une forme à partir d'une image avec couleur transparente, Remarque: en raison du bug de couleurs du VDI, ce programme utilisé la couleur 1 et non la couleur 15, x1=10 yl=10 x2=4{ y2=d{) trans=s1 I GET xl,yl,x2,yZ2,images Bgen masque GET xl,y1,x2,y2,masque$ PUT xl,vl, image$ @gen Torme GET x1,v1,x2,y2, formet END PROCEDURE gen masque LOCAL px,py FOR py=vl TO y2 FOR px=x1 TÜ x2 IF POINT(px,py)=trans* PLOT px,py,l ELSE PLOT px,py,0 ENDIF NEXT px NEXT py RETURN PROCEDURE gen forme LOCAL px,py FOR py=yl TO y£ FOR pxexl TO x2 IF POINT(px,py)=trans* PLOT px,py,0 ENDIF NEXT px NEXT py RETURN Une fois le masque et la forme stockes dans les variables masque$ et formes, il ne reste plus qu'à les afficher ou à les sauver dans un fichier binaire pour une utilisation ultérieure, Des sprites dans n'importe quelle résolution On peut afficher des sprites dans n'importe quelle résolution à condition d'adapter le numéros des couléurs. En moyenne résolution, les masques doivent être de couleur © sur un fond de couleur 3, et les formes sont dessinées sur un fond de couleur 0. En haute résolution, les masques dorvent être dessinés en couleur 0 sur un fond de couleur 1 et les formes sur un fond de cou- Icur 0. En créant un sprite avec une couleur transparente, on perd cérte couleur qui ne peut Être utilisée dans le dessin du sprite. Cc n'est pas très génant en basse résolution, puisqu'il reste encore quinze couleurs. Par contre, il ne reste que trois couleurs en moyenne résolution, et 1 couleur en haute résolution. Il est donc préférable dé dessiner les masques des sprites à la iriain (c'est-à-dire avec un logrciel graphique) pour la moyenne et la haute résolution. On évite ainsi de perdre une couleur. ATARI mmszE BEST OF GFA BASIC Au lieu de perdre du temps à taper les listings des programmes, simplifiez-vous la vieen commandant la disquette BEST OF GFA, contenant tous les listings de ce numéro et des images Degas Elite utilisabalveecs les programmes graphiques. Voir bon de commande en page 50 Le contenu de cette disquette est également disponible en téléchargement sur le serveur 3615 ATARI, sous la forme d'un fichier portant le nom de BESTGFA.TOS. Des avanfages supplémentaires exclusivement réservés aux abonnés de Start micro magazine Wotre abonnement vous donne accès à " 3615 MICROHELP" Wotre abonnement vous procurera des réductions intéressantes sur le téléchargement et l’achat de disquettes de logiciels du domaine public Wotre abonnement vous fera bénéficier de tarifs promotionnels sur certains logiciels du commerce Ahnnne:-vuus et économisez immédiatement 30 F Bulletin d'abonnement au verso O OUI, je m'abonne à START MICRO MAGAZINE pour un an à partir du numéro à paraitre (11 numéros dont un double en juillet/août) au prix exceptionnel de 360 F au lieu de 440 F (prix au numéro) J'ai bien noté que je bénéficierai du service exclusif d'assistance télématique 3615 MICROHELP. Ci-joint un chèque bancaire ou postal (exclusivement, pas de mandat) libellé à l'ordre de FC PRESS. Mes modalités de foncäonnement du service ons que voire code d'oceks personnel vous seront communiqués dès l'ouverture du serveur. Toffra wolchle pour la France seulement. Etranger nous consulier. Attention : envoyer ce bulletin et votre chèque à : FC PRESS 57, rue Danton 92300 LEVALLOIS-PERRET Nom i tl 5oy én e L] o T T l R L Prénom Aty MY A A e < R Adresse é ek e 0o TC Ll P L LA | e el SR ol e d e S e [ ) RE L o RE RS Codepostal | | 1 i gy 1 L. 1 1 | Ville P T N TP fs e T R . [ e ä.<.-----.___.…..----..----.--.-.----..'.---._-....-.---...---.......-..---..--…---.-.-----.---.......….... DOSSIER FALCON Présentation du Falean 030 Multimédia pour fous TOS 4.0 et MULTITOS 505 COURRIER Les réponses h vos questions ESSAI LOGICIEL L'onti-virus Ulhmate Virus Killer Le fraitement de texte Papyrus . GRAPHISME aqiciel de royirocin P DKBTRACE ° La couleur de À & / TABLEURS Tronsférer vos données entre 5T ¢ PC MUSIQUE Les messages AIDH ACTUALITE De nombreuses news Falcon 505 COURRIER Las réponses à vos questions MUSIQUE Les messages MIDI suite.. PORTFOLIO Interface Midi Pocket Music EUREAUTIQUE Le tableur Groal Cale 3 EDUCATION L’ordinateur est un jeu d'enfant SYNTHESE D'IMAGES Espaces de |1.|m|E|n:5 Lagiciet rup ique vber Shadows Les nouveautés graphiques PHISME Logiciel Persistence of Vision 1.0 Mode d'emploi de Néochrome Master :'l n.” d EDUCATIF Vive l'école COMPARATIF Conscles de jeu portables JEUX Les jeux de rôle INITIATION Les différentes lypes de virus PROGRAMMATION 3 nouvellés palices de caractères en Gfo Basic TELEMATIQUE Les nouvéautés du téléchargement LA DISQUETTE DU MOIS 49 accessoires indispensables JEUX Jeux d'erventures sur Micro TEST MATERIEL Fax Modem SUFÉEM-Pé2é DOMAINE PUBLIC Sélection de 56 programmes à posséder absolument. TELEMATIQUE Les nouveautés en téléchargement Les jeux PC en téléchargement Flflfifl.fimflfl'fl Ecrivez “un logiciel d-:rl'l'r vous êles le héros” Animation d%n amique én asic Fichiers à accés directs en Omikron Effets spéciqux Ëru phiques en AssemD'eur . DISQUETTE DU MOIS Le lagiciel de dessin Néochrome Master 2.27 Une biblicthéque d'imeges Pour commander, remplissez lisiblement ce bon (ou une Eä envoyez- \e accompagné du réglement à : FC PRESS- 57, rue Danton- 92300 Levallois-Perret Je commande le n°1 O, le n°2 © à 38 F le numéro. T | numéro(s) à 38 F = Lecssvans F + 15 F de frais de part et d'embollage (30 F pour I'étranger et les DOMTOM) por chèque & l'ordre de FC PRESS. Nom T R u e e e P E S Prénom e Sl E 6 t e m e tL n srrr e Adresse é CR T C P £ gy e i d e | e | S O R S P 1 e Codepostall 1161* 15 pogo Lop 1 ). | Ville e o S - Y (] Y e S PS Pays T e e T SE E S Start LA MODELISATION DES OBJETS 3D d 'Hitcon| SLokr | UL LE MULTIMEDIA A LA MAISON JOURNAL L'ALTERNATIVE FANZINE INITIATION SAUVEGARDEZ VOS FICHIERS TEST LOGICIEL PARALLELE 3D LES REPONSES A VOS QUESTIONS SO ' o .fi- L" = .hfi.. I ' . | — LS [ UE [ __'\-- e PE R e L T Lo1 tMLU E -__\-_ll-"_d'î_,._!'.'r'l- EZ PE T I_::l:!:'ldul'l"l-ll_llll I / PE A 0R | j‘h“— "n . [ ï * F r |' TPEF tdéwE i Fhx ; PE ; .l- . = e e E L e ms F ; - ; ; | ETE A e r e o 8 Prenez les commandes cIEE_ 3 meilleurs logiciels de simulation: 10 Vroom, F19 Stealth Fighter, ùs Silent Service !!! n .. (avec la super commande Zoomer) rl = — - " k (, I"-.r -:"-.-_- — É 1 - Î L - J Ë P L Il_.-" B= F =x "

1)
xmé⇐x0%} OR (ymé⇐v05) OR (kné=0
2)
pxé==x15) AND (pxèe=x2%) AND (py==y1%) AND (pyd==y2%
back2root/archives/jeu-de-role-en-gfa-basic/zz-wip.txt · Dernière modification : de frater