Ceci est une ancienne révision du document !
Ce texte est une reproduction des articles parus dans le magazine Atari Magazine dans le Hors Série Best of GFA Basic De Janvier 1993
Cet article est en cours de transfert depuis un OCR fait a partir de l'archive disponible sur www.abandonware-magazines.org, merci à eux pour le formidable travail d'archivage.
La programmation d'un jeu de rôle facon Ultima passe par la réalisation d'un éditeur capable de définir la carte d'un monde médiéval fantastique. Notions de base ? Dans les jeux de rôle de type Cfrimer-ou Aentarsy (hste non lemitanive}, le Joucur gére les actions d'uné équipe de personnages. Celle-ca se déplace sur une grande carte réprésentant l’ensemble du monde de jeu. Seule une partie de la carte est affichée à l'écran. C’est une sorre de fénêtre de visualisation qui se déplace sûr là carte totale. Lorsque ilï_!!:i pPÉrsUnnages e ljl'l:i.'!ll‘:l.-:.'-l:l'.l'l..l IJ. funÈtru IMCHIÈTE ]i]. []ULI“.-'-L‘HI_‘ ].”U'.iiliüîl. Dessin de la carte L'univers de jeu doit être vaste pour que le joueur ait le plaisir de l'explorer. Cela nous empêche de stocker le dessin de la carte sous la fi':lr'rnf: ll'l.“:l'll'l[Ï 'il_l'_l.:li_:_f”.l l‘.li‘.-lfl' llll.'Ë“'. mis-;nn:—: I:]fl Fli-fll'_'l.'f mémuir&. .[.l-!'llË ['l'l'”.'ii“:_”f de 3X0x220 pixels en basse résolution occupe 32 Koo Une image de 1600800 pixels, équivalent à un espace de 5×4 images écrans, occupe une place mémoire de 640 Ko. C'est beaucoup trop pour un 520 5T et même pour un 1040 5T, en tenant compté de la taille prise par le programme ot les autres données graphiques Dessin avec éléments graphiques de base YA l.'iliiLl. I.]I_I !':ZLI'_PL'l:'i.EI.' |-.5I:]..-Ii_:l“-I: L:II'_' IH. carie Cil ].HIËIËI'I.E]'LIII-J”I::. Ch J_.i'-l:'LIL J.-'-.'I. I'L‘L'IEE:UI.' ner avec des élements de basé. Une foret peut étre dessinée avec A ou 7 {.:'Ii'l:ml_'“['ltil TEFIë |_i“-“ill=“|1l;': CHI] LETI l-.l:l‘r'l'l'l. I.'.ll['.fil] r:“nnt 'l-.l.'l.”'. T l'l]'ll':l l.”ËË'i-ÜE]'l de beaucoup d'élemonts différents. A la ngucur, une foréc peut S dessine avec une seule petite image représentant un arbré, et la montagne avec un seul élément représentant la silhouerre d'une cime. (st le procédé utilisé par bon nombre de logiciels de jeu du com- FICFce, Pl”l'l_l:l“ I::Il:_”; |_..|.i::i|:.;'r'.:'i li_'i;hrli:.[ul;'i L]'L'l.i Li:l_'l'II-II:Tll: El. l’rjrg:hni!-:ati:m I.:Il_':'i mémoires vidéos, les elements ont le plus souvent une taille de lôx16 pixels ou 32×32 piæels, Une carte esr alors mémorisée sous la forme d'une lisre d’éléments Ë'l'“..'l.'l:lhiqüfl_:j I:::!Il'l TËL[E ._“'Îl'.l:'ll'_'l'i.::l- LECLE [i:-:.L-: ijfiflfi 11F Ï.EIZ_J.IOE'LI. rlurrïrl:riqu:_' ä. deux dimensions, dont le type dépend du nombre d'éléments possibles. Avec moins de 256 élements, ce qui est déjà énorme, on peur utiliser un tableau de vvpe BYTE (svmbole |), chaque élément du tabléau n'occupant qu'un bctét én mémoire. Avec des éléments de 16×16, une carte de 1600x8C0 pixels peut être stockée dans un tableau de 100×50 cléments, occupant une place mémoire de 5000 octets. 5a déclaration se fait de la manière suivante: OFTION BASE 1 DIM carte|{100,50) L'instruction OPTION BASE ! foree le basic à numérotér ces tableaux à partir de l’indice 1 et non & Four calculer le gain de mémoire enrre les deux méthodes, il faur prendre en compre la place mémoire prisé-par les éléments praphigues. ; Un élément graphique de 16×16 pixels stocké dans une variable alphanumérique grâce à l'instruction GET occupe une place de 134 nc ters, ce caloul ayant ête fait avec l'instruction LEN qui détermine la raille d'une variable alphanumérique. GET 1,1,16,16,varf PRINT LEN(vars) L’expérience montre que l'on peut dessiner des cartes complètes avec bien moins de 200 éléments différents. Clest donc une valeur limite accéptable pour fairé quelques calculs. Vous utiliserez certainement moins de 200 clements pour créer vos propres cartes. Pour la perite histoire, les premiers jeux Ultima ont été dessinés avec seulement quelques dizaines d'éléments. Le srockage de 200 éléments graphiques prend 26800 oététs. DIM element$(200) En additionnant la place prise par le codage de la carte t par 200 éle ments graphique, on arrive à un total de 31800 ocrets (5000+ 26800), Dans notre cas particulier, le gain de place apporté par le-codage de la carte est de 20, maus saméliore considérablement a1 la carte est plus grande que 100×50 cléments ou s1 le nombre d'objets gra phique est plus petic que 200. Cetté téchnique offre un gros avantage pour le développement d'un logiciel: la carte est facile à dessiner une fois que les éléments de base SONt CTÉES. ATARI MAGAZINE m BEST OF GRA BASIC Même un non-graphiste peut réaliser une jolie carte à partir de beaux éléments de hase. Dessin de la carte Ultima La portion de carte affichée par les jeux Ultima à une dimension de 176×176 pixels, et est constitué de 11×11 clements de 16×16 pixels. La position de l'équipe de personnages est visualisée par une silhouerte en noir affichee au milieu de l'écran. Lors des déplacements, l'image de la carte est redessinée de manière à cé que l'équipe soit toujours au centre de l'image visible, Programmation d'un système de déplacement style Ultima Pour réaliser un systéme de déplacement similaire à celui d'Ultima en GEA Basic, il faut résoudre un certain nombte de problémes techniques. Nous avons déjà vu que le codage de la carte peur être stocké dans un tableam numérique et les éléments graphiques de base dans un tabléau alphanumérique, mais il reste bien des questions à etudier. Comment est-ce que les éléments graphiques sont stockes dans le tableau alphanumérique? Comment afficher rapidement là carte aussi bien sur un STF que sur un STE? Comment stocker les différéntes données sur disque? Comment gérer les déplacements de l'équipé sur la carte? Toutes ces questions sont trop difficiles à gérer dans un seul article, c'est pourquoi ce texte est séparé en deux parties: la première est consacrde à la créition d'une carte et la seconde traite de son utilsation pour gérer les déplacements de l'équipe, Définition des éléments graphiques On suppese que les éléments graphiques de base ont êté dessinés par un graphiste avec un logiciel de dessin type Degas Elite où equivalent. Nos précieux cléments sont donc stockes sur disque dans une image au format Degas, Le programme GENELEM,GFA lie l'image Degas ELEMENTS.P11 et stocke les éléments graphiques dans un fichier binaire ELEMENTS . BIN réucilisable par un autre programme. La structure du fichier binaire est la suivante: 32 ocrets contenant la palette de couleur des éléments graphiques, un oot unique conténant le nombre d'élements du Hehier et le codage des éléments, chacun oecupant 134 octets. La position (x,y) des éléments sur l'image est définie dans une série de DATA à la fin du programme, la fin des données étant signalé par la valeur -l
HM ELEMENTS GRAPHIQUES # LRNF RE RR E RE e e RÉSERVE 100000 DIM element${200) nb elements“%=0 palette$=SPACE4(32) Bload dégas(“ELEMENTS.PI1*) @saisie_elements @sauve elements({“ELEMENTS.BIN”) END e e 44 E RE W W E R W R R * CHARGEMENT-IMAGE * = DEGAS ELITE 8 E T T R P e e T o E E S FRAR N A r L AR ARk AR * * La palette est stockée dans la ” * variable globale palettes ,j UR RIRF REN RN R Rk RE É RE PROCEDURE !oad degas(nom$) palettef=SPACE4(32) OPEN “T”,#1,nom$ SEEK #1,2 . BGET #1 VARPTR(palette$}),37 VOID XE10S(6,L-VARPTR(palette*)) BGET #1,XB105{2},3#000 CLOSE #l RETURR B o e E T e b É el RE * GENERATION FICHIER BINAIRE * “ ELEMENTS GRAPHIQUES & d e e N AI E R RE N A PROCEDURE sauve elements{fichier$) LOCAL 1% OPEN “o”,#1,Tichier} BPUT #1,VARPTR(palettet),32 OUT #1,nb elements® FOR i%=1 TO nb elements“ BPUT #1 ,VARPTR(element5(15)},154 MEXT i% CLOSE #1 RETURN 1 N T e RR E R P PR L TR R E o e R T i CHARGEMENT DES % * ELEMENTS GRAPHIQUES * C e RE e dc d PE E E e E A R E R RS PROCEDURE saisi EEl ements LOCAL ns LOCAL px%, pyi LOCAL px2%,py2% nE=0 RESTORE def elements g READ px% EXIT IF pai==1 READ pys . INC n pxé4a=px=+ls pyess=pystis GET px%,py¥,px2%,pye%,elemants(n%) LOOP nb_élémentss=n ATARI MAGAZIME m BEST OF GRA BASIC RETURN | HLJNE SREE i POSITION DES n ! * ÉLEMENTS GRAPHIQUES * | ETEN eE ol e o R E def elements: DATA 1,1 DATA 18,1 DATA 35,1 DATA 52,1 DATA 69,1 DATA 66,1l DATA 1,18 DATA 18,18 DATA 35,18 DATA 52,18 DATA 69,18 DATA -1 Programme EDITCART Le programime EDITCART est un éditeur de carte virtuelle écrit entiérement en (FEA Basié: Tl sauve les cartes éditées dans des hchiers binaires, pouvant être relus et exploités par d'autrés programmes. Ses fontions sont: lecture d’une carte à partir du disque, sauvegarde de la carte courante sur disque, déplacement sur la carte, modification d'un élément quelconque de la carte, sélection d'un élément sraphique, affichage d'une boîte d'informations et aption pour quitter lc programme. Le tout est entiérément géré à la souris, Attention: l'éditeur à besoïn d'un fichier d’éléments graphiques pour foncrionner. Exéeutéz le programme GENELEM avant d'utiliser EDITCART. Le nom du fichier d'élements graphiques est ELEMENTS.BIN par défaur, mais vous pourrez le modifier dans le code source d'EDITCART, ou ajouter une fonction permettant de charger n'imparte quel fichier d'éléments graphiques. La simplicité n'est pas de ce monde Initialement, cet éditeur a Été conçu pour être simple à utiliser et à -:-:-mprr:nfln:. Hélas, il s'est averé impossible d'écrire des routines d’affichages simples et performantes aussi bien sur STE que STF [dommage que tous les ST ne soient pas dotés de blitter). Les routinés d'affichage de EDITCART utilisent donc des techniques de programmation un peu complexes à comprendre pour un programmeur debutant. Un système d’affichage simple La première méthode qui vient à l'esprit est de réafficher entiérement l'écran après chaque déplacement. Dans l’evemple qui suit, le codage de la carte est stucké dans le tableau CART E|() et les éléments graphiques de base dans le tableau ELEMENTS(). La procedure Gaff carte dessine la carté sur l'écran. La pésition du morceau de carte visible par rapport à la carte virtuelle cst contenu dans les variables lîgne carte ec colonne_carte. En mettant Tigne carte ot colonne carte à 1, lé côté haut gauche de la carte est affiche sur Pecran. Pour déplacer là carte d’une position vers la droite, il faut incrémenter la variable colonne liane de 1 et appeler de nouveau @aff carte. Fnur_q:'LËFÏ:m':,r la carte d'une position vers le bas, il faur incrementer ligne carte er exécuter Baff carte. Remarque: la position (1, 1) correspond au premier indice du tableau conténant la carte, grice à l’instruction OPTION BASE 1 Sans celle- ci, le premier indice du tableau a la position (0,0). Le morceau de carte visible est affiché à l'écran à la position définie par les variables xcarte* et ycarte*. Etant donnd là sccucture interne de la mémoire vidéo et la manière dont fonctionnent les Instruetions graphiques du GE4 Basic, il est préférable d'utiliser une position d'affichage en x multiple de 16, alin d'accélérer la vitesse d'exécution. OFTION BASE 1 scartes=16 vcarté%=5 ligne cartes=30 cn]unng_cart&%=ñ? éaff carte END PROCEDURE aff carte i LOCAL 1%,c0% LOCAL 1ignes LOCAL colonne% LOCAL nums LOCAL posx LOCAL posy® posyesycartes ligne¥=ligne cartes FOR 1=1 TO 11 posx#=xcartes colonne*=colonne carte* FOR c%=1 TO 11 numé“carte| (colonne®, ligne#) PUT posx%,posy&,elements{(numé) INC colonnes ADD posx%,16 NEXT c& INE ligne= ADD posyé,16 NEXT 1% RETURN Pour gérer les déplacements, il suffit d’avoir une série de procédures modifiant les variables de position en fonction de la direction de déplacement. Pour des misons de sécurité, ces procédures doivent controler que le -l:ié[;];mt‘.m:m né sé fasse pas en dehors des limites de la carte. ATARI MAGAZINE H BEST OF GFA BASIC PROCEDURE aller haut IF ligne cartes==1 DEC 1igne cartes Baff carte ENDIF RETURN PROCEDURE aller bas IF ligne cartese=ligne max® INC ligne carte% Baff carte ENDLF RETURN PROCEDURE aller gauche 1F colonne cartesss-1 DEC calonne cartes Baff carte ENDIF RETURN PROCEDURE aller droite IF colonne carte*=- INC colonne cartes Gaff carte ENDT F RETURN Ce système est parfait sur le papier, mais une fois mis en ceuvre, il se révéle trop lent pour une utilisation pratique, cas de figure fréquent en informartique, La solution passe par une amélioration du principe de base. Un redessin partiel de la carte On peut gagner du temps en ne redessinant qu'une partie de la carte. Lors d'un déplacement vers la droite, la colonne 1 disparaît de l'écran et les colonnes 2 à 11 sont décalées d'une pasition vers la gauche, le programme ne dessine vraiment que la nouvelle éolônne 11, De la même manière, lors d'un déplacemient vers la dronté, seule la colonne 1 est nouvelle, Puisqu'une partie de la carte est justé décalée, au licu de le redessiner, on peut la déplacer en une seulc opération graphique. L'une des solutions possible est de lire la portion de carte avec l'instruction GET er de l’afficher à sa nouvelle position avec PUT, Cette technique fonctionne, mais présente uñ inconvénient d'ordre esthétique, L'oeil humain est un outil trés perfectionné qui est capable d'analyser et de décomposer la structure d'un mouvement rapide. C'est souvent un avantage, mais dans notre cas particuliér, c'ést un inconvénient: si la routine d'affichage travaille en deux étapes, cela produit un effet graphique nuisible visible. Pour éviter cela, il faut que l’affichage s'effectne en une seule fois et le plus rapidement possible, La seule manière d'obtenir un affichage rapide est de réaliser les opérations graphiques en mémoire et de les recopier rapidement sur Pécran en une setle opétration. Afin d'obrenir un résultat graphiqué encore meilleur, le programme EBITCART utilise une variante de cetté technique: il dessine la carte däns un écran virtuel, puis change l’adresse de la mémoire écran par l'adresse de cet écran virtuel. Ainst, on évité de recopier l'imagé sur l'écran. La fonction XBI0S(5) permet de changer l'adresse de la mémoire écran. Sur un STEE cette adresse peut être quelconque, alors que sur un STE elle doit obligatoirement être un multiple de 256. L'adresse initiale de l’écran est multiple de 256. Il faut créer une zone de 32000 Dclets pour l'écran virtuel. L'inscruction MALLOC permet d'allouer une zonc mémoure de à octéts Cette zone métnoire commence oblipatoirement à une adresse paire- Pour obtenir une adresse multiple de 256, 1] faut déclarer avec MALLOC une zone de 32255 octets ct masquer les deux derniers bits de l'adresse Le résultar est une adresse multiple de 256 qui ports sur une zoné mémoire de 32000 octers contenus dans la zone mémoite de 32255 octets déclarée par le programme, C'est un peu compliqué mais cela marche bien, adr tampon#=MALLDC(32255) adré#=(adr tampon%+255) AND KHFFFFFFO0 Les vartables adrl% et adr2% contiennent l'adrésse des deux écrans. La varable adr1% contient l'adresse inimiale de la mémoire écran et adr?% contienr l'adresse de l’écran virtuel de 32000 octers. L'atfichagé se [ait en bascule. Lorsque l’adresse de la mémoire ééran est post tionnée sur adrl®, l'image de la nouvelle carte est dessinée dans adr?% Lorsque l’adresse de la mémoire écran est positionnée sur adrls, l'image de la nouvellé carte est dessinée dans adriér Lorsque le programme a terminé de dessiner nne image en mémoire, l change Padresse de la mémoire écran grace à l'mnstrucrion XB10S(5}. Artention: la fonction XBI0S(5) peur être appélée à rous moment par le programme, mais le gestionnaire d'éctan ne change Padresse de la mémoire‘écran que lorsque l'image courante à ét éentiérement dessinée, St vous urilisez trop rapidement l'instruction XBIOS(5}, seul le dernier changement de mémoire d'écran sera pris én compré. Pour éviter ce probléme, aprés avoir wrilisé XBI0S(5), il faut attendre que le gestionnaire d'écran aic affiché entierement l'image écran. Ce test est réalisé avec l'mstruction VEYNC Celle-er bloque l'exécution du programme tant que le gestionnaire d'écran atfiche l’image courante (il y à 50 images affichés par seconde). vOID XBIOS(5) VSYNC Format de sauvegarde des cartes Les cartes génerées par EDITCART ont une taille de 30 lignes de 60 colonnes. Four changer fa taille, 1l faut modifier les variables nb_colonnes et nb Tignes sans dépasser les limites du tableau carte( 700,75). Les cartes d'EDITCART ont le formar suivant: 19 octers conténant la chaîne “CARTE JdR ATARI MAG” un octer contenant le nombre de calonnes, un octet contenant le nombre de lignes et le codage de la carte (là taille de cé codage est égal à nb colonnesxnb |îgnes ot tets). La chaîne est un en-tête d'identification. 5i vous tentez de lire un fichier n‘avant pas d'en-tête, le programme affiche un message d'érreur. Le nom d'une carte doit impérativement avoir uné excenson .CAR, ne l'oubliez pas au moment de taper de la carte à sauver (c'est l'unique moment où Péditeur utilise le clavier). ATAR| MAGAZINE m BEST OFGFA BASIC | HÉVÉENVÉATAETETETTTENNAETEREETAEE E 8 EDITEUR DE CARTE ñ r POUR JEU DE RÔLE = st STYLE ULTIMA * L é d e e e 46 ok e e e e d d d e SE SE e ol e e e R “ % - (C) 1991 -ATARI MAGAZINE * * (C) 1991 PATRICK LECLEREG # RR B b R E RR RR E R RR RR RE EF E RESERVE 100000 OPTION BASE 1 DIM element$ (200) adr tampon&=MALLOC(32255) ad?2%=[adr_tamflun%+255} AND SHFFFFFFOO adr1*=XB105{#) nb colonness=60 nb_lignes*=30 DIM carte|(200,75) Gmair VOID XBIOS(5,L:adrl%,L:adrl%,-1) CLS VOID MFREE(adr tampon%) END PROCEDURE set ecr Tog(adr ecrans) VOID X810$(5,L:adr ecrans,L:-1,-1) RETURN PROCEDURE set ecr phys([adr ecran“) VOID XBIOS(5,L:-1,L:adr ecran*,-1) RETURN — — ===” c=s cs — e ] e e e e e C A 045446 GRR A UE UE É ÉÉ R AN RE E E S ' # ATTENTE ARRET CLIC SQURIS * 1 el e e e o e e e e e e e d Sl et e e r ol PROCEDURE attbclac i) EXIT IF MOUSEK=0 LOUP RETURN PROCEDURE Euurîa_fleche DEFMOUSE 0 RETURN PROCEDURE souris abeïlle GEFMOQUSE Z RETURN | e e e ke o i E o o RE S R ok RR RN ‘% TEST CLIC SUR ZONE ÉCRAN * A A A A r P e S S o d e m LT FUNCTION tstzone(x*,y%,px5, pyé, txs, tyf) LOCAL results result%=l IF xe<pxs — resu]t*=0 ENDIF IF x4=px&ttx+-1 result#0 ENDIF LF yésepys result#=0 ENDIF IF yve=pysitys-l result=eD ENDIF RETURN resuLl% ERDFUNE I B o A S ARl e B e o be ' * EFFACEMENT ECRAN | NAAAÉERERF REÉSEREE RTEN PROCEDURE cls _ ecran(e®) DEFFILL c% FBOX 0,0,319,199 RETURN # Ah b o i i E É É e i e e e S A RR AT * # AFFICHAGE CADRE GRAPHIQUE w | RR L e R LR S E PROCEDURE cadre[px%, pys,tx%, tyd, f=,bé) LOCAL pxé%, pyes pxés“pxe+txe=l pyés=pyésttys-1 DEFFILL f # FEOX pxS,0V5, pad%s, pyas COLOR bé BOX px%,py%,px2%,pyd% RETURN | ERRRREAA TR RR AN N EEFE “ * AFFICHAGE MESSAGE * * DANS ROITE DE CLIC 1 ETENESÉ É R PROCEDURE aff boite(ptxad,% ty,f, pFésy, Déssa m,é) LOCAL pxes, pyes LOCAL xaff=,yaff4 pXx24=ox=+Lx==-1 pyeés=pyt+tys-1 xaffs=pxt+(tx5-LEN(m$}#8)/2 yaffa-pyetôt(tyt-7)/2 ATARI MAGAZIME H BEST-OF GRA BASIC w ¥ DEFFILL 3% PEOX px%,pye, prés, pyés COLOR b* EOX px* pyt, pX24 , pyd=x TEXT xa, fvafffä,*mf RETURN | IRRFN ENF F ! * CHARGEMENT DU FICHIER BINAIRE % ! + CONTENANT LES ELEMENTS GRAPHIQUES * I ORRÉÉÉÉTARARRE NN RR E E RRARERARA RE PROCEDURE charge elements({fichierf) LOCAL n% LOCAL palettet ; palettet=SPACE$(32} OPEN “1” ,#1,fichierf BGET #1,VARPTK(palette$),32 VOID XBIOS (6;L:VARPTR(palette$)) nb elementsi=INP{#1) FOR n%=1 TD nb_elements* element$(n%)=5PACE$ (134) BGET #1,VARPTR(element#(n#}},134 MEXT n% CLOSE #1 RETURN L EACAAUARERE S R RR E RE RV e e d d d e * * INITIALISATION DE LA CARTE * | RE d e d e e e R e A E PROCEDURE init carte ARRAYFILL carte[(),l RETURN D R e b L e R S R o ' * AFFICHAGE IMAGE EDITEUR * | AAAARARE RR RRN RR RE AN RR RE ÉÉ E PROCEDURE aff ecran @cls ecran(1) écadre(xcarte®-l,vcarte=-1,175,178,1,0) DEFTEXT O écadre(776,11,48,36,2,0) Gaff boîte(229,14,20,14,3,0,CHR$(1)) Caff boite(229,30,20,14,3,0,CHR$(4}) @aff _boite(251,14,20,14,3,0,CHRE(2)) Gaff boite(251,30,20,14,3,0,CHR543)! Eaff_bnite{195,55.11G.13.E,fl.“IHFflRHHTIflHS'] Eaffflhnite{195,33,11D,13,E,U,”GUITTEH FRG“) @aff boite(195,111,110,13,2,0,”CHARGER CARTE“) @aff boite(195,138,110,135,2,0, SAUVER CARTE”) Bcadre(223,164,54,22,2,0) Paff boite(225,166,14,18,3,0,CHR3(4)) @cadre(241,166,18,18,2,0} Gaff boite(261,166,14,18,3,0,CHRE(3)) Gaff element courant RETURN | TRLNXE ik | * \AFFICHAGE-DE LA * 4- CARTE YTSIBLE —# L R A R e d d e d d r d e e u B PROCEDURE aff carte LOCAL 1%,0% LOCAL Tigne% LOCAL colonnes LOCAL nums LOCAL posxs LOCAL posys posy&=ycartes lignes=-ligne cartes FOR 1%=1 TO 11 posx%=xcartés colonne“=colonne cartes FOR c%=1 TO 11 num*=carte| (colonne#, ligne#) PUT posx%,posy#,element$ (num*) INC colonne* ADD posx%,16 NEXT c% INC lignes ADD posy*,16 NEXT 1% RETURN L ANE e d E # AFFICHAGE DE * ' * ELEMENT COURANT * | AIF o o o ol e ETE E PROCEDURE aff element courant LOCAL old ecr¥ oid ecri=XBI0S(3) êset ecr log(adr1%) PUT 242,167,element$(element_courant*) Bset ecr log(adr2%) | PUT 242,167,element$(element courant*) set ecr log(old ecr%) RETURN ï ä | RRRNRERRERÉAEREEREETEEERARERE RIRN | — CESTION PERMUTATION DES ECRANS * | AARRRRÉTEÉ RR RA RR RR WV EVVRREEL kRl E PROCEDURE preparation ecr travail ATAR| MAGAZIME fl BESTOFGFA BASIC 1F etat%=1 ; ecr visibles-adrl® ecr travail%=adr2% ELSE ; ecr visible%-“adr?# ecr travail%=adrl% ENDIF etlat⇐-etat= üset_ecfi_ïügLflcrütraïaîîäj RETURN | d d e R R RR RR E E A d d d d d | = VISUALISATION DE LA CARTE * b d sl ok é e dc d e d e e o Sk e e d e d d e m e A A e E PROCEDURE visualisation ecr travail Bset ccr phys(ecr travail®) VSYNC RETURN lNF o S o e e o s L RESRE ' * DEPLACEMENT VERS LE HAUT * [ L L R R R WN R e e PROCEDURE aller haut LOCAL ecrl%, xl%,yl% LOCAL ecrX2234 y,l LOCAL pxs,py4 LOCAL c%,colonne* LOCAL n IF ligne cartese=I DEC lîgne cartes HIDEM éprepareacrt tiraovanil ecrli=ecr visibles x]“=xcartes Y1%=ycartes écre4=ecr travail# Ké4=excarte y25=ycartet+lb RC COPY ecrl¥,x1%,yl%,1760,100 TÜ ecret,xé*,yés colonne#=colonne cartes px*=xcarte% pys=ycartes FOR c%=1 TO 11 nk=carte| (colonne#,ligne carte%) PUT px%,py“#,elementi{n=}) INC colonnes ADD px#,16 NEXT cÆ @visualisecar ttriavoainl SHOWM ENDIF RETURN | E e E d C ETE T R r éc e rr e d e E “* DEPLACEMENT VERS LE BAS 7 1 e E ÉÉÉF TT E EU R PROCEDURE aller bas LOCAL ecr. xll%,¥%1% LOCAL ecre%,x2y%l, LOCAL px%,pyé LOCAL c%, colanne= LÜCAL n* IF ligne carte%==nb lignes%=-10 INC Tigne carte* HIDEM éprepareacrt tiraovanil ecrl®=ecr visibles x1l&excartes yléycartes+ib ecr2%=ecr travail# X24=-xcartes vi=ycarLes HE_EÜPÏ écrl®,x1%,4v1#,176,160 TO ecrd® 2%, y2% colonne*=colonne carte prE=ncartes; pyé=ycarte=+160 FOR ¢%=1 TO 11 né=carte| (colloignne _n carete#s+1,0) PUT px%,pys,elementi{nw) INC colonne*” ADD px*,16 NEXT c% Evisualisecar ttriavoainl SHOWM ENDIF RETURN DRF e ke e e e e R R W R R e ok e e e e e o ” = DEPLACEMENT VERS LA GAUCHE = ï E E E e b c0 L b de de d A RR d E E S PROCEDURE aller gauche LOCAL ecrls,x1%,y1% LOCAL ecrz%,x2%,y2% LOCAL px=,pys LOCAL 1,ligne% LOCAL n* IF colonne cartes==1 DEC colonne cartes HIDEM Épreparation ecr travail écrls=-ecr visibles xl%=xcartée* vl&=vcarte* ecr&%=ecr travail# xés=xcarles+1b vi*=ycarte% RC COPY ecrl#,x1%,y15,160,176 TO ecrd%, x2%,yZ% ligne==ligne cartes px*=xcartew py*=vcartes ATAR| MAGAZIRE BEST OF GFA BASIC FUR 1==1 [0 11 né-cartel(colonne cartes,ligne%) BRUT #1,VARPIR(entete})1,9 FILESELECT paths,“ ” ,noms LOCAL côlonne clic® OUT #1,nb colonnes* SPUT fondd LOCAL ligne* PUT px* ,py,elements(n°) OUT #1,nb ligness IF noms==“” LOCAL colonnes INC Tignes FOR c%=1 TD nb colonness @souris abeille ; LOCAL old_element® ADD py&,l6 FOR 1%=1 TD nb lignes% OPEN “T”,#1,nomk i NEXT 15 QUT #1,carte|(e*,1%) entéte$=SPACES(14) xsxmé-xcartes Gvisualisation écr travail NEXT 1% BGET #1,VARPTR{enteted),19 Vs ymé=-vcartes SHOWM HR NEAT cæ IF entetef⇐“CARTE JdR ATARI MAG” ligne clic*=(y%/16) ENDIF CLOSE #1 CLOSE #1 colonne clic&=(x%/16) RETURN @souris fleche Bsouris Fleche ligne%=ligne clic#ligne carte* ' RETURN mi=“CE FICHIER ME CONTIENT|PAS DE CARTE® colonné#=colonne click+colonne carte* E kbR e B R M RE RL R i e E E , ALEHF fl'm5.1.” ÜË Hjh% i * * DEPLACEMENT VERS LA DROITE * E PEN ETE A E L ELSE old elément%=carte| (colonnes,ligne#) L v R Rk é é b e d r R F ÈÊÜÏEËAËÜE ÉAHÏE SUH ÜIEÛUE * PROCEDURE aller droite | #* INTERFACE UTILISATEUR A ' ok e e e B AW LOCAL Eürï%:ïlaiïl# | T T T S e E w LOCAL ecr2%,x2%,y25% PROCEQURE sauver carte nb colonnes%=INP{#1) nb lignes&=INP{(#1) FOR c==1 TO nb colonness FOR 1%=1 TO nb lignes# IF old element*=#element courant carte|(colonne%,ligne%)=ecloeumreanntt posx4=colonne clic&*l1b+xcarte# posy*=ligne chics“lb+ycartes LOCAL px*,pyt LOCAL nomb,paths carte/ (c*,1#)=INP{#1)] HIDEM LOCAL 1%, 1igne% LOCAL b% NEXT 1% * PUT posx*,posy*,element${(element courant*) LOCAL é LOCAL fFonds NEXT c% SHCWM ' ’ CLOSE #1 ENDIF 1F colonne carte*nb colonnes=-10 HIDEM ligne carte%=1 RETURN INC colonne cartes SGET fonds colonne carte%=1 | HIDEM ¥ . SHOWM Gaff carte | Rk Rk RR RESRE Bpreparation ecr travail path$=DIR#{0)+“\#.CAR” ésouris fleche * € OPTION 'QUITTER LE PRG' * ecrlis=ecr visibles FILESELECT path$,™ ”,nom$ ENDIF T AN A A d d x1%=xcartex+16 IF nomp==“” EMDT F PROCEOURE quitter programme yl=ycarte* IF EXIST{noms) RETURN LOCAL m8,t5,b% ecréé*=ecr travail% n6=“NO DE FICHIER EXISTANT. ” ; ' «Ptexcartes mé=m£+“ |CONTINUER SAUVEGARDE ? |” J bs hc e bbb e odofnl kot etk sortie==0 vax=ycarte# ALERT O,mb, 1, “OUT | MON” , b “ * INCREMENTATION ELEMENT COURANT * m$=“VOULEZ-VOUS VRAIMENT |QUITTER CE PRG ?” RC COPY ecr1%,x1%,y1%,160,176 TO ecr?5,x2%,y24 LF bx=1 C E RR SE A E E RE de A e o e e P E E RE EhuîïË=“ÜUÏ|NÜH° 1îfihe%=]igne_nartn% ËE!EE_SEHVÈT_ÇËFËEÏNÜNEÏ PROCEDURE inc element ALERT U,mb,2,choix5,bé px%=xcarte#+1650 _ ENDIF 1F element courant¥⇐nb elementss [F b%-=1 pyérycarteï | ELSE INC element courant* sortiet=l FOR 1=1 TO 11 Bexec sauver carte(noms) Baff element courant ENDIF né=carte|(colonne_carte*+10,1igne%) ENDLF ‘ Gattüelie SHÔWM PUT px%,py3,elements{n#) ENDIF ENDIF RETURN INC Tigne% HIDEM RETURN ! ADD pyè,16 SPUT fondé | | RR RE E NEXT 1% SHOUM | RR RR RIR E RR RR RR RRN RE E ! # OPTION INFORMATIONS #* Bvisualisation ecr travail RETURN ! = DECREMENTATION ELEMENT COURANT * R el R tJ E EHÜHM = i ! | kx hhdaaxéhéxbhdddmm é éh d d e e É ON pHÜEEDUHE fiff_iflfflfi ENDIF ' - PROCEDURE dec element LOCAL m§,b% RET”HH R B R e b & e b b b b L RE TR RS E RE IF ÈîËmÊflt EÜHT&HË%{?I i | * * CHARGER CARTE A PARTIR DU DISQUE * DEC element courants m&=“EDITEUR DE CARTE EN GFA BASIC ” RRh dc ÉÉÉ É É R ok kAR E R TRN VNA RE REN E RIR Baff É]Ë…Ëfiï courant m$=m5+“|{E] 1991 ATARI HflEflEIHE“ | * SAUVEGARDE CARTE SUR DISQUE = PROCEDURE charger carte . gattOelie — mà=m3+” |(C) 1991 FATRICK LECLERCE “ + FONCTION SYSTEME Ë LOCAL nom$,paths ENDIF ALERT 0,m$,1,“ OK ”,b% D niede e s i ok v b A o o W o R R R A e e TR LOCAL entete} RETURN RETURN PROCEDURE exec sauver carte(nom$) LOCAL 1%,c% - . : LOCAL enteteï LOCAL b% | hhh e n v gk e d e e e e e et e e s e R W | AEAARAHRRHRRER RR A WWEK LOCAL 1%,c% LOCAL ms #* CLIC SUR UN ELEMENT DE LA CARTE #* | # GESTION ÉDITEUR * ! LOCAL fonds 1R e RRN E R E e e e cd e e hhE V E E E E E A EA @souris abejlle OPEN “O”,#1,nomb SGET, fonds entete$=“CARTE JdR ATARI MAG” path$=DIR${0}+“\#.CAR” ATARE MAGAZIME m BEST OF GFA BASIC PROCEDURE clic carte(xmé,ym) LOCAL =%y,é LOCAL ligne clich PROCEDURE gestion editeur LOCAL xmé, ym%, km% ATAR| MAGAZIME fi BEST OF GFA BASIC JEU DE ROLE EN GFA BASIC DO nb el ements==0 00 MOUSE Xm, YMéÉE , sRIF EXIT IF kmf==0 LOGH 1F @rstzone(xm®, ym*,195,83,110,13) Bguitier programme ENDIF EXIT IF sortie%=] IF Btstzaone(=m%,yms,195,56,110,13) Paff infos ENDIF 1F @tstzone(xms,yms,195,111,110,13) @chargér carte ENDIF IF @tstzone(xmè,ymt,195,138,110,13) Esauver carte ENDIF IF Gtstzoynmè,e 22(8,x14m,20é,1,4) Baller haut ENDIF IF Ctstzone(xmé,ymé,251,14,20,14) Catler bas ENDIF IF @tstzone(xmé, ymé,251,30,20,14) éaller droite ENDIF [F @tstzoynmk,e 22(9,x 30m,20é,1,4) Baller gauche ENDIF 1F Ptstzone(xm®,ymé,xcartes,ycarte*,176,176) Bclic carte(xmé,yms) ENDIF IF Btstzone(xm26s1,% 16,6y,1m4,s18,) @inc element ENDIF IF @Btstzone(x22m5,%16,6,y 1m4,s18,) Bdec_element ENCIF LOUP lîgne carte%=l colonne cartes=1 element courant=-! xcartes=6 vcartes=l= Gcharge elements (“ELEMENTS.BIN®) @init carte HIDEM GRAPHMODE 2 @aff ecran @aff carie BMOVE XBIOS(Z2),adr2%,32000 @souris fleche SHOWM etats=1 @gestion eciteur RETURN Pour finir Nous verrons le mois prochain comment uriliser les cartes générées par EDITCART pour gérer les déplacéments d'une équipe de personnagés sur un monde virruel (affichage de l'image de l'equipe sur la carte, gestion des rencontres, interdictions où Autorisation de deplacements sur certaines cases, e'n:] Vous trouverez én E:ËlÈ:härg,Emflnl: sur le 3615 ATARI les listings de l’article, un exemplé de carte et une image Degas contenant quelques éléments de dessin. Patrick Leclereq TOUS LES LISTINGS ET IMAGES DE CE BEST OF GFA BASIC SONT DISPONIBLES EN TELECHARGEMENT Ë PROGRAMMATION JEU DE ROLE (I Un jeu de rôle fonctionnel Voici un petit jeu de rôle type Ultima ou Fantaisy où le joueur se déplace sur une carte de grande dimension et fait de dangereuses rencontres. - Présentation du jeu Le joueur gére les déplacements d'un personnage dans un univers de tvpe médiéval-lantastique Cet univers &l représenté sous la lorme d'une carte de grande dimension dessine avec des éléments graphiques de base (arbre, maison, montagnes, lacs, ete.) La carte est créce avec lc programme EDITCART (voir jeu de rôle II). La carte est trop grande pour être dessinée entière à l’écran. Le programme en affiche juste une petité portion, représentant les environs Ce dernier se trouve au milieu de l'image visible. Les déplacements sont réalises en scrollant l'image de la carte L'image de la carte est fabriqué avec 11×11 éléments graphiques mesurant chacun 16<16 pixels. Elle mesure 176×176 pixels. e S e et T el s e E + | #mmmmmm e PE L e d l + | | | | | | | | I | | | | Dessinde | [ Zone de | | I'| la carte | | messages | | | | (] | | | | | | | | | trmme m————m— F f-=snmmmmmmm e i E n t RSP 0 r Bl e + Les fleches du pave numérique servent à indiquer la direction du déplacement. Le programme interdit le déplacement sur cercains types de case (plans d'eau &c montagnes). Lors d'un deplacement, le personnage peut faire des rencontres, Celles- ci peuvent étre bénéfiques, neutres ou hostiles. Leur nature dépend du cvpe de case sur laquelle se tient le personnage. La plaine est bats entre le personnage et les créatures de rencontres. Voir l’article jeu de rôle IV qui présente un systeme permettant de simuler un combat entre le personnage et une créature quelconque Vous pours rez fusionner GESCARTE er le syatème de combat pour obténir un veritablé deplacernent avec rencontres ec combat, Programmation de Gescarte Ce logiciel à été programmé en GE4 Basic 3.5E, mais il est entièrement compatible avec toutes les versions du GFÀ Basic à partir de la version 3.0. Le code source fait plus de 1000 lignes de programme. Ce programme urilise le graphisme, stocke des données sur disque et lit des données à partir du clavier. Il n'utilise mi la souns, à les fonc- '.'.i.[_]]'l.!:i L8] i (] S l'jîl S'T Les données graphiques du programme Le programme GESCARTE à besoin d'un certain nombre de données praphiques. Comme elles ne peuvent être défimes dans le programme, elles sont stockées dans des fichiers. Leur contenu est chargé en mémoire au début du programme. Ces fichiers sont ELEMENTS. BIN, CARTE.CAR et PERSO.HIN, Le fichier graphique ELEMENTS.BIN Ce fichier contient les elements graphiques de 16×16 pixels servant à dessiner l'image de la carte, Ces éléments graphiques sont créées à partir d'une image Depas Elite. La éréation se fait avec l’utilitaire GENELEM.GFA (voir jeu de rôle IT). [a structure du fichier ELEMENT .BIN est la survante : 32 octets contenant la palerte de couleur des éléments, 1 octet contenant le nombre d'éléments du fichier et les éléments graphiques (134 octers par éléun éndroit assez calme ol la majeure parte des rencontres sont mént), La taille d'une variable alphanumérique contenant un bloc de neutres. Par contre, la foret est un endroit dangereux où rodent tou- | 16×16 pixels est de 134 cetérs. Cetre taille peut être mesurée avec la tes sortes de créatures ef de monstres. Le programme affiche les ren- | fonction LEN. contres dans une fenêtre graphique située à droite de la carte. [Jans la version actuéllé. de GESCARTE toutes les rencontres sont | GET 1,1,16,16,block PRINT LEN(bloc$) ATART MAGAZINE H BEST OF GRA BASIC UR SUR LE | 3615 ATARI | XEN AAAAAERESE : # PROCEDURE PRINCIPALE * | RE TR ETEN NTRAEREF PROCEDURE main neutres car la place manqu.alt pour écrire un systeme gerant les com- | ATAR| MAGATINE m BEST GF GFA BASIC j La procédure @charge elements{fichier$) charge dans le cableau alphanumérique element+{[) les dléments stockes dans le fichier fichierf. Le nombre d’éléments changés est éerit dans la varable globale nb elementss. DIM element$(200) PROCEDURE charge elements(Tichier§) LOCAL n% LOCAL palettes palettef=SPACFS5(32) OPEN “1” #1,fichierf BGET #1,VARPTR(palette$},32 VOID XBIOS(6,L:VARPTR(palette$)) nb élements®=INP{#1} FOR n%=1 TO nb elementss element$#{n&}=SPACES (134) BGET é1,VARPTR(elementS(n)),134 NEXT n% CLOSE #1l RETURN La palette de couleurs est chargée dans une chaîne aiphanumérique de 32 caractères. L'instruction SPACES permet de créer une vanable de taille quelconque. Les 32 ocrets de la palette sont chargés avec l'instruction BGET, palettes=SPACE${3#) BGET #1,VARPTR(palette$),32 La taillé de la chaîne de catacrères doit être obligatoirement égale ouù supérieure au nombre d'octets chargés en mémoire, Il peut ÿ avoir n'importé quoi stocké cn mémoire après l'adresse de la chaine de caractère. Un miauvais chargement peut ééraser pu modifier des variables importantes. Clest une excellente méthode pour créer un ‘bue fuetif* très chfficile à crouver, L'insceuction XBI0S(6) permer de remplacer la palétte de couleur systëme par la palette de couleur des éléments graphiques, VOID XRIOS(6,L:VARPTR(palette$)) Le nombre d'éléments du fichier est lu grice à l'instruction INR Celle- ci permer de lire la valeur d'un octet à partir d'un fichier. b _elements*-INP(#1) -y i F] ] Lec éléments sont charvés les uns aprés les autres, La zone mémoire de 134 octers nécessaire au stockage d'un élement graphiqué est réservéc avec l'instructon SPACES. FOR n%=1 TO nb elementss elements (n%) =SPACES {134} BGET #1,VARPTR(element$(n%)),134 NEXT m Les éléments graphiques ont été stockés en mémoiré avec l'instruc tion GET. Pour afficher un élément graphique sur l’écran, 1l faur atiliser l'instruction PUT. L’exemple suivant affiche l’élément numéro ! du tablean element$(} à la position (10,10/. PUT 10,10,element${1) Le fichier CARTE.CAR Le fichier CARTE.BIN contient la deseription de la carte. Il est gÊnEnË par l'éditeur de carte EDITCART, La structure de ce fichier est la suivante un en-tête d'identification de 19 caractères, un octet contenant le nombre de colonnes de la carte, un octet contenant le nombre de lignes de la carte et le codage de la carte proprement dit. Les éléments sont stockes ].Ïgn& 3 EgflE:. l'en-tête d'idennfication est la chaîne de caractère “CARTE JdR ATARI MAG* Cette chaîne peut servir à contrôler si le fichier lus contient bien une cartée. La carte est stockde &n mémoire dans le tableau carte|(). Ce tableau est du type entier court {entier & bits). Etant donné qu'un entier court ne peut prendre que 256 valeurs (de 0 à 255), il ne peut y avoir que 256 éléments possibles. DIM carte|(200,75) Les dimensions du tableau carte|{) sont fixés arbitrairement à 200 lignés de 75 éléments. 5i vous désirez avoir une carte plus grande, 1l faut augtnenter les dimensions du tablean. La procédure Bcharge carte[nomf) charge en mémoire la carte stockée dans le fichier nom$. Les dimensions de la carte sont écrites dans les variables globales nb Tignes®er nb_colonness. PROCEDURE charger carte(nomt) LOCAL entétet LOCAL 1%,c% OPEN “I”,#1,noms entetef=SPACE4(19) BGET #1,VARPTR(entetet},19 nb colonness=INP{#1) nb _ lignes&=INP(#1} FOR c%=1 TD nb colonnes% FOR 1%=1 TO nb 1ignes% carte|(c%,15)=INP(#1} NEXT 1% NEXT c% CLOSE #1l RETURN Cette routine charge Iidentificateur de fichier, mais ne le teste pas. Si vous désirez le faire, la modification est smple à réaliser, comme le montre l'exemple suivant. entétef=5FACE4(19} BGET #1 ,VARPTR(entetet),19 IF entetes==“CARTE JdR ATART MAG”. PRINT “Ce fichier ne contient pas de carte” ELSE ATAR] MAGAZINE æ BEST OF GFA BASIC - Cfargement carte ENDIF Le fichier graphique PERSO.BIN Le fichier PERSO.BIN concient l'image du personnage de 16xl6 pixels. Cette image ese affichée sur làa carte pour visualiser la position du personnage. La procédure Bcharge perso(nom$} charge en mémoite l’image stockée dans le fichier nomf, T'image est mémoriséé dans la variable globale persof. L'image doit être affichée en superposition sur la carte. L'opérateur graphique logique AND permet d'afficher une image en superposition sur un décor quelconque à condition que l‘image soit dessinéé en couleur Q sur un fond de couleur 15, PUT px,py,perso$,l Cette technique d'atfichage est un affichage en ombre chanouse”, Pour obtenir plus de détails sur les opérateurs graphiques logiques ct leurs utilisations, vous pouvez vous rélérer à l’armicle; «Opérateur graphique logiquen, L'image PERSO.BIN est fabrique par le programme IMGPERSU.GFA à partir d’une image Degas contenant la silhouette du personnage | ÉÉTEÉI ES EN RR | # SAISIE IMAGE DU PERSONNAGE # l MSFN SREE ETEe e E E e E RESERVE 100000 @load degas(“ELEMENTS.PI1”) GET 1,35,16,50,persot OPEN “o”,#1,“perso.bin” BPUT #1,VARPTR(perso$),134 CLOSE #1l END | MEFe e e e ! * CHARGEMENT IMAGE # e DEGAS ELITE L | RV RR R R LT BT PROCEDURE load degas{nom$) LOCAL palettet palette$f=SPACE{(32} OPEN “1” ,#1,nomt SEEK #1,7 BGET #1,VARPTR(palette5),37 VOID XBIOS(6,L:VARPTR(palettei}) 8GET #1,X8105(2},32000 CLOSE #1 RETURN Structure de Gescarte Le programme GESCARTE est constitué d'un dértain nombre de modules. Un module est un ensemble de routines qui traite un problème donné. Par exemple, le module de-déplacement s'occupe de gérer entièrement le déplacement sur la carte (affichage de l'image de la carté, mise à jour des variables internes, tests des déplacements possibles, appel du module de rencontre, etc.) Un module est composé d'une où plusiéurs routines principales er de sous-routines dépendant des routines principales, Les modules de-GESCARTE sont: initialisation, module prineipal, interface utilisateur, déplacement sur la carte, gestion des rencontres et gestion de la fenêtre graphique. Il ¥ a aussi un module de foncuions systèmes. Les foncrions systémes sont des procedures de base qui peuvent être réutilisées dans n'importe quel type de programme. Module d'initialisation [ est constitué par la procédure @main, qui initialise les variables du programme, charge en mémoire les données du jeu ec affiche l'image de la carte. Les données graphiques sont stockées sur disque et les données numériques sont définis dans des lignes de DATA, l'initralisation de chaque type de données est réalisé par une procédure particulière appartenant à divers modules. Par exemple, la prôcédure Cinit rencontres appartient au module de gestion des réncontres. Une fois l'initialisarion terminée, la procédure Emain appelle la procédure Égestion programme. Cette procédure est la roulne principale du module prncipalé de GESCARTE Module interface utilisateur L'inrerface utilisateur est le module qui s'occupe de la commiunication entre lé joueur et le programme. l est trés important. Une bonne interface utilisatéur peur faire la différence entre un bon programme agréable à utiliser cù un mauvais programme peu pratique à utl ser. Plusieurs logiciels trés performants sur le plan technique ont éré des échecs commerciaux à cause d'une mauvaise interface ucilisateur, L'intérface urilisaceur de GESCARTE est assuree par les routines Batt ev, Bguitter programme et le module de gestion de là fenètre graphique, : La fonction Batt ev attend que l'utilisateur presse sur une Heéche du pavé numérique ou.sur la touche [Esc] pour rénvoyer un code de fonctions spécilique au progranime, : Flêche haute : Flêche bas : Fléche droite : Flêche gauche : Touche [Esc] An 5 0 9 — Si vous décidez de modifier l'interface utilisatenr de GESCARTE 1l sutfit de moditier Batetv sans changer lc reste du programme, Clest l'avantage d'une communication inter-routines par codes numeériques. Pour rajouter de nouvellés fonctions au programme (examer des possessions du personnage, sommeil, ete.), il faur définir l'action correspondant à la nouvellé fonction (touche du clavier, clic souris, été.) ec lui donner un code. Tous les codes supérieurs à 6 sont dispomibles, La procédure @quitter programme démande à l'utilisiteur une confirmation de sa décision de quittér e programme, Elle affiche une ATARI MAGAZINE a BEST OF GPA BASIC boîte d'alerte avec le message “Voulez-vous vraiment quitter ce pra?” Si le joueur confirme sa décision, la variable globale sortie% est miscal. Module principal Le module principal gère l'exécution du programme. Il est constitué de la procédure @gestion programme et de la procédure Gexec fonction. PROCEDURE gestion programme LOCAL evs DO ev“=Cait ev Bexec fonction(ev®) EXAIT IF sorties=l LOOP RETURN Lä procédure Pgestion_programme contient la boucle principale du programme. Cette boucle s'exécute tant que la variable globale sortie% ne contient pas 1. La fonction @att_ev lui donne le code de la commande sélectionnée par le joueur. PROCEDURE exec fonction(ff) SELECT 1% CASE 1,2,3.4 Bgestion deplacement(f%) CASE 5 Bquitter programme ENDSELECT RETURN La fonction @exec fonction(evi) cxécure la routine associée à la fonction utilisateur % C'est un système d'aiguillage qui dirige le déroulement du programme vers les routines de déplacement ou vers là routine gérant la sortie du programme. Si vous rajoutez des fonctions à votre programme, c'est ici qu’il faut implanter les appels des nouvelles procédures. Par exemple, une fonction permettant d'examiner les possessions du pérsonnage (numéro 6} ou une fonetion permettant de changer l'arme du personnage (numéro 7), ou de boire une potion (numero §), etc. SELECT 1% CASE 1.2,3.4 Ggestion deplacement (f#) CASE 5 Bguitter programme CASE 6 Bexamen possessions CASE 7 Bchanger arme CASE 8 Éboire potion ENDSELECT Module de déplacement sur la carte Il gêre les déplacements sur la carte. Clest le module le plus complexe du programme. Les fonctions apparténant à ce module sont; Pgestion_deplacement, Cinit evenements, Cexéc deplacement Caller droite, Galler gauche, Galler haut Baller bas, @preparation ecr_- travail er @visualisation ecr travail. Avant de plonger dans les détails techniques, voyons comment 5 et fectuent les déplacements. Théoriquement, le personnage se déplace de case en case. Ce serait simple À pérer si voutes les cases était les mémes, ce qui n’est pas le cas, Le déplacement est possible sur la plupart dés cases, mais pas toutes (plan d'eau par exemple). Le personnage peut aussi rencontrer des créatures sur ceftaines cases. Le progranime associe un numéro à -:;h:lqufi type de traitement. Le numéro 0 correspond 4 une impossibilité de déplacement. Le numeto 1 correspond à un déplacement simple, Le numéro 2 correspond à un déplacement sur une plaine. le numére 3 correspond à un déplacement en forft er le numére 4 à un déplacement sur des ruines. Le tableau dev_ev&(num_element#) contient le numéro de traitement associé à l'élément graphique num_element®. Les associations entre les numéros d'éléments graphiques et les traitements sont définies dans des lignes de DATA La procédure @init_evenements initialise le tableau dev ev&() avec les données des DATA def evenements: DATA 1,0 DATA 2,0 DATA 3,2 DATA 4,72 DATA 5,0 DATA 6,0 DATA 7,0 DATA 8,0 DÂTA 9,4 DATA 10,0 DATA 13,3 DATA =1 Les éléments graphiques 1,2,5,6,7,8 et 9 (plan d'eau, montagne, malsons, villages et château) ont le numéro de traitement Q, c'est-à-dire que le personnage ne peut se déplacer sur une case de la carte occupé par l’un de ces éléments. Le traitement 2 (déplacement sur plaine avec possibilité de rencontre) correspond aux éléments graphiques 3 er 4 (dessins de plaines). Lorsque le programme déplace le personnage sur une case de la carte vécupée par un élément de plaine, il appelle |z routine gerant les rencontres en plaine (procédure Brencontre_plaine). Le traitement 3 (déplacement en forét avec possibilité de rencontre; correspond à l’élément graphique 13 (dessin de forét). Le traitement 4 [déplacement sur ruines avec possibilité de rencontre} correspond À Pélément graphique 9 (dessin de ruines/. Routine @gestiondeplacement La procédure @gestion deplacement{direction) sélcetionne le type de déplacement en fonction du type d'élément sur lequel le pecÂTARI MAGAZINE m BEST OF GFA BASIC sonnage vas se déplacer. Une structure SELECT-EMOSELECT sélectionne les routines à appeler en fonetion du eype de trairement. * La case od veut se rendre d * le personnage est définis ” par la position [c%,1%). né=dev ev4{carte\(c*,1%)) SELECT n% CASE 1 Bexec deplacement (direction®) CASE 2 Gexec deplacement (direction#) Érencontré plaine CASE 3 Bexec deplacement (direction®) @rencontre foret CASE à i Bexec deplacement (direction*) Erencontres ruines ENDSELECT Limitations aux bords de la carte Le programme ne gère pas les déplacements sur les bords de l'écran. Rien n'empêche donc le personnage de dépasser les limites de la carte, Pour éviter cela, 1l faut placer une barrière d'éléments infranchis sables aux limites de la carte. Ce peut etre de l'eau où des montagnes. De toute façon, les bords de la carte dorvent être visualisés d'une mamièré logique pour le jouëur. De nombreux programmes du commerce sont limités par la mer, La carte lournie en télechargement sur le serveur 3615 ATARI avec les programmes EDITCART et GESCARTE (sous le nom de JEUGFAZ4.T05) est limitéé par une vasté érendue d'eau sur laquelle le joueur ne peut se déplacer. Routine @exec_ deplacement La routine Gexec deplacement (direction*) exécute un déplace ment simple dans la direction direction® C'est une fonction d'aiguillage qui sélectionne la rourine de déplacement à wtiliser pour gérer le déplacement dans la direction désiré PROCEDURE exec deplacement (direction*) SELECT direction® CASE 1 Paller haut CASE Z Baller bas CASE 3 Galler droite CASE 4 Baller gauche ENDSELECT RETURN Les procédures Galler haut Galler bas, Galler droite er Baller gauche déplacent l'image de la carte dans une direction précise. Leurs scructures est assez complexe car redessimér rapidement l'image de [a carte avec des routines écnites entièrement en GÉA Basic n°est pas simplé. 1l 'est impossible de redessiner Pimage de la carte sur l'écran suffisame ment rapidement pour que le jouéur ne voie pas l’opération s'effectuér. Ce serait possible en Assemblezr, mais pas en GE4 Basic, Pour éviter cet effet graphique désagréable à l'oeil, les routinés de déplacements efféctuent les opérations graphiques dans ün ééran virtuel s» tuë en mémoire Une fois les opérations praphiques terminés, le programme devrait recopier l'image de Îa carte sur l'écran, mais l'expérience prouve que cetré technique n'est pas assez rapide pour obrénir un affichage de bonne qualigé L'image flashe un peu. Pour éviter cela, le programme ne recopié pas l'écran virmel dans la mémoire éran du ST, mas change l'adresse de la mémoire écran par l’adresse de la mémaire virvuëlle, L'écran virtuel devient alors la nouvelle mémoire écran. Le programme travaille sur deux zones mémoires qui sont alternativémént utilisés comme mémoire écran ct ééran victuel. Leurs rôles sont inversés à chaque affichage. Les adresses de ces zones mémoire sont stockérs dans les variables adri% er adr2%, L'adresse de l'écran visible à l'écran est stockée dans la variable ecr visibles, L'adresse de l'écran vircuel cst stockéc dans la variable ecr travaïl#. Lä position de la portion de carte visible par rapport 2 la carte totale est stockée dans les variables 1igne carte% et colonne_cartef Les routines de déplacement modifient ces variables en fonction du sens de déplacement, La routine @aller_ bas Pour comprendre comment fonctionnent ces routinés, la meilleure méthode est encore dé prendre un exemple. Ce sera la routine Baller bas qui déplace Pimage de la carte vers le bas. L'image de la carte est-constituée d’un ensemble de 11×11 éle ments graphiques, c'est-à-cire de 11 lignes constieuées chacune de 11 éléments graphiques. L'image du personnage est affichée sur la case située au mifeu dé la carte (sitième ligne, sixieme colonne). Le déplacement ne s'effectue que d'une ligne à la fois. Seule une partie de l'image est modifiée. Les lignes 2 à 11 sont roujours affichées sur l'écran, avec un décalage d'une ligne vers le haut. La ligne 2 se retrouve à |a place de la ligne 1. La ligne 3 se retrouve à la place de la ligne 2, ete, Senle la ligne 11 doit être redessinée par le programme. Cèrte rechnique de rélfichage partiel permet de gagner béaucoup de temps par rapport à un reaffir chage complet. La procédure @aller bas recopie dans l'écran virtuel les lignes 2 à 11 à la position des lignes 1 à 10. Ensuite, elle redessine l'élément du miligu de la carte qui avait été altéré par l'alfichage de l'image du personnage. Elle dessine ensute la nouvelle ligne, puis affiche l'image dù personnage au milieu de la carte. Une fois la carre cerminée, le programmé change l'acresse de la mémoire écran par l'adrésse de Péeran virtuel. Le changement de Padresse écran est effectué par la procédure @visualisation ecr travail. Etant donné que les adresses de la mémoire écran ec de Pécran virtuel sont inversés lors des déplacements, les messages qui sont affichés dans la fénêtre graphique disparaissent à chaque déplacement pour réapparaître au suivant. Pour éviter cela, la procédure Bco- ATARI MAGAZINME E BEST OF GFA BASIC nie fenetre recopie le contenu de la fénêtre graphique dans l'écran virtuel juste avant l'inversion des adresses, Remarque: La procédure @visualisation ecr travail change l'adresse de la mémoire écran par l'adresse de l'écran virtuel (ecr tras vai15), Ceue procédure utilise la procédure @set_pcr_phys qui vt lise elle-même la fonction XBI0S(5). Cette instruction systéme na pas umne action instantanée : elle attend que le spot vidéo ait finit de dessiner l’image pour changer l'adresse de la mémoire écran. Linstruction VSYNC bloque le déroulement du programme tant que le spot vidéo dessine l’écran, et donc tant que la fonction XBIUS (h) ma pas changée l’adresse de la mémoire écran. Cela permet d'éviter des *havures vidéo” desagréables à l'reil. PROCEDURE visualisation ecr travail êset ecr phys(ecr travail#) VSYNC RETURN Module de rencontres Le module de rencontré gére les rencontres er les découvertes que peut faire le joueur en se déplaçane sur la carté. Il est constitué des routines @rencontre plaine, érencon bre-t0- ret, Arencontre ruines, Btst probabilite, @tirage rençontre, Binit rencontres, @tirage decouverte, @init_decouvertes et @init tables découvertes. Toutes les cases où peuvent apparaîcre des créatures onr une probabilité de rencontre. Lorsque le personnage entré dans l’une de ces cases, le programmie effectue un tirage de probabilité pour déterminer s’il se produit effectivement une rencontre. La fonction @tst probabilite(prob®) permer de savear s1 un événement de probabilité prob se produit effectivement. Elle ren voic la valéur logique vraie (TRUE) si l'événement se /produst er la valeur logique fausse (FALSE) si l’événement ne se produit pas. Le tire g d'une probabilité comprise entre 1 et 100 se fait avec l'instructron RARDOM Une fois que le programme sait qu'il se produit une rencontre, il détermine la nature de la créature en utilisant une table de rencontre, Une table de rencontre est une liste de créatures possédant chacune une probabilité d'apparition. | La fonction @tirage creature(tables) tire une créature de la table dé rencontre tableï, Il existe une table de rencontre pour la plaine, une pour la forêt et une pour les ruines. Les routinés Érencontre plaine, @rencontre foret ec Brencontre ruines gérent les 3 types de rencontres qui peuvent se produire dans GESCARTE Pour comprendre comment fonctionnent ces rautines, prénons l'exemple de Grencontre _ plaine. Cette procécdure gère les rencontres que 12 personnage peut faire dans un environsnement de plaine. La probabilité de rencontre est de 10%. 5 la rencontre se produit, la fénetion @tirage créature permet de déterminer le type de créature rencontrée, Le programme affiche alors le nom de la eréäture dans la fenêtre graphique. Lalfichage se fair avec la procédure éaff Teneire, PROCEDURE rencontre plaine LOCAL creature% LOCAL m3 i IF @tst_probabilite(10) creaturet-@tirage creature(1) mb=“RENCONTRE : “tcreatures(creature=) Gaff fenetre(m5) ENDIF RETURN La routinc @rencontre ruines gère les rencontres, mais ausés la découverte d’un trésor. La gestion d'une découverte se fair de la mème manière que la gestion d'une rencontre tésr de probabilité et rable de découverte, Initialisation des tables de rencontres Une table de rencontre et une liste de créatures avec une probabilité de rencontre. La sonime des prôbabilités d'une table doir être de 035, Le tableau table rencontre®() contient les différentes tables de rencontre du programme. [l peur mémoriser 20 tables pouvant contenir chacune jusqu'à 30 prubabilités de rencontre, DIM table rencontref [EÜ.ËÜgË_Ï' Le tableau table rencontre%(t%,r%,1) contient la probabélité de rencontre avec [a creatare 'tEhlE_l”EE ont TEÈ{OE,T“:Ë.Ë}. Les tables sont définies dans des lignes de DATA sous la forme numéro créature/probabilité de rencontre. La valeur -2 signifie qu’il v à encore une table après la table courante, Ja valeur 1 est l'indicateur de fin de données. La table 1 est la table de rencontre en plainé la table 2 est la table de rencontre en forët et la table 3 est la table de rencontre des ruines, 1T RUTRa RR T A RR s # TABLE 1 * , PLAINE *
! * Paysans = g ' * Colporteur = 105 *
# Chiens L # c2 rrs cd 5 i d e e A A e e = o s b E DATA 21,50 DATA 22,10 DATA 20,20 DATA 2,10 DATA 50,10 DATA -2 Définition des découvertes Les objers que le personnage peur découvrir sont définis par une description stockée dans lc tableau alphanumérique dec ouverte$(). La description de ces objets est définis dans des lignes de DATA: La procédure @init decouvertes initialise le rableau decouverteS(). ATARI MAGAZINE m BEST-OFGFA BASIC Définition des créatures Les créatures que le personnage peut rencontrer sont définies uniquement par leurs noms. Ceux-i sont stogkés dans le cableau creature$(). Les créatures sont définies dans des hgnes de DATA. La procédure Einit creatures initialise le tableau creatured () avec les données stockdes en DATA Les éréatures sont définies de manière “minimale”, Si vous voulez réalise* un svstème de combat, il faut rajouter d'autres caractéristiques, Module de gestion de la fenêtre graphique La fenêtre graphique est une zone située à la droire de la carte où le programme peut athicher des messages. Le programme GESCARTE l'utilise pour afficher les rencontres er les découvertes de trésors. Elle est situde à la position (194,12) ec mesure 118 pixels de large ct 178 pixels de haur. Elle peur contenir 20 lignes de 14 caractères, La variable globale ligne courante¥ conmtient la position courante d’athchage, ; La procédure Bcls fenetre dessiné Pimage de la fenêtre vide. Flle sert à afficher la fenêtre graphique au début du programme et à l'effacer en cours de route, La procédure @init fenetre affiche l'image de la fenètre ec mer la variable Tigne courante=A0, La procédure Gaff fenetre(message5) affiche le textc messaged dans la fenêtre graphique. Le texte est mis en forme par la routine @format pour ne pas dépasser les limites de la fenêtre. Chaque ligne formatée est affichée par la fonction Cafft ligne, La routine Baff ligne(Tigne$) affiche la ligne Tigne$ à la posr tion courante de la fenêtre. La ligne est affichée à la position stockée dans la variable 1igne courantes: S1 celleci contient une valéur supérieuré à 19, il ne reste plus de place libre dans la lénêtre car les numéros de lignes sont comprises entre 0 ec 19, Le progratume scrolle alors la fenêtre graphique d’une ligne vers le haux. La procédure @scro!1 fenetre scrolle le contenu de la fénêtre graphique d'une ligne vers le haut. Le scrolling est réalisé en copiant les lignes 1 à 19 à l'emplacement des lignes 0 à 18, La copie est faite avec les instructions graphiques GET et PUT. Une fois le scrolling effecruc, la dernière ligne esr effacee. La procédure @copie fenetre recopie le conrenu de la fenêtré gra phique de l’écran physique vers l'écran logique (ééran visible vers écran de travail). Certe procéduré est utilisée par le système d'affichase de la carte qui travaille en permutant les écrans physique ec logique, Les fonctions systémes Les fonctions systémes sont des fonctions multi-usages qui remplissent des thches classiques dans toutes sortes de programmes. s ne dépendent pas de GESCARTE et peuvent étre réutilisés dans toutes sortes de programmies, Les fonctions systèmes sont Bwaitclavien @vider clavier, Bcls ecran, Bocadre, Oset ecr log, éset ecr phys et Bformat La procédure Bwaitclavier amend que l'utikisateur presse sur une touche. Elle ne renvoie pas le code de la touche pressée, C'est l'équivalent de l'insteuction VOID INP(Z). À ceci prés qu'il est plus parlant de trouver Éwai tclavier dans un listing que VOID INP(2). La procédure Evider clavier efface tous les caractères stockés dans le tampon clavier, Elle permet d'annuler l'eflét de la fonction d’auto- répétition du clavier ST, Céla peut être ntile dans certains cas. La routine Pcls ecran(c*) cfface Pécran en le remplissant avec la couleur 6* Cette routine est plus pratique que l’instruction CLS qui remplis uniquement l'écran avec la couleur 0. Cela permet d'avoir un fond d'écran de n'importe quelle couleur. La procélure Écadre(px%,pyt, tx5, tyk, R, b6) dessine un cadre sraphique de dimensions (tx%,ty#) à la position (px*,pys). Le fond du cadre est de la couleur % alors que les bords sont dans la couléur DR Clest une sorte d’instruction PBOX amélioré La rourine @set ecr log(adr ecrans) permet de changer l'adresse de Pécran logique, c'ést-à-dire l'adresse de l'écran u travaillent les fonctions graphiques du GFA Basic Le nouvel écran de travail doit faire 32000 ocrets pour éviter les plantages systèmes. Cette routiné pérmét de réaliser des opérations graphiques en mémoire sans que en n'apparaisse à l'écran. La procédure @set ecr phys (adr ecran%) permet de changer l'adresse dé l’écran physique, c'esr-à-cire Padresse de la memoire écran, C'’est une fonction dangerense qu’il faut employer avec prudencé, La nouvelle mémoire écran doit faire 32000 octets et commencer à une adresse multiplé de 256 (certe limitation n’existe pas sur le STE où Padresse de la mémoire écran peur être fixée à n'importe quelle adresse paire), En utilisant cete fonction avec Bset ecr log, on peut réaliser des affichages très rapides, mais assez complexes, La routine @format{m$,taille®) est une routine qui formare le’ texte m en lignes ne dépassant pas taille® caractères, Le texte est formaté de manière 4 ne pas couper les mots, Te texte formate est stocké dans le tableau alphanumériqué lignes$(). La variable giobale nb_lignes® contient le nombre de lignes lormatées présentes dans le tableau Tignesi (). Améliorations du programme Le programme GESCARTE peut éure ameélioré de nombreuses manieres, Vous pouvez ajouter de nouveaux éléments eraphiques et de nouvelles rables de rencontres. Un systéme de sous-cartes peut permétire au personnage d’entrer dans les maisons et d'explorer les châteaux: l’interface utilisateur peut être modifiés pour fonctionner entierement à la souris. Des icônes peuvent réprésenter les différents options du programme (déplacement, examen du personnage, somméil, manipulations des objets possédés par le personnage, sauvegarde de la partie, chargement d'une ancienne partie, etc.) Vous pouvez prévoir une passibilité de dialogues entre le personnage et les créatures qu'il rencontre pendant ses deplacéménts, Pour transformer cé logiciel en véritable jeu de rôle micro, 1l faut prévoir un but et des sous-buts. En général, ce but est la destruction d'un puissant sorcier. Les sous-burs peuvent être la recherche d'informations, d'objets magiques très puissants (armes, armures et objets divers) et éventuellément de sorts. Certains endroits de la carte péuventêtre extrémemert n::l:lngereuï pour Un pérsonmage débutant sans expérience ec sans équipément particulier. Téléchargement Vous pouvez obtenir les listings de EOITCART et de GESCARTE sur le ATARI MAGAZINE WAl BEST OF G4 BASIC 3615 ATARI Ces programmes sont accompagnées d'umages Depas Elite contenant des exemples d'éléments graphiques de 16×16 pixels ët un exemple de carte, e e e d e e e Al e T d e R n e e S R 5 JEU DE ROLE STYLE EULTIMA * e GFA BASIC 3.xx , i:ttijk#ki*t#*t*t* « (C) 1991 ATARI MAGAZINE #. * (£} 1991 PATRICK LECLERCO = D RSSIE E ok e A o Fi RR R i RESERVE 100000 ' OPTION BASE 1 DIM element$ (200) OIM creature$(200) DIM decouvertet(700) DIM lignes$(20) DIM table rencontre=(20,30,2} DIM table decouvertes(20,30,2) DIM def ev*(200) adr Lampon#=MALLOC(32255) adr2%={adr tampon*+255) AND &HFFFFFFDO adrl&-XBI0S(2) nb colonness=-1 nb _ ligness=—1 OIM carte/|(200,75) gmain 1l u ke r r o e el e e e v e e e e e o e o e e o e e W ' % RETOUR AUX CONDITIONS DE DEBUT * | XX EAAR bd bW AdbErETTdtbridzetat @set ecr log(adrl%) Bset ecr phys(adrl&) CLS VOID MFREE(adr tampons) END R O R R O R E T I d e e É R RE E AN ! * ATTENTE PRESSION SUR UNE TOUCHE * | RE E RERRRE SR E R RR Rk R de d d e | * (Cette fonction ne renvoie pas 5 !* Tle numëro de touche. C'est = # l'équivalent de l'instruction , * VOID INP(Z) ; D É IATERE ETE o o RR I R E CRN R R E R FROCEDURE waitclavier CO EXIT IF INKEY§<>”“ LOOP RETURN i | *mEaxxdtritdtdhdrdhdarrredttdbhhhdw : F YIDER TAMPON CLAVIER * Le Ro e R o S R e E PROCEDURE vîder_;ïauier B0 EXIT 1F INKEYS=”“ LOOP : RETURN PROCEDURE set ecr Togladr ecran®) VOID XBIOS(5,L:adr ecran%,L:=1,-1) RETURN PROCEDURE set ecr phys(adr ecranf) VOID X8105(5,L:—1,Lzadr ecran¥,—1) RETURN | ÉXTÉTTVLETTEITEFÉETEEXF | # EFFACEMENT ECRAN * I ETE RTAREES RE AANNA RE 1 A AAaaAÉÉR RR R RR R A R d R RR RE R * * C% : couleur de remplissage de 1'Ecran | p e e R e e e e e e é e e E PROCEDURE cls ecran(c%) DEFFILL % PBOX 0,0,319,199 RETLRN I I kA AR EARNFAAAA A A Ak bkt | * AFFICHAGE CADRE GRAPHIQUE * | E e e e e e e b o e e S o A A R E E E E PROCEDURE cadre(pExx,% ty,s,p f5v,b,5) LOCAL px2%,pyd% i pxcés=pxsrlxé—] pvésepysttysl DEFFILL % PROK px%,pys, px2%, pyès COLOR b% BOX pxb,pys,puds,pyis RETURN TT E e i st ok o ol e e e E A o S T # ! *. ROUTINES DE GESTION DE * ! % LA FENTRE DES MESSAGES * 1E - | de sk E R E R E E AR RESRE RE ATAR| MAGÈAZINE m BEST OFGFA BASIC k F R n d e e e d e e e e e e é L r r e e SE * FORMATAGE D'UN TEXTE * SS É UE E RE RE RE E E RE S ! RH HR E E d d e e RE R R N d E * Cette routine découpé un texte en plusieurs lignes” pour un affichage propre. le découpage se fait au * Ÿ * niveau des mots. * PARAMETRES ROUTINE : #* * mh : texte à formater * taille® : nombre maximum de lettres par ligne b, 1] SORTIE ROUTINE : # + * tableau lignest(). éc e ec e e e e e e e e e e d S e e e é e d e d e e e e e e É R RE E # PROCEDURE format(m#$,taille*) LOCAL Lampon$ LOCAL p* LOCAL €$ LOCAL lignet nb l{gnes*=0 tamnont=”“ lignet=”“ ” FOR p&=1 T0 20 lignes$(p=}=“” NEXT p% I ÉÉ T ETE REN P AR E ' * BOUCLE DE DECOUPAGE * | RESREsN FOR p%=1 TO LEN(m$) c3=MID$ (m$,p%.1) IF ES{?“ lï tampon$=tamponitet ENDIF IF c3=” “ 1F LEN(Tigne$)+1+LEN(tampon$)⇐tailles IF lignet=”“ l igne$=tampons tamponhe”“ ELSE lignef=ligne{+” “+tamponi tampon$=”“ ENDTF ELSE INC nb Tignes% lignes${nb lignes#)=ligne$ lignes=”“ IF tamponfe=”“ Les lignes sont stockées dans le tableau lignes$(})* La variable nb Tignes% contient le nb de lignes du* tampon$=tampon$+” * ERDIF ENOIF ENDIF NEXT p% [ *wwjitt*;*k*ii*w ' * FIN DU DECOUPAGE # E e o o o o e IF {ligne$=“”) AND {tamponf<>“”) INC nb 1igness lignes$(nb 1ignesk)=tampon} tflmpflHE’“” ENDIF IF (tampond⇐“”)} AND (lignet=“”) IF LEN(ligneS)+1+LEM (tamponi}⇐taille% INC nb ligness lignes%{nb lignes#)=Tigne$+“ “*tampons lignes=”” tampon$f=“” ELSE INC nb_lignes*# lignes${nb lignes%)=lignes ligne$=“” INC nb lignes* lignes$(nb lignes*)=tampons tamponf=“” ERDIF ENDIF RETURN D = o o b e R R T e b R R “ % EFFACEMENT FEMETRE MESSAGES * ï fi*fiïÿfi*%i11##*1##?*3* PROCEDURE cls fenetre Écadre(194,12,118,178,5,0) RETURN
” % SCROLLING VERS LE HAUT *
PROCEDURE scroll fenetre LOCAL scroll$ GET 196,244,308, 185,scrol 1} PUT 196,15,scrolls cadre(196,177,112,9,5,5) ! Effacement derniére ligne RETURN P D éh BTN Sy W é RR R RR A E N E e e e e S R R A A r d d e e “ AFFICHAGE D'UNE LIGNE DANS LA FENETRE * 1 rr e r d d e e d o e r i i e E e d e o o e e e RE E PROCEDURE aff ligne(lignes) ATARI MAGAZINE Ë BEST OF GFA BASIC LOCAL pxé,pys IF ligne courantes=19 @scroll fenetre ligne courantes=19 ENDIF px*=196 py&=(1igne courantes-1)“9+73—1 TEXT px%,py,1ignet RETURN I dh hN e e e d e c é e d d d e R R R E E ! * AFFICHAGE D'UN MESSAGE DANS LA FENETRE 7 D R e e R e AN E R E E PROCEDURE aff fenetre(message}) LOCAL 1% Pformat{messaged,14) FOR 1=1 T0 nb_lignes% INC ligne courantes @aff ligne(lignes${1)) NEXT 1% RETURN Î ;g*fl*t#*titt*tttttfi*ifi#*t* V% INITIALISATION FENETRE TEXTE * P éh d e A R R e é r é é d P d d d e T PROCEDURE init fenetre Bcls fenetre ligne courante*=0 RETURM BT kL T e R R A d LR e d e d ! = COPIE FENETRE DE TEXTES DANS ECRAN DE TRAVAIL- * Ë “*fiwwÿ*tflttt*:tt*#ÿÿtttttn:i*fitt* PROCEDURE copie fenetre RC _ COPY ecr visible*,194,12,118,178 TD ecr travail®%,194,12 RETURN 1 ook ok ok e e o RRN N R R E É EN d É e e W 1“ % ' % CHARGEMENT DE FICHIERS DISQUE * | xx* RR b e e e E E A e TR S E E E L RE e E R E e R r S é A A A E ” * CHARGEMENT IMAGE DU PERSONNAGE SUR: LA CARTE = S L LR e Rl ek 2t b b i N e PROCEDURE charge perso(nom$) perso$=#PACE$ (134) OPEN “i”,#1,nomd BGET #1 ,VARPTR(persos),134 CLOSE #1 RETUEN | LR S B R e e e e R ' = [CHARGEMENT DU FICHIER BINAIRE B * # CONTENANT LES ELEMENTS GRAPHIQUES * T o ST e A R A S RE I SE E RRN PROCEDURE charge elements{fichier}) LOCAL n LOCAL palettet palettek=eS5PACE%(32) OPEN “1” #1,fichiers BGET #1 ,VARFTR(palette5),32 VOID XBIOS(6:L-VARPTR{palette#)} nb elements“=INP{(#1) FOR n%=1 TU nb elements* element${n%)-SPACE$(134) BGET #1,VARPTR(elementi{(n#)},134 NEXT n* CLOSE #1 RETURN LR S S L Ak ko 2 ÉÉ NA RR RE RE ' * ÉHARGER CARTE A PARTIR DU DISQUE * | 4h E d e e m r A r A P d e d e E É A RN iyt PROCEDURE charger carte(nom$) LOCAL entetes à LOCAL 1%,c% DPEN “I”,#1,nom} entete$-SPACES (19) BGET #1,VARPTR(entete$),19 nb colonness=INP(#1) nb_lignes*=INP(#1) FOR c*=1 TÜ nb colonnes= FOR 1=1 1C nb lignes= carte| (c%, 1%)=INF(#1) NEXT 1% NEXT c% CLOSE #1 RETURN L d d e e d c E É * OPTION 'QUITTER LE PRG' 7 | AI E RE TR TRN REN RS | NRAEXERRÉRÉAR RRN RR E ÉÉ R RR E E ! « sortie#0 =⇒ continuer programme # | = Sorties=] =⇒ quitter programe i I ek AARAARFERESE A d d e d d e e e RN A PROCEDURE guitter programme LOCAL m$,t#, b5 | 5ürL1&%=Û m$=“VOULEZ-VDUS VRAIMENT |QUITTER CE PRG ?” choix$=“0UT | MON” SH ATAR| MAGAZIME m BEST OF GFA BASIC ALERT O,m$,2,choix$,b% HIDEM 1F b%=1 sorties=l — ENDIF RETURN EITE T PR TR RS L LR a2 bt b b d b i + # * * GESTIONNAIRE DE KENCONTRES * 1w * d e é é e e e E E n E n e E E V é É OE A E se m d r r r e e e e r r r e e r e e e e E N e é e e e d e e * INITIALISATION DES TABLES DE RENCONTRES * d d kAR e e e e e e e T e ce d e e RR RE R T D A E PROCEDURE init rencontres LOCAL table*,rencontre* LOCAL prob%,creatures # LOCAL valeur# ARRAYFILL table rencontre%(),=1 table*=l rencontre®=l RESTORE def rencontres Do D0 READ valeur* EXIT IF valeurfs-1 EXIT IF valeur*-— creatureé%=valeurs READ probé table rencontre+(tables,rencontre#,1)=probs table rencontret(table%,rencontre*,2)=“creatures IRC rencontres LOap EXIT IF valeurs=—1 INC table* rencontre%=1 LOOF RETURN I ool i o R E o i e v e ook o o R e R e R o d * TEST DE PROBABILITE * FHREFFYARFEERTF LIRS ' % Cette fonction sert à tester si un évënement A ' % de probabilité prob% s'est produit. La routine * ! # ‘renvoie TRUE si | 'événément s 'est produit et F | * FALSE dans le cas contraire. = I RAARAARRRRRRA AN e e R RR E E e d e FUNCTION tst probabilite(prob%) LOCAL rep% 1F RANDOM(100)+1⇐prob# reps=TRUE ELSE dh d de d EEEAAEANN A AT T d ANARERRAAAAA N É reps=FALSE ENDIF RETURN reps ENDFUNC 26e d e e e RR MRN d DE d e E « TIRAGE-D'UNE RENCONTRE # R rr e e e e e E AI LR RRN ATk kAR RR d RR E S E R NNN IERE * Cette routine détérminé aléatoirément un numéro de * créature à partir de la table de rencontré tables. e A A A E T E E E CO E E E A e E CR CR d A A E E E E S FUNCTION tirage rencontre(table*) LOCAL tirage*,rencontres LOCAL prob%,creaturss LOCAL total prob% “tirage==RANDOM(1001+1 creatures=—l total prob%=D FOR rencontre*=1 TO 30 probs=table rencontre%(table%,rencontre=,1) IF probi==-1 ADD total prob',prob# IF (tirage*⇐total prob%) ï creatureE=table réencontte*(table%,rencontre5,2} rencontre%=30 ! Sortie de la boucle ERDIF ENDIF NEXT rencontres IF creature=l PRINT “ERREUR DE FORMAT DANS LES RENCONTRES” FRINT “MUMERD TABLE ”-tables ENDTF RETURN creatures ENDFUNC — ds d d r d u R E e r e d m e r e e t e m c A r e e * Æ * GESTIONNAIRE DES DECOUVERTES * * x rrrh e e é e d e d d e é A e e d E d R R e PI d RR R E E A T é e P e e RE * INITIALISATION DES TABLES DE DECOUVERTES * I T dh h AT T TN POV TN T EMN RR E A ÉÉ E PROCEDURE init tables decouvertes LOCAL table*,decouvertes LOCAL prob%,tresor LOCAL info% ARRAYFILL tahÎE_dEEüuvertEÊ[J,wl table%=1 decouvertes=1 RESTORE tables decouvertes ATARI MAGA£INE m BEST OF GFA BASIC D [0 READ info% EXIT IF infof%=—1 EXIT IF info%=—2Z tresor*-into® READ prob# tabled ecouverte*(table*,découv1e)r=tpreo*b,# table decouverte“(table%,découverte*,2}=tresors INC decouvertes LOOP EXIT IF info%=—I1 INC tabie* découverte%=l LOOP RETURN Emm R d R d d e E * TIRAGE D'UNE DECOUVERTE = e e h e e e e e e e d d A FT AR R R AR R RR E NNN e e A RR r E A d d d *Cette routine détermine aléatoirement un numéro de* * trésor à partir de la table de découverté tables.” e d e d p e A A A r e d d e d d e e R R R B e r e e e e ok r o ol e e e SE DE I ÉÉTÉTERTTNÈTE EÉ TEVRÉE * * AFFICHAGE DE L& * “4 CARTE VISIBLE * I AW W AREF S AR A EE PROCEDURE aff carte LOCAL 1%,c% LOCAL Tigne* LOCAL colonnes LOCAL rrs LOCAL posx® LOCAL posys posyg=ycartes lignes=ligne carte% FOR 1%=1 TO 11 posx*=xcarte* colonne%=colonné cartes FOR c=1 TU 11 num#| -{coclonaner%.ltignee) PUT posx%,posy*,elementS(num#) INC colonnes ADD posx%1,6 LOCAL ecr2%, x%.ve% LOCAL pxés,pys LOCAL c&,colonne= LOCAL r% ‘ LOCAL old elements old element#=carte|(colonne carte&+5,ligne cartes+5) DEC ligne carte% @prepareacrt tiraovanil écri*-=ecr visiblex xl==xcarte% vl%#vcarte% ecr2%“secr travail% x2%=xcartes véds=ycartes+16 RC COPY ecrl%,x1%,y1%,1/6,160 10 ecr24,XÉ4,yés PUT xcarte*+80,ycartes+965,c}eme_ nélte$m(eont1=d} cn!unne%=cu1unne_carte% px*=xcartes P pyv&=ycarter FOR c%=1 TO 11 nw=carté| (colonne*,ligne carte) FUNCTION tirage decouverte(table%) LOCAL tirage%, decouvertes LOCAL probs,tresors LOCAL total probs tirages=RANDOM(100)+1 tresorfs=—1 total_probs=0 “ FOR decouverte*=1 TO 30 pruh%itahïe_üücüuverteä[tablaä,d&cauv&rt&%.l} IF probfe=-l ADD total prob%,prob% 1F (tiragek⇐total prob%) tresur%=tdh1e_decüuvfirteä{tahîE%.decüuverteä,ïj NEXT c* PUT px*,py&,élément${n#) INC ligne* INC caolonne* ADD posys,lb ADD px*,16 NEXT 1% NEXT c% PUT xcarteS+H0,ycarte*+80,perso$,1 ! Aff image perso PUT xcarte%+680,ycarte5+80,persot,l | Aff image perso RETURN % Bcopie fenetre ) Bvisualisation ecr travail | ÆxN R R T E E E FEETUËH * * GESTION PERMUTATION DES ECRANS * | L REN ok ek s ook e o e d E R B E RN L s PROCEDURE preparation ecr travail ' * DEPLACEMENT VERS LE BAS * lF Eta‘t-;'s:'l I E RR R RE clc e 96 d e e e u rrr drvaie dp dp d E E L S ecr visibles=adrls PROCEDURE aller bas Ecr:;rava11%=üdr2% LOCAL ecrls,x15,y15 ELSE LOCAL ecr%,x2%,y2% ecr visible¥=adri% LOCAL pxs,pys ecr travaii*radr1% LOCAL c&,colonne# decouvertés*=30 ! Sortie de la boucle ENDIF LOCAL n% ; ENDIF etati=—etals LOCAL old elements ENDIF Bset ecr log(ecr travail®) ' NEXT decouvertes RETURN ntd_e!ementä=carte|{cüîünne_carte%+5,1îgne_tart9%+5] IF tresor*=—l PRINT “ERREUR DE FORMAT DANS LES DECOUVERTES® * * \ISUALISATION DE LA CARTE * PRINT “NUMERO TABLE ”;table% ENDIF RETURN tresors ENDFUNC I AAAAAASÉÉ A RE R ÉÉÉ RR RR R AN I W ! * ROUTINES D'AFFICHAGE DE LA CARTE VISIBLE * Lo R o o o ot o b e E g E RESRE R R A RE Tk ok ke kAo INC lîgne carte* Épreparation ecr travail ecrl&=ecr visible® x1#=xcarte% PROCEDURE visualisation ecr travail yl&=ycarte=+ib Bset ecr phys{eer travail¥) ecr2f=ecr travail% VEYNC Xx24=xcarte# RETURN y2x=ycarLer ' ' - RC COPY ecrl%.x1%.y15%5.176,160 TO ecrd%,xd%s,yds | e e rr dl d e e e e r e e 0 u d d d d d6 6 06 MRE Pu; :EHTÈEÈ+HÜ.ïEûFtÈË+Ëfl,EÎE…EHÏ$[üÏd_EÎEMEfltÈ] w ! = DEPLACEMENT VERS LE HAUT * celonnes=colonne cartes | RR RRN RE N R A c E päâ=äÛüFLE% py==ycarte++160 FOR ci=1 TD 11 I A e 6 R E E E e E A A dn d d d e n S 1 UEE R el ol NE NN A - PROCEDURE aller haut LOCAL ecrl%,xl%,yl% ATARI MAGAZINE E BEST OF GRA BASIC né-carté|(colonne&,ligne carte“+10) PUT px%,py%,elements(n%) INC colonne* ADD px=,16 NEXT €* PUT xcarte*+R0,vcarte%+80,persof,l ! Aff image perso Bcopie fenétré @visualisecar ttriavoainl RETUEN i | d RN Ee E L ! * DÉPLACEMENT VERS LA GAUCHE # | ORRÉEIATAARaaR RR RRN A A A E PROCEDURE aller gauche LOCAL ecr1l5,x15,y15 LOCAL ecr?% %, v2% LOCAL px,pyf LOCAL 1%,11gne% LOCAL n% ï LOCAL old elements nld_elEmEnt%=carte|{Çùlünne_carte%+5,1iqne_carteä+5] DEC colonne cartes Bpreparation ecr travail ecrlf=ecr visioled xl%=xcarte* yl&=ycarte% ecrZ“secr travail# xPAexcartes+ib veg=ycartek RC COPY ecrl%,x1%,y1%,160,176 TO ecrefk, xdt, vès EUT xcarte*+06,vcarte5+80,element${old element*) lignes=ligné cartes px4=xcartes pys=ycartes FOR 1%=1 TO 11 nk=(ccoloanne rcartte*,elig|ne) PUT px#,pys,element#{n#) INC ligne% ADD pys1,6 MEXT 1% PUT xcartes+80,ycarte=+80,pér505,1 ! ATT image perso Écopie fenetre @visualisecar ttriavoainl RETURN Ï I TR RRAARES E RR NNN TR RAARÉ EN ! # DEPLACEMENT VERS LA DROITE * D A e r e e e e R c e PROCEDURE a]]nr_drüîte LOCAL ecrlF,x1=,y1% LOCAL ecr2% , néw,yves LOCAL px=,pys LOCAL 1&,ligne% LOCAL n LOCAL old elements ATARI MAGALIME Ë BEST-OF GFA BASIC uîd_fllementä=carte|[cüïünne_EartE%+fi,1igfle_flarte%+5} INC colonne cartés Epreparation ecr travail ecrl®-ecr visibles xl#=xcartes+16 vl&=ycartes ecrŸ&=ecr travail% x7*=-xcartes yvék=eycartes RC COPY ecrl®,x1%,y1%,160,176 TO ecrZ%,x2%,yes PUT xcarte*+h4, ycartes+80,element#{(01d element#} ligne&=ligne carte% px5=xcarte*+160 pys=ycartes FOR 1%=1 TO 11 n&=carte|{colonne carte*+10,ligne%) PUT px*,py*,element${(n“) INC lîigne* ADD py&,16 NEXT 1% PUT xcartes+80,ycarte*+80,perso$,1 ! Aff image perso Gropie fenetre @visualisation ecr travail RETURN | RRN E RR RR RR E RRN ARÉEE L ket ddddd * # FONCTIONS DE GESTIDN DES EVENEMENTS DU JEU * e e e e e e A “ e e e e r o e e r A e e e e e e e o e e t e S e TE [ XE e e R R R SRR e e e e * LE JOUEUR SE DEPLACE SUR LA PLAINE * e e e e i i i ok o d i e d e e ok o e e e e e i ok W W R E R PROCEDURE rencontre plaine LOCAL éréatures LOCAL messages IF @tst probabilite(10) creature%=@tirage rencontre(1) message®=“RENCONTRE : ”+creaturef(creatures) Baff fenetre(messaged) ‘ ENDIF RETURN P omdkkh ke RE E RE R RR A A RR d d d dede de * * LÉ JOUEUR SE DEPLACE SUR LA FORET * D TRIH E R d r e d e E T A e d E PROCEDURE rencuntre_fflr&t LOCAL creatures LOCAL messaget 1F Ptst probabilite(15) creaturet=@tirage rencontre(2) méssagef=“RENCONTRE : ”+creature${creature*) Gaff fenetre(message$) ENDIF RETURN I AR A ARtk mdd é r d e d e e E ! * LE JOUEUR EXPLORE DES RUINES * | L b L E S = NNN NN R S S E R RR E E R . i o A A E e T R SRR E Rk S e b e b e R e E w* r Il peut rencontrer des créaturés, * ou trouver divers objets anciens. * e R d d d d d d e d R R E b ke À PROCEDURE rencontre ruines LOCAL creature* LOCAL decouverte* LOCAL ms 1F @tst probabilite(16) creature*=Etirage rencontre(3) mé=“RENCONTRE : “Fcreature$(creatures) Baff fenetre(mi) ENDIF I IF êtst probabilite(5) decouverte%-@tirage decouverte(i) mé=“0ECOUVERTE :”+decouverte}(decouvertes)] Gaff fenetre(mb) ENDIF RETURN L3 E ed d d e d d E E E RR R e E sé VISUALTSATION DU DEPLACEMENT * ” # SUR LA CARTE AFFICHEE A L'ECRAN * I e d ds ds dh d d d S e 610 A A R OR R E e r e E PROCEDURE exec deplacement(direction%) SELECT directions CASE 1 Baller haut CASE 2 Galler bas CASE 3 Baller droite CASE 4 Baller gauche ENDSELECT RETURN ï #i*fi#*iliitt*fi#*;*ittfiw ' * ROUTINE DE DEPLACEMENT * - | ENARTAETE RRR TERSISTE ERRERR E PROCEDURE gestion deplacement (direction#) LOCAL c%,1%.n% SELECT direction® CASE 1 ck=colonne cartests 1%=11gne carte=t4 CASE 2 ATAR] MAGAZINE m BEST OF GFA BASIC (4=colonne cärte$+5 14=ligne cartestb CASE 3 c4=colonné cartes+b P 1%=11gne carteï+5 CASE 4 c*-colonne cartes+4 1%=ligñe cartes+5 ENDSELECT n4=def evi(carte|(c%.1%)) D e e e i o A e e d e e es e e e o ol o A AN E R S O R R ! * EXECUTION DES EVENEMENTS DE DEPLACEMENT * | ÉÉFN A SELECT n= CASE 1 Gexec deplacement(directions) CASE 2 - @Exec_dep1acement(dir&ntîün%} érencontre plaine CASE 3 gexer deplacement(direction) Brencontre foret CASE 4 Bexec deplacement (direction#) Érencontre ruines ENMDSELECT RETURMN e A e T E Wkl e R T E * EXECUTION DES FONCTIONS * PE e k e d d E E E E r d d d d E E E S PROCEDURE exec fonction(f#} SELECT 1# CASE 1,2.3.4 Ggestion deplacement (f*) CASE 5 @quitter programme ENDSELECT RETURN b B R R R L e e e d E E E E S * ATTENTE EVENEMENTS CLAVIER #* e e e e e e e o o o o e e i o o e e A e i i eA 1 : aller haut 2+ Aller bas 3 : Allér droite 4 : Aller gauche 5 : Quitler le programme FUNCTION att ev LOCAL c$,num ev num_ev==0 @vider clavier D0 DÉsINKEYS IF chæ>”” IF c§=CHR5{27] rum ev*=s ENDTF IF LEN(eS)=2 tS<ASÉ[MIDE(c$,#,1}} IF t&w/72 num evi=] ENDIF 1F t%=80 num evi=Z ENDIF [F tre/77 num _evés=3 ENDIF — 1F t%=75 num_ev&=4 EMDIF ENOTF ENDIF EXIT lF num evi⇐(0 LODP RETURN num av® ENDFLNC i R e E R R E RE o e L SR | * GESTION DES ORDRES DU JOUEUR * | RRRRERTT TVREUTERI3TEEX PROCEDURE gestion programme LOCAL eyv* i cH évs-Batetv exec fonction(ev®) EXIT IF sortie=-l LUOF RETURN 1 =” DR RRIRARR ÉÉÉ RR RRE E E R AN AN AESTERNF - * LECTURE DES MUMEROS D'EVENEMENTS * | * ASSOCIES AUX ELEMENTS DE LA CARTE * lFNE R PROCEDURE init evenements LOCAL nums, vals ARRAYFILL def ev=(),0 RESTORE def evenements Do READ numé EXIT IF num¥=—1 READ val* def ev&(numé)=val% OGP RETURN ï B S o e e R A E C R V o i E E * * DEFINITION DES CREATURES * STARI MAGAZINE Ë BEST OFGFA BASIC e o R e Rk E R S FROCEQURE init_creaturE£ LOCAL rnumé, nomb @aff_carte EMOVE XBI05(21 ,adr2%, 32000 etati=1 DATA 22,“UN COLPORTEUR” DATA 23,“DES BUCHERONS” DATA 24,“UNE CARAVARE” DATA 25,“DES PILLEURS DE TOMBE” ! * Gobelins : 10% * - # Esprit % | * des bois : 10% * I HÉFETÉTTTHATTETEERN4TETR ns=0 gestion programme ' DATA 1,30 RESTORE def creatures ‘ DATA 50,”DES ORCS“ DATA 3,15 Do SHOWM DATA 51,”DES GOBELINS“ DATA 23,10 READ numé RETURN DATA 52,“UN ELFE NOIR” DATA 50,25 EXIT FF fumé==1 ; DATA 53, “UN NECROMAN“ DATA 51,10 READ noms ' i DATA 102,10 ETEEtuTEE{flHm%}=flflm5 l T X e e R RN ON R ek DATA ?Ü.“UËE ARAICNEE EEÊHÎE” DATA —2 LOOP ik | ; DATA 71,“UN SERPENT GEANT® | RETURN ! * DEFINITION DES DONNEES DU JEU * l | RRRRREREAAAEARARNÉRHÉÉ RESRE | e Ë DATA 100, “UN DEMON* x TABLE 3 — RUINES * | HS DL s f o h et gkt ek V OHHTEAAAAAAANRRA RRN vAFER ÉÉ RRN RE DATA IÜl,”UH FANTOME” | HR AR AARTA NNN LR LT LS * = DEFINITION DES DECOUVERTES * e rr é DATA 102, “UN ESPRIT DES BOIS” ! # Drcs : 30 # D dh e e e e e e E R RI É E E “ # DEFINITION DES EVENEMENTS 7* DATA 103,”UN ESPRIT DE L'EAU“ ' * ‘Gohbelins « 205 / # PROCEDURE init decouvertes e e p tc e e DATA 104,”UN ESPRIT DE TERRE“ * = Serpent ; P0R * LOCAL num%, nom$ ' % DATA element,evenement $ DATA 105,”UN ESPRIT DE FEU“ “ * Ardignée géante @ 10% * ' “ * DATA -1 : fin evenements ” DATA 106,“UN ESPRIT DE MORT® * * Pilleurs de tombes : 10% * ns | s Ll T R NNN e DHTH IÜ?,“UH ÜHËEÜH HÜEH— ” * Fantome ; ÜE% * RESTORE def decouvertes \ * Codages eveneéments : u DATA 108, “UN DRAGON ROUGE™ ! * Démon - 055 * Do ! * 0 : déplacement impossible * DATA 109, “UN DRAGON DES ÉAUX” | RRRRRRR RRN EN E d sk hok READ numré: S 1 0 déplacflment PDÉËÎÜ]Ë ; DATA —1 DATA EÜ,ËÜ EXIT IF numée=l ( * 2 : Appel fonetion 2 ® | DATA 51,20 READ noms OE (déplacement plaine) * LRn é RR e e R R R A d E DATA 5,20 decouverte${num%)=nomt ' % 3 : Appel fonétion 3 ä ! * DEFINITION DES TAËLES DE RENCONTRE * DATA 70,10 LODP # ËÜËPÏEEEMEHË fürët] = DR d c e e e e d e e e e e e E e E S ) DATA ËE.lÜ RETLURN ' # 4 : Appel fonction 4 ÿ ” # DATA créature, probabilité rencontre * DATA 101,5 ' “E (déplacement ruines} * ' * DATA —Z : passage table suivante - DATA 100,5 | = = = L S e R e e E E I kdkgkkhkkdkdh RS EEEEE kA h ki dk i ÜËT _1 : F1fl ÉES tflh1E5 i DHTA 4 ' * PROCEDURE PRINCIPALE * def_evenements: ! * REMARQUE : Le total des probabilités * ‘ e T R ANE DATA 1,0 ! % doit faire absolument 100%. * I khn R RR R d e e e e e e e É E FROCEDURE main DATA 2.0 I c d d dn d b e d e d rr e d e e e e e d d RE ‘ * DEFINITION DES DECOUVERTES * nb_eîement5ä=ü DATA 3,2 dEf_FEflEflntrES: | d dededeae dc e e e kR E e RR A R é R A r ligne carte%=l DATA 4,2 E e e oo o e ETE def decouvertes: colonne carte*=1 DATA 5.0 tx TABLE 1 — PLAINE * DATA 1,“UNE PIECE D'ÔR” e1ëmenfutüurantä=1 DATA 6.0 B d d L L L d DATA 2,“UNE PIECE D'ARGENT“ ' i DATA 7.0 ! & Paysans @ 50% * DATA 3,”UNE PIECE DE CUTVRE“ xcarles=E DATA 8,0 ' = Colporteur = 10% * DATA 4,”DES PIECES D'OR” ycartes=12 DATA 3.4 ' * Voieurs. = 20% * DATA 5,“DES PIECES D'ARGENT” @init creatures DATA 10,0 ! * Chiens = 10% * DATA 6,“DES PIECES DE CUIVRE” Bcharge perso(“PERSO.BIN”) DATA 11,3 ' * “Ores : HE * ; Bcharge elements(“ELEMENTS.BIN”) DATA —l | WA R E d AR E E DATA 20,“UNE PIERRE PRECIEUSE” Bcharger carte(“carte.car”) ' DATA 21,50 DATA Z21,“DES PIERRES PRECIEUSES® @în1t_fiï&fl&…fiflt5 | HRF iR AR R RE S &R d E DATA EE,IH i Ginit_rencontres ” % DEFINITION DES CREATURES ? DATA 20,70 DATA 50,“UNE VIETLLE EPEE” @inît:dEEüUUETtEE d d en d d d N DRS IN DATA 2,10 DATA 51,“UN COUTEAU” Ginit tables decouvertes def creatures: DATA 50,10 ' i DATA 1,“DES LOUPS” DATA — DATA 90, “UNE CHAUSSURE” HIDEM DATA 2,“DES CHIENS SAUVAGES” V d d d d DATA 91,“UNE POUPEE DE CHIFFONS” GRAPHMODE £ DATA 3,“UN OURS” “ æ TABLE 7 — FORET # ' DEFTEIT ü DflTh 4.IUH HEHAHD“' ol e o o WA e e DATA 5, SERPENT” DATA 100,“UNE ARME MAGIQUE” “ # Loups : 305 * DATA —1 @c]ls ecran(1) | -* furs “ 15> = 3 Ocadre(xcarte*l,ycarte*-1,178,178,1,0} DATA 20,”DES VOLEURS“ ' % Bucherons : 10% * 1 eh T 0 T e e d e e e e e N E E @init fenetre DATA 21, DE3 PAYSANS * (rcs . 0ra À ! # DEFINITION TAELE DE TIRAGE DES TRESORS * ATARE MAGAZIME Ë BEST OF GFÀ BASIC ATARI MAGAZIME fl BEST OF GFA BASIC E S A E A E S RR M E 1E E d e e E cIRc dc E CR E E d A E E CR E it tables decouverites: L E E E E e A ds TABLE I — RUINES * i #ktiitttt*###tttt* | RE NAMIR EN LA kAR Tk & % Une piêce de cuivre : 305 ” Des piéces de cuivre : 154 * Une piéce d'argent UE % e bes pièces d'argent =il * Une pièce d'or L * Des piéces d'or I s Une pierre précieuse @ 03% * Des pierres précieuses : (2% * Une &pée 065 * Un couteau 0655 # Une chaussure s2L e TR Une poupée * DA% # Une arme magique 0l* * Rt N E e e dc d d d d e e e A E E S DATA 3,30 DATA 6,15 DATA 2,15 DATA b, O DATA 1,05 DATA 4,03 DATA 20,03 DATA 21,02 DATA 50,06 DATA 51,05 DATA 90,04 DATA 91,04 DATA 1000,1 DATA =1 TELECHARGEZ DES CEÈITTAINES DES CENTAINES DE LOGICIELS SUR LE 3615 ATARI —-————-“_————–_———l . = # DE L'INITIATION A LA CRÉATION MUSICALE Vous avez un 1040 STE Vous êtes un fan de musique… Equipez-vous à prix réduit Le clavier BONTEMPI AZ 7500 Dernier-né de la gamme BOMTEMP, il e de loin le plus performant, | soura vous sofidoire grôce à ses mulfiples qualités: Clender MIDI ssplitalslen « 61 g.rfindaah.n:!m s32 sons «POM Digitols « 24 rythmes POM fechnologie numérique « / vois d'accompagnement, polyphonique (12 notes) = 4 effets sonares intégres. Il s'harmonise idéalement ervec be 1040 STE en exploitand toules ses performances sur e plen musicol. Le BONTEMPL AZ 7500 est l'outil qui vous permet de metire en applicafion vos progrés T PR . Le logiciel BIG BOSS Piano Cermier-né de la sacété RYTHM'N SOFT, BIG BOSS Piano, est le snec plus viËres des logiciels musicaux: Cours de piano clossique et modeme * clavier guide = défilement des parfifions en temps réel * impression des parfifions * quanisafion * c'est oussl un céquenceur de 75 pistes permeftant le chargement dmuffoné de 10 morceaux, Le logicel BIG BOSS Piono e une mélhade éducative smple (assistonce permanente] et rapice {10 lecons pragressives] pour que le solfège ne soit plus une contreinte insurmontoible. Laissez libre cours à votre inspiration &t réveiller le musicien qui somineille en vous. Pour commander, remplissez lisiblement ce bon (ou une copie) et envoyez-le accompagné du règlement à : ARTIPRESSE - 79, avenue Louis Roche - 92230 Gennevilliers [1 Je commande le clovier BONTEMP| ÀZ 7500 + le logiciel BIG 8055 Fiano au prix exentionnel de 1 990 F + frais d'expédition. Ci-joint un chèque de 2100 F en règiement. MNom pet eq p | i = f e oy T TN B R SR Prénam Lt el IR ey e % ST R 1E ) D L e el B s PE | Adresse e C B AR e e t ue | Sl VT LRI SR T X B SR | | |y e [0S R ) el AF P [ U EN E E Codepostal L1 1 | ¢ | } L L L 1 | 1 ¢ | | Ville ot L Pl ( E e [ ] OO S S ) L (9IRS LY |.'|î'||:|-;-'|||:- L. Cioevs b lireetu vlus-si — — =- — ——” o === , EU DE ROLE EN GFA BASIC Moi vois, moi tue Nous vous présentons maintenant un programme permettant de simuler le déroulement d'un combat entre un personnage et une créature quelconque. Combat, échange de coups Le résultat ou l'êchec d‘une attaque dont être calcule en fonction des caractéristiques des adversaires. Pour écrire un programme performant, il faut analyser tout ce qui se passe pendant un combar et définir lés caractéristiques des combattants nécéssaires à une bonne simulation:. Cet article vous propose deux systèmes de combat, Le premier est un systéme simple, fourni à titre d'exemple. Le second est un mécafistme de combac plus complexe ec plus réaliste Il est accompagné d'une Inbliothèque d'obpets que vous pourréz utiliser dans vos [anfifilwngfiwnnufiifirnxfi,PnflnmiflnfifitCHETUHE} Systéme de combat de base Le combat s'arrête lôrsqué l’un des déeux adversairés ést morc. Les :rjmhflttanlfl;i sOnt di'fifii.”: BT UTIC L'JFfll:i'LI'Ë l'_'l.'l: IL'I.]T[]!JG.'L! e 'L'-Ë.PË.EEI.É L!L' coups gt un certain nombre de potnts de vie, La capacité de combat est le pourcentage de chance que possede une créature de toucher son adversaire Un combattant de bas niveau péut avoir un pourcentage faible (entre 5% et 15%) alors qu’un combattant de haut niveau ou une créaturé trés purssanté peuvent avoir un pourcentage trés cleve (entre 70% et 90%). Pour savoir s1 uné créature touche son ennemi, il faut tirer un nombre alcatoire compris entre 1 et 100 (avec l'instrucrion RANDOM). 5i ce chiffre est inférieur ou épal à la capacité de combat, l'arraque est réussie. La capacité de coups est le nombre de points de dépâts qu’unée créature peut causer à une autre Un éléphant fait néttement plus de dommages qu'un écureuil, Le nombre de points de vie représente la vigueur d'une créacure et sa capacité à encaisser des coups. Les points de vie diminuent lorsque la OE{rîafi_]]_'ll: Tl:_:l;l!_:lltl: [_].:_‘:E.; F'li:l[]'lT_“'i IÎ.].Ç {ll:_'l'l'r_l mfi.ËLÏ'.:Ë ä. EE :-:.‘uiiu I:I.IL'ITIL' Ei'r'.l:'l.qu.'L'. S'I. ]Ë nombre de pounts de vie tombe à 0, la creature est morte. “ vie perso* Combat perso® * coups persos “ vie creatures : points de vie Perso : capacité de combat Perso : Capacité de coups Perso : Points de vie Créature ' combat creature% : Capacité de combat Créature - coups creature* : Capacite de coups Creatare o0 I &Exxkdbdkbhbiiitittidirkiidtik * * Ferso attaque Créature * L o e e i e e e ol e e ool R o E E IF RANDOM(100)⇐copmebrsaot% SUB vie creatcuouprs épesrs,o® ENDIF EXIT 1F vie creaturess=( L o e ol sl e E o o e o e o e R O Y R | # Créature attaque Perso * E E e e d e e rrr d de d e SE e SE d d E E E « IF RANDOM(100)⇐combat creature' SUB vie pèrso%,coups creatures ENDIF EXIT IF vie persove=0 LOOP i | o T T B N - o o b e e e e e d d E | # Affichage résultat du combat * DRRE E S e o REN RR RR RE e IF vie_persoi==0 PRINT “PERSD est mort™ ELSE PRINT “CREATURE est mort(e)” ENDTF Système de combat plus évolué Le svstème de combat de base est simple à mettre en céuvré, mais peu performant. Mous vous présentons maintenant un système de combat sophistiqué qui permet de réaliser des combars plus réalistes. Les créatures sont defimes par les caractéristiques suivantes: Porce, Points de vie, Capacité de combat, Nombre d'attaques par round de combat, Compétence de defense, Arme et Protection. ATARI MAGAZINE E BEST OF GRA BASIC Les caractéristiques Points de vie et Capacité de combat ont la même signification que dans le système de combat de base. Le Nombre d'attaques est le nombre de fois qu'un combartant peut attaquer dans le laps de temps d'un round de combat. Une créature faible ne peut attaquer qu‘une fois alors qu'une créature trés puissante peut attaquer de nombreuses fois par tour. Cela dépend de l'entraînement ct de la vitesse de réaction d'un combattant, voire méme de sa structure physique (une pieuvre avec plusieurs beas peut exécuter plusieurs attaques en même remps). La Capacité de défense représente la possibilicé d'éviter une artaque, Cela peut Être dû à une grande agilité, à une petite raille ou à une structure physique particulière (une créaturé faice de brume qui devient solide uniquement au moment de frapper est três difficrle à toucher). Cela peur aussi être le résultat d'un entraînement spécifique : un combattant ayant appris à esquiver ou à parer une attaque peut avoir une honne capacité de défense, La Capacité de coups du système de base est remplacée par les caractéristiques Force et Arme Le programme caleule les points de dommages en tenant compte du type d'arme utilisé et de la force de la créature La caractéristique Protection correspond à uné éventuelle protection corporelle (vêtement solide, armure, écailles, peau épaisse, ete.) Cette protection diminue les dommages reçus en combat, Elle peur même les annuler totalement dans certains cas. Déroulement d'un combat Le combar est divisé en rounds de combat. Pendant un round de combat, les deux combartants frappent l'un après l'autre jusqu'à épuisement de léur nombre d'attaques, Lorsque l’un des adversaires est touché, le programme calcule le nombre de points de dégâts en tenant compre de la force et de l’arme de l'attaquant, ainsi que de la protection portée par la cible. ‘ Le pourcentage de roucher une cible est csleulé en prenant la capacité de combat de l'artaquant et en soustrayant la capacité de défense de la cible, Les désäts sont retirés aux points de vie du combattant touché, Le combar cesse lorsque l'un des deux adversaires est tué c'ecc-d-dire lorsque son nombre de points de vie est égal ou intérieur a0, Conclusion d'un combat À la fin d'un combat, le programme affiche le résulrat. 51 le personnage a gagné, il reçoit le trésor éventuellement possédé par la créature et des points d'expérience. Les points d'expérience Un personnage qui vit de nombreuses aventures acquiert de l’expérience et augmente ses compétences. Pour simuler cela, un personnage victorieux réçoit uñ certain nombre de points d'expérience. Lorsque son total de points dépasse une certaine limite, ses compétences auementent. Le nombre de points réçu dépend de la créature. Vaincre un lapin rapporte peu d'expérience, alors que vaincre un dragon rapporte énormément de points, à condition que le personnage SUFVIVÉ; Programmation du système de combat La première chose à faire avant d'écrire le programme est d'étudier la struéturé des objets stockés en mémoire et de décider de la méthode utilisér pour definir cé ni:-j::'Lî. Ces derniers sont: les armes, les moyens de protection, les trésors, les créatures et le personnage, 1l est très difficile de déterminer les valeurs numériques définissant un objer. La tiche est simplifiée s l'on considère qu'un homme moven posside une base de 10 à toute ces caractéristiques (Force de 10, Intelligence de 10, Vitésse de réaction de 10, 10 Ponts de vie, E!l;'l'..:l Il faut i:nfiuhl'c: caleuler toutes les données du teu en tenant compre de certe base, Par exemple, un chat est nettement moins tort qu’un homme, mais plus qu’un lapin. On dennera 1 de force au lapin et 3 de force au chat. Par contre, un lion est plus fort qu'un hômme On péut ot donner une force de 14, Définition des armes Les armes sont des objets qui servent à causer des dégâts physiques sur une cible quelconque (un être vivant le plus souvent). Les dommages causés dans un combat comportent un élément aléatoire, Une épée peut tout aussi bien prévoquér une blessure mineure qu'une blessure grave én frappant un organe vital. Pour simuler cela, 1l faut faire la distinction entre les dommages constants et les dommages varaibles, Une arme est définie par un nom, un dommage constant et un dommage variable, Par exemple, une épée cause 2 points de dommage constant et 3 points de dommage variable Un coup d'épée peut donc causer entre 2 (2+1) er 5 (2+3) points de dommage. Cela donne une moyenne de 4 points de dommage. La valeur des points de dommage a été définie en tenant compte qu'un homme moyen possède 10 points de vie, Les noms des armes sont stockés dans le tableau nom arme${(n#). Les dommages constants sont mémorisés dans le rableau def_arme%{ n%,1} et les variables dans le rableau def armes(n5,2}. DIM nom arme$(100) DIM def arme*(100,2) ' def arme%(n,l) = dégât constant arme n ' def arme%{n,2) = dégät variable arme n La définition des armes est faite dans des lignes de DATA. Elles sont définies sous la forme numéro, “nom”, dommage constant, dommage variable. La donnée numéro est le numéro de référence de l'arme. Par exemple, le nom de l'arme 12 est stocké dans le tableau nom arme$(12), le dommage constant dans def arme“(12,1) et le démiage variable dans def arme=(12,2}. I E E e e e e e d de d de d d e é u cd d e d d E * * DEFINITION DES ARMES # i RU LUE ÉTETÉETTETANÉTEÉEFETTE ‘DATA numéro, *nom”, dommage constant, dommage variable armes_data: DATA 1,”GRIFFES“.2.2 DATA 2,”CROCS“,2,3 DATA 3,”MORSURES EMPOISONNES®,1,5 DATA 3,“TENTACULES*,1,4 | ATARI MAGAZINE m BEST OF GFA RASIC | ‘ i | DATA 4, SOUFFLE DE FEU*,30,40 1 BATA 10,”COUTEAU“ 0,2 BATA: 11, “EPEE”,2,3 ¥ BATA 12, “EPEE LONGUE”,2,4 DATA 13, “MASSE”,2,3 DATA 14, “HACHE”,2.,2 DATA 15,”HACHE DE GUERRE“,2.4 DATA 16, “FLEAU®,3,3 DATA 17,”LANC,E1,*4 DATA 18, “CIMETERE”,2,4 L DATA -1 Ces lignes contiennent quélques exemples d'armes classiques dans un environnement médiéval-fantéstique, Les premières sont des armes naturelles utilisées par deverses creatures. Les suivantes sont des armes manufacturées utilisées par des êtres Intelligents comme les humains et les créatures plus où moins exotiques habitant les univers fantastiques forques, elfes, nains, gobeling, évc.) La procédure @init armes lit les informations stockées dans les lignes de DATA et les accumule dans les tableaux nom arme${) ct def arme=(). Elle doir être appelée en début de programme. PROCEDURE init armes LOCAL noms LOCAL degat constants LOCAL degat variable* LOCAL n= RESTORE armes data ARRAYFILL def arme%().0 0 READ n= EXIT IF m===l READ nom$ READ degat constants READ degat variabiés nom_a(rn%)m =enosm$ def arme%(n%,1)=degat constant* def arme%(n#,2)=degat variable% LOOP RETURN La procédure Odommagea rme(num arme=) calculé le dommage causé par l'arme num_armes, Les dommages variables sont calculés par la formule RANDOM{(prob degat%+1). Fourquat cette formule? Parce qué RANDO(nM) fournit un nombre aléatoire compris encre D'ern-L Pour cbtenir un nombre aléatoire compris entre O ec n, il faut utiliser la formule RANOOM(n#1}, L gk ok e o e RE A É R E E A E N O e e u e R V PR RE * # CALCUL DOMMAGE ARME num armet * 1 'l.”.l.“.i:'.'r'.'u”.t:'rtt'fl:*'fl::‘rfb:‘rtt*tt:‘r:‘:*:':t#r'i:'.'.“.'.‘'.':'.': FUNCTION dommage arme{num armes) LOCAL dégat constants LOCAL prob degat* LOCAL degat variables degat constaanrmte%(%nu=m adrmee&,f1l} prob degati=def arme“(num arme#,2) degat variable%*=RANDOdMe(gpatrio+1b) RETURN degat constant%+degat variable* ENOFUNC Les protections Les protections sont des vêtements ou des armures portés par les créatures du jen, Elles assurent une foncrion défénsive. En terme de jeu, elles diminuenc les dommages reçus par leurs utilisaléurs. Une protection est définié par un nom et une valeur de protection. Pour simplifier la programmation, la valeur de protection est cons lante Toutefois, vous pouvez modifiér lé programme pour obtenir uné protection variable, DIM nom protection$(100) DIM def protection%(100) ! def protections(n#) = nom protection n% ' def protection%{n%) = valeur protection n% Les protections sont définies dans des lignes de DATA. La liste suivante comprénd de nombreux exemplés de protection. La valeur -l ést l'indicareur de fin de donnees. ' | OUR ETEN ATATANAEER ' # DEFINITION DES PROTECTIONS * U e ol e i rr e e v de o e rrr d de e e v ok oy e i e r ce protections data: DATA 1,“FOURRURE”,1 DATA 2,“FOURRURE EPALSSE”,Z DATA 3,“ECAILLES”,2 DATA 4,“PLAQUES D'0S”,4 DATA 5,“PEAU DE DRAGON”,50 DATA 6, PEAU DE DEMONT1,0 DATA 20,“HABITS DE MENDIANTL”Û DATA 21,“HABITS DE COLPORTELR”,0 DATA 22,“VETEMENTS ORDINAIRE”,O DATA 23,“YETEMENTS DE CUIR”,] DATA 24,“ROBE DE PRETRE™.O DATA 25,”HABITS DE NOBLE“,D DATA 26, “VETEMENTS DE MARCHAND®,0 UATA 27, “ROBE MAGIQU,E4 DATA 40, “ARMURE DE CUIR”,2 DATA 41,”COTTE DE MAILLES®,3 DATA 42,”ARMURE DE PLAQUES”,4 DATA 43, “ARMURE DRACOMIQ* ,U 3E0 DATA 44, “ARMURE CHAOTIQUE”1*0,0 DATA -1 La procédure @init protections change les données scockées en DATA dans les tableaux nom protection$() ct def protectiont(). ATARI MAGAZINME m BEST OF GFA BASIC PROCEDURE init protections LOCAL nomé LOCAL protects LOCAL n% RESTORE protections data ARRAYFILL def protecti on=(),0 DO READ n EXIT 1F m==l READ nom$ READ protect= nom protect ion${n)=nom$ def protéctiont(n&)=protect® OGP RETURN La fonction Evaleur protection(objet®) fournit le nombre de points de protection fournis par l'objer objet*. E E ETE E R A NN W Rc t e e de dn d 4 E E E E E E RE E E E ' % VALEUR DE FROTECTION D'UN OBJET = |'YHETÉÉTNATAEESE É É RR RR ETE REEERXE FUNCTION valeur protection{objet*) RETURN üüf_prutüctiünë{nbjetäj ENDFUNC Au niveau rechnique, elle se contente de renvoyer la valeur de la variable def protection&(objet*). Cela peut paraître stupide d'écrire une fonction pour une opération aussi simple, mais cela permet d'obrenir une interface entre le programmé et les données indépendantes de la technique urilisée pour stocker les données. 5i vous modifiez la structure de stockage’ des protections, 1l suffira dé maoditier la fonction @valeur protection sans toucher au reste du programme pour que tout continue de fonétionner normalement. Les trésors Certaines créatures intelligentes peuvent posséder des objets pré cieux, 5i le personnage les tie, 1l récupère cès objets, Dans un but de simplification, le programme ne gére que la description des trésors. Elles sont stockées dans le tableau nom tresor$(). DIM nom tresor$(1060) Les descriprions des trésors sont définies dans des lignes de DATA Elles sont stockees sous la forme numéro trésor, “description””. Le numéro -1 correspond 4 la [in de donnges. D AR AR AR A EE LA A AT LT TR A h T, “ * DEFINITIONS DES TRESORS ” | ETAAREEAAAERUR e Re NE | DATA type trésor, “description” ' DATA =1 = fin des trésors treanraudata: DATA 1,”QUELQUES PIECES DE CUIVRES“ DATA 2,”QUELQUES PIECES D'OR® DATA 3,“DES CENTAINES DE PIECES D'OR” DATA 4,“UN TRESOR FABULEUX” DATA -1 La procédure Binit tresors initialise le tabléau nom tresor$() avec la description des trésors stoclcéés en DATA. PROCEQURE init tresers LOCAL nfl-:,treslurfu' RESTORE tresors data [0 READ MUNF EXIT 1F nums==1 READ tresor$ dom tresor$ (num#)=tresorh OGP RETURN Il est 'Lmru::ss':hï-r-. de creer une fonction Bdescription tresor (tresor*) renvoyant la description du trésor tresor® car le GFA Base n'admer pas les fonctions renvoyant une variable alphanumérique, FUNCTION description tresor(tresor) RETURM nom tresor$(tresor*) ENCIFUNEC Certe fonction provoque l'apparition d'un message d'erreur RETURN sans PROCEDURE La raison pour laquelle le système affiche un pareil message d'erreur n'est pas évident à première vuc, Etant donné que la syntaxe du GEA Basic ne comprend pas l'instruction RETURN suivie d'une variable alphanumérique, l'interpréteur pense que le RETURN est la fin d'une procédure, Et comme i1l ne trouve pas l'instruction PROCEDURE correspondant à RETURN {puisque c'est une FUNCTTON), il affiche un message d'erreur. Pour écrire une routine renvoyant la description d'un trésor, 1 faut utiliser l'instruction VAR qui permet de modifier la valeur d'un paramétré d’une procédure. PROCEDURE d&äcrîptîDn_treaür{trEEÜT%,FAH tresor$) tresor$=nom tresor$(tresor*) RETURN Pour écrire la descriprion du trésor numéro 2 dans là variable d$, 1l faut utiliser la formule Gdescription tresor(Z,d$}. 1R T R E TIR D R E TR -* \AFFICHAGE- TRESOR 2 * OURUR RERFEER RR A @descri ptiun_’_cr&su'rl[E ,d5) FRINT d$ Définition des créatures Les créatures sont définies par un nom, une Force, un nombre de Points de vie, une Capacité de combat, un Nembre d'attaques, une ATART MAGAZIME m BEST OF GFA BASIC Capacité de défense, un numéro d'arme, un numero de protection, un nombré dé-points d'expérience et un numtéro de crésor, Le nom dés. créatures est stocké dans le tablean nom creatured() et les caractéristiques dans le tableau def creature*(). DIM nom creature$(100) DIM def creature=(100,9) I ‘ def créatures(n#,1l) = Force ‘ def creature%(n#,2) = points de vie &ef_cre&tur&%[n%.äj = Capacité de Combat def creature=(n*,4) = Nb attaques def creature%(n*,5) = Capacité de défense def creature%(n%,6) = Numêro arme def creature“(n&,7) = Numéro Protection def creature%(n#,8) = Points expérience ‘ def creature%{n*,9) = Type de trésor Les caractéristiques des créatures sont stockees dans des lignes de DATA Chaque créature possède un numéro de référence. Les créacures 1 a 19 sont des animaux. Les créatures 20 à 49 sont des créatures intelli gentes. Les créarures 30 a 100 sont des créatures surnaturelles ou extrémemeént puissantes. Tous les numeéros de référence ne sont pas arrcibués, Il reste de le place pour vos propres monstres. Remarque, s1 une créature ne possède pas de trésor, sa caractéristique trésor contient la valeur 0. RR e e o o b e o e e e b R NN SE “ * DEFINITION DES CHEATURES * 1 B g e B s B B - B i i 3 e e e i R DATA Numéro, “Nom”, Force, Points de vie DATA Combat (%), Nb attaques, Défense (%) DATA Arme, Pratecltion DATA Points d'expériences, Trésaor ” DATA -1 = fin des créaturés creaturés data: I NHVÉREEEAAAAE c18 (B | L | g o ke ol ol o T ol * FORCE:18; VIE:30 * COMBAT:68%; — ATTAQUE:2; DEFENSE:50%; ARME-Griffes: PROTECTION:Fourrure épaissé EXP:1000; TRESOR:Aucun DATA 1,“OURS”, 18,30 DATA 68,2,50 DATA 1,7 DATA 1000, 0 | kNOR L % 9. LOUP CRIS * | gtk kB E et RS FORCE:13; \ VIEz12 * COMBAT:B0%: ATTAQUE:1l; DEFENSE:d40% ARME:Crocs: PROTECTION:Fourrure épaissé EXP-Z00; TRESOR:Autun DATA Z, 'LOUP GRIS*,13,12 DATA 80,1,40 DATA 2,7 DATA 200,0 LR b Lok o g * 335ERPENT -* TIR e e e FORCE+10: YIE:1B COMBAT:60%; ATTAQUE:1; DEFENSE:30 ARME :Morsure; PROTECTION:Fcailles; * EXP-400: TRESOR:Aucun DATA 3,“SERPENT”,10,16 DATA 60,1,30 DATA 3.3 DATA 400, 0 L o o b o T R T T b Ak R R e o e e i B * * 20 : BARBARE DU DESERT * D p e d R e d r d E FORCE:14; FOINTS DE VIE:13 ! COMBAT - 603 ATTAQUE+2+ DEFENSE:35 ARME:Cimeterre; PROTECTION:Armure de cuir * EXP:800; TRESOR:Moyen DATA 20,“BARBARE DU DESERT”,14,13 DATA 60,2,35 DATA 18,40 DATA B0Û, 2 L p E # 215 QROUE” o dede ke de ok & NN N W FORCE:13; POINTS DE VIE:14 COMBAT:62; ATTAQUE:1; DEFENSE:S50% ARME :Masse; PRflTEETIDH:HrmurE_dE cuir * EXP:150; TRESOR:Faible DATA 21,“OROUE”,13,14 DATA 62,1,50 DATA 13,40 DATA 150,1 I gktttRR ' Æ 22: ELFE NDIR * l gl ol ol e e e ey R R o FORCE:12: POINTS DE VIE:16 COMBAT:90% ATTAQUE:3; DEFENSE:50 * ARME:Epée longue; PROTECTION:Armure de plaques “ EXP:2000; TRESOR:Moyen DATA #2,”ELFE NQIR“,12,16 DATA 90,3,50 DATA 12,42 DATA 2000,2 I ko g ok o S E o A R W W ATAR| MAGAZIME E BEST OF GFA BASIC “* 50: DEMON * RU ÉT R AN A FORCE:20:; POINTS DE VIE:50 COMBAT:90; ATTAQUE:5; DEFENSE:80 ARME-Griffes; PROTECTION:Feau de démon ! EXP-10000; TRESOR:Aucun DATA 50,”DEMON” , 20,50 DATA 90,5,80 DATA 1,6 DATA 10000,0 I Fdxxdttithraextihl | * 51: CRAGON 7* ÉURRRERAEÉTERERRX FORCE: 30 POINTS DE VIE:500 COMBAT:100 ATTAQUE:10 DEFENSE:90 ARME:Souffle de feu; PROTECTION: Feau de Dragon ' EXP:90000; TRESOR: Fabuleux - c DATA 51, “DRAGON” 30,500 DATA 100,10,90 DATA 4,5 DATA 90000,4 DATA -1 La procédure Cinit creatures remplit le tableau def creaturek () avec les créatures définies dans les lignes de DATA, PROCEDURE init crealures LOCAL n%,nom$, force*,points vie% LOCAL combat®,nb attaques“,defénsé# LOCAL arme%,protection& LOCAL experiences, Lresor® RESTORE creatures data D READ n EXIT IF n%=-1 READ nomt READ force* READ points vie* READ combat* READ nb attaquess READ defenses READ armes READ protéction= READ experiance READ tresors num_;reaturui{nêjwnnmî def creature%(n%,1)=forces def creature=(n%,2)=poivnitcsk def creature“(n‘,3)=combat# def creature“{n&,4)=nb attaqués* def creature%(n%,5)=defenses def creature%(n*,6)-armes def creature%(n#,7)=protectioné def creature*%(n#,8)=experience* def creature=(n%,9)=trésors LOOP RETURN Les fonctions suivantes permettent au programme d'obtemir des informacions sur vne créature sans s'occuper de la structure de stockage des données, Elles simplifient la programmation éc augmentent la FUNCTION force creature({creatures) RETURN def creature%(creature*,1) ENDFUNC FUNCT ION vîe_cre&ture[creatureä] , RETURN def creature%{creaturey,?2) ENDFUNC FUNCTION combat creature(creature*) RETURN def creatures(creatures3,) ENCEUNC FUNCTION nb attaques creature(creature*) RETURN def creature*(creature%,4) ENDFUNC FUNCTION defense creature{creature*) RETURN def creature%(creature*,5) ENDFUMNC FUNCTION arme creature(creatured) RETURN def creature%(creature=,b) ENDFUNC FUNCTION protection creature(creature%) RETURN OEef_;reature%[Ereature%,?] ‘ ENDFUNC ä FUNCTION experience creature(creature®) RETURN def creatureX(creature%,8) ENDFUNC = FUNCTION tresor creature(creature*) RETURN def creature%(creature%,9) ENDFUNT Définition du personnage Le personnage est péré d'uné manière lépérement différente de celle des créatures, Î possède une donné supplémentaire: le nombre de points de vie temporaire, Ces points de vie diminuent lorsque le personnage reçoit un coup dans un combat. 5i le nombre de points de vic temporaire tombe 4 0, le personnage est mort. Les créatures ne possédent pas de points de vie temporaires car leurs caractéristiques sont informatives, Lorsque le programme doir gérer un combar entre le personnage et une créaturé, il récopie dans une ATAR| MAGAZINE m BEST OF GFA BASIC variable spéciale le nombre de points de vie de la créatute et décrémente cette variable lorsque la créiture reçoit un coup. Ce système évite de modifier la valeur des caractéristiques stockées en mémoire, Si le personnage rencontre un loup peu de remps après avoir tué Un premier loup, les caractéristiques du second doivent être identiques à celles du premier (et tout particulièrement le nombre de points de vie). Le nom du personnage est stocké dans la variable nom persob. Les caractéristiques sont stockées dans le tableau def perso¥(). La caractéristique Expérience correspond au nombre de points d'expé rence accumulé par le personnage lors de ses affrontements. Elle vaut C au débue du programme. nom perso$=“” DIM def perso=(9) ‘ def perso%(1) = Force def perso%(2} = Points de vie max def perso%(3) = Points de vie temporaire def perso%(4) = Compétence de combat (%) def perso®(5) = Nb attagues def persot(6) - Compétence de défense (%) def perso%(7) = Expérience » def perso%(8) = Arme def perso&(9) = Protection - Les statistiques du personnage sont définies dans des lignes de DATA. Etant donné le peric nombre de caractéristiques, elles auraient pu être écrites directement dans les variables concernées, mais c'ost une métheode de programmation à éviter. ! DATA Nom, Force, Foints de vié DATA Combat (%), Nb'attaques, Défense (%) DATA Arme, Protection nom: KURT BRISE-CRANE FORCE:13; VIE:15; COMBAT:70%; ATTAQUE:1; DEFENSE:bD% ARME-EPEE LONGUE; Protection: COTTE DE MAILLES - perso data: DATA “KURT BRESE-CRANE”.13,13 DATA 701,60 DATA 12,41 La procédure @init_perso initialise la variable nom_perso} et le tableau def perso®() avec les informations définissant le personnage. PROCEDURE init perso LOCAL nomt, force*,points vies LOCAL combat&,nb _attaques®,defenses LOCAL armes,protectionk RESTORE perso data 1 READ nom$ READ forces READ poînts vies READ combat* READ nb attaques= READ defenses READ arme* READ protéctions nom pérsos=nom$ def persos(1)“force* def perso®%(2)=points vieq def perso%(3)=points_vie% def perso=(4)=combat® def perso®(5)=nb_attaques* def perso%{6)=defenses def perso(7)=0 def perso%(8)=arme% def perso#(9)=protection* RETURN Les fonctions suivantes permettent au programme d'accéder facilement aux données définissant le personnage. De la même manière que les foncrions d'informations sur les créatures, elles permettent d'accéder aux informations du personnage sans rien connaïtre de léurs structures de stockape. FUNCTION force perso RETURN def persox(1) ! ENDFLUNC FUNCTION vie max perso RETURN def perso%(2) ENDFUNG FUNCTION vie perso RETURN def perso%(3) ENDEUNL FUNCTION Combat persa RETURN def persos(4) ENDFUNE FUMÉTION nb attaques perso RETURN def perso%(5) ENDFUNEC FUNCTION defense perso RETURN üeî_perâü%[fi} ENDFUNC FUNCTION experience perso RETURN def persoë(7) ENDFUNE FURCTION arme perso RETURN def perso%(8) ENDFLINC FUNCTION protection perso ATARI MAGAZINE H BEST OF GFA BASIC RETURN def perso%(9) ENDFUNC Bonus aux dommages Un homme fort fait plus de dégâts avéc une épée qu'un fréle garçon utilisant la même arme. Les dégâts supplémentaires viennent de la différence de force entre l'homme ct le garçon. Pour sumuler Peffer de la force sur les dommages, le programme calcule le dommage d'une attaque en additionnant le dommage de l'arme et une valeur appelé «bonus de forces. Le bonus de force dépend de la force de l'attaquant. Plus un personnage est fort, plus son bonus de dommage est important. De la même manière, plus un personnage est faible, moins son bonus de Force est élevé. Une créature vraiment faible peut même avoir un bonus de dommage négatf, La mamere la plus simple de gérer les bonus de force est de les stocker dans le tableau bonus dommage%{}. Pour connaître le bonus de force de la Torce f%, il suffir de lire la valeur de bonus dommage={f#). DIM bonus dommages{30) La valeur des bonus est stockée dans des liemes de DATA. Les bonus ont été établis en tenant compte qu'un homme avéc une foice de 10 tl'a aucun bonus, Is sont définis sous la forme «Force/Bonuss. La valeur -1 est l'indicateur de fin de données. 51 vous voulez étendre | table de bonus au-delà de 30, i1 faut augmenter la taille du tableau bonus donmage*(). bonus dommages data: DATA 1,=6, 2,-4, 3,=-3, 42 51 DAEN 61 i By 8L / 1F0 DATA EE.0x - 2. B3, 18474 1655 DATA 16,4, 17,5, 18,6, 19,7, 206 DATA: 2105 22 dd, 2311, C les 79577 DATA 26,14, 27,15, 28,1k, 29,17, 30,19 DATA =1 Binit bonus charge les bonus dans le tableau bonus dommages (). PROCEDURE init bonus LOCAL n%, bonus% ARRAYFILL bonus dommage#(},0 RESTORE bonus dommages data DD READ n* EXIT IF n%==1 READ bonuss bonus dommage* (n#)=bonus® LODP RETURN La lonction @bonus force(force®) fournit le bonus de force cor respondant à la force force*, ( E d e RE É E e e ETE e e e e e e e e e e E S - % MALEUR DU BONUS DE FORCE * I UTVARINÉTÉEETTEEÉTÉÉA TR TUR RRÉE FUNCTION bonus force(force*) RETURM bonus dommage*(force=) ENDFUNC Initialisation des données du programme La procédure Ginit datas inittalise les rableaux de données avec la définition des différents objers du jou (armes, protéctions, trésors, etc.) Elle doit impérativement être appelée en debut de programme. PROCEDURE init datas Pinit armes Binit protections Binit trésors Binit bonus Vinit perso GInit creatures RETURN Exécution d'un combat Pour exécuter un combat, le programme a bésoin de connaître le type de la créature affrontant le personnage et son nombre de points dé vie La procédure @exec combat{creatures) simule un combar entre le personnage et une créature de type creature. Le type de créature est stocke dans la variable gluh;ale typ ennemis et son nembre de points de vic dans la vartable globale vie ennemi%, Dés que l'un des combattants est mort, la routine Gexec combat aifiche le résultat du combar, Si le personnage est vivant, elle affiche le nombre de points de vie rescant, le nombre de points d'expérience gagnés ot le type de trésor éventuellement possédé par la créature. PROCEDURE exec combat(creature*) LOCAL m£ LOCAL tresors LOCAL tresorf LOCAL exp# typ ennemi%=creatures vie ennemis=@vie creature(creature*) Ecombat ÎF @mort ennemi=l m$=nom créature${typ ennemi#) m$=m$+“ est mort” FRINT PRINT m£ _ tresor*=-Étresor creature(typ ennemi*) exp4+-Hexperience creature(typ ennemi*) IF trésor&e>û @Éeacriutiün_treaur{treaurä,trüäürfil PRINT “TRESOR : ”;tresors ENDIF PRINT “EXFERTENCE : “zexp® PRINT “Points de vie perso : ”; ATAR| MAGAZIME W BEST OF GFRA BASIC == —_d' i PRINT @vie perso: “Ry é Mmax perso PRINT ENDIF IF @mort perso=l PRINT PRINT nom persof+” est mort” ENDIF RETURN La fonction @morl ennemi reste st l'adversaire du personnage est mort en regardant la valeur contenue dans la variable vie _ ennemi*, Elle renvoie 1 si l'adversaire est mort ct O dans le cas contraire. | HEF s L L PR S LR E R A R R IERE ” % TEST SI L'ADVERSAIRE DU PERSD EST MORT * I kR R E R AN e R Ry ARtk d e e e e e RE AW FUNCTION mort ennemi LOCAL resul t® LF vie ennemiz⇐{ result#=] ELSE result==0 ENDIF RETURN results ENDFUNC La fonétion émort_perso teste si le personnage est mort. Elle utilise la routine @vie perso pour connaître le nombre de points de vié| restant du personnage. Elle retourne 1 si le personnage est mort et 0 dans le cas contraire. Vg g o v e o e or oo o ok o ok e e e i R RRN e RR “ % TEST SI LE PERSONNAGE EST MORT * L T E B 1 I i o be r e e e ” e r e e d FUNCTION mort perso LOCAL résult* IF @vie perso⇐0 result#=1 ELSE resull#=[ ENDIF RETURN resutl% ENDEUNEC Gestion du combat La procédure @combät gére l’enchaïnement des rounds de combat. La procédure @round combat simule Pexécution d'un round. Le combar ne s’arrête que lorsque l’un des combattants est mort. L dc d é d E R E A P R RESRE SE t ! # o GESTION DU COMBAT #* L E E E e E E R R E e dc d uE PROCEDURE combat DD @round combat CAIT IF Émort perso=1 EXIT IF @mort ennemi=l LGOP RETURN Exécution d'un round de combat La procédure Oround combat gère l'exécution d'un round de combat, Les adversaires frappent les uns apris les aucres jusqu'à épuisement de leur nombre d'attaques. Le combat cesse immiédiarement st l'un des combattants meurt. La routine lit le nombre d'arraque de chaque combattant, puis les exécute à la suite, La variable nb_att perso® contient le nombre d'attaques du personnage, Le nombre d'atraques de son adversaire st stocké dans la variable nb att ennemi*% Le conrenu de ces variables est cdécrémenté après chaque artaque. |l o o e e b e S ol E E RR SE RE ! * EXECUTION D'UN ROUND DE COMBAT * P REREÉÉPERRERERR RRN E A A E E PROCEDURE round combat LOCAL nb att persox LOCAL nb att ennemi% nb att perso%=Enb attaques perso nb att ennemi$=@nb attaques creature(typ ennemi%) REFPEAT IF nb att persos⇐0 Gattaque ennemi DEC nb att persos ENDIF EXIT IF @mort ennemi=l IF nb att_ennemis==0 Pattaque perso DEC mo att ennemi= ENDIF EXIT IF Bmort perso=l UNTIL (nb att perso%=0} AND (nb_att ennemi%=0) RETURN La routine Ground combat utilisé la fonction @nb attaque perso pour connaître le nombre d'artaques du personnage. Cetté fonchion assuré l'interfäce entre le programme et une des informations definissant lé pérsonnagé, La routine Qattaque ennemi simule une attraqué du joueur contre son adversaire, La routine daitaque perso simule une attaque de l'ennemi concre le personnage. Le personnage attaque son adversaire La procédure @attaque ennemi gére l'attaque du personnage contre son ennemi, La probabilité que le personnage couche son adversaire est la compétence de combat du personnage diminuée de la compétence de défense de l'ennemi, Si la probabilité dé toucher est ATARI MAGAZINE D0 BESTOFGFA BASIC trop faible, elle est ajustée à 5% afin qu’un combattant trop faible aie quand même une chance de roucher son adversaire (même si célui<i est une créature fabuleusément puissante). D B I e 0 o U S e e d d E ! * LE PERSONNAGE ATTAQUE #* b SÛN ENNEMI % I WA E ik s & o o RR R TR PROCEDURE attaque ennemi LOCAL combat perso% LOCAL defense creatures LOCAL pourcentages LOCAL mb | combat perso%=@combat perso defenae_treature%-@defenae_creature{typ_ennemi%] pourcentage%*=combat perso%-defense creature* IF pourcentage*=<5 pourcentage*%=5 ENDIF IF (RANDOM(100)+1)⇐pourcentages dommage“=Édommage creature(num _ ennemi#) IF dommagete=0 SUE vie ennemi®, dommage* mÿ=nom creaturet(typ_ennemi %) mé=m$+“ reçoit ”+STR}{dommage*) mi=mi+“ points de dommage” PRINT m ENDIF ENDIF RETURN Si l’ennemi est touché, le programme affiche le nombre de points de dégâts. Le programme teste la valeur des dommages pour éviter d'affichér un dommage de 0 point de décâr. Cela peut arriver s une créature dotéé d'une forte protection reçoit un coup faible (par exemple un coup de canif contre une armure de plagues). Calcul des dommages causés par le personnage La fonction @dommage creature calcule les dégâts fait par le jouèur à son ennemi. Ils sont égaux aux dommages causés par l'arme du personnage, plus le bonus de force du personnage, moins la protect- lfll'l'l_ dfi ]“-!:n:ru:mi- Dans certains cas de figure, le dommage peut être négatif, Cela peut notament arriver avec une arme faible et une grosse valeur dé protecton. Pour éviter cela, les dépâts négatits sont automatiquement ajustés à 0. FUNCTION dommage creature(creatures} LOCAL force* LOCAL arme LOCAL dommages: LOCAL protections force*=Pforce perso arme*=Carme perso protect{on%=@protection creature(creatures) dommage%-Édommaargmee [armes) ADD dommage%,@bonus force{forces) SUB dommage%,Bvaleur prôtection({protections) IF dommage*=<i - dommage*=û ENOIF RETURN dommage* ENDFUNC L'adversaire attaque le personnage La procédure Pattaque perso gère l'attaque de l'ennemi contre le personnage. Elle fonctionne de la même manière que la procédure Battague ennemi & céci que l'attaquant et le défenseur sont in- F VErSCS | A A R E E U E S É RR R A A E E E A A RIR E S °* L'ENNEMI typ creatures * ” * ATTAQUE LE PERSONNAGE ™ | HEN ETÉEETATEREENAN PROCEDURE attaque perso LOCAL combat ennemis LOCAL defense perso® LOCAL pourcentage* combat ennemi*=Éécombat creature(typ_ennemi*) defense perso*-Édefense creature(typ_ennemi*) pourcentage%=combat ennemi%-defense persos L} 1F pourcentages<s pourcentage*=5 ENDIF 1F (RANDOM(100)+1)⇐pourcentage* dommage*=Édommage perso{typ ennemi=} IF dommages==0 @Eec_vie_persn[duwwmge%} m$=nom perso$+“ perd “4STR4 {dommage* } m£=m{+” points de vie.” PRINT mi ENDIF ENDIF RETURN Certe routine affiche le nombre de points de dégats encaissés par le persontage quand i1l ést touché Un test sur cette valeur evite d'affrcher un dommage de 0 point. La procédure @dec vie perso(dommage&) permet de gérer facile ment la perte de poinrs de vie du personnage. ÉATAR| MAGAZINE W BEST OF GFA BASIC Calcul des dommages recus par le personnage La fonction @dommage perso(creatures) calcule les dommages causés par la créature crealuret contré le personnage. Leur valeur est calculée en fonetion de l'arme et du bonus de force de la créature Le dommage est diminué de la valeur de prorection du personnage. Le principe de fonctionnement est le même que celui de la procédure dommage crealure(creatures). | T SRR I RE É RR R e e T EARRR E PO B o RE ' * CALCUL DU DOMMAGE FAIT PAR LA CREATURE o ! * creatureñ AU PERSONNAGE s | hhh e d e e AR AR T A d e P FUNCTION dommage perso(creature) LOCAL forces LOCAL armet LOCAL dommages LOCAL protections * forcet=Gforce creature(creature*) armes=Garme creature(creature) protections=Cprotection perso doimage*=Bdommage arme(arme*) ADD dommage&, @honus force(force) SUB dommages @valeur protection(protections) IF dommage=<l dommage*%=0 ENDIF RETURN dommages ENDFUNC Certe routine utilise la fonction Évaleur protection(protection%) qui permer de connaître le nombre de points de protection assuré par l'objet protections. Les éventuels dommages négatifs sont autômatiquement remis à 0. ' Perte des points de vie du personnage Ia fonction êdec vie perso(n#) diminue les points de vie temporaires du personnage, Le nombre de points de vie temporaire ne peuvent descendre en-dessous de 0. PROCEDURE dec vie perso(n*) SUB def persof(3),n% IF def perso%{3)=<0 def perso%{3)-0 ENDIF RETURN Augmentation des points de vie du personnage Là procédure inc vie perso(n%) augmente le nombre de pounrs de vie temporaire de n& points. Elle effectue un test pour s'assurer que le nombre de points ne dépassé pas le nombre de points maximum du personnage. PROCEDURE inc vie perso{n%) ADD def perso%(3),n% IF def perso%(3)>0vie max perso def perso%(3)=@vie max perso ENDIF RETURN Soins médicoux Après avoir perdu des points de vie dans un combat, le personnage peut se rendre chez un soigneur pour reprendre des forces. Afin de simuler les aléas de la réalité le personnage ne récupère pas un nombre fixe de points de vie, mais vn nombre déterminé avec une formule aléatoire. Un soin permer de récupérer 3 points de vie au minimum & 6 points au maximuni. Le titage se fait avec l'instruetion RANCOM(4)+3. La formule RANDOM(4) fournit un nombre aléatoire compris entre Ü et 3, PROCEDURE soins perso LOCAL soins% [F @vie perso=Ëvie max perso PRINT “Pas bésoin de soins” ELSE soins*=RANDOM(4]+3 IF (Bvie perso+soinsk)=@vie max perso s0ins%=0vie max pérso-évie perso ENDIF @inc_vie perso(soins®) PRINT “Le personnage récupére ; PRINT STRÿ(soïns*); PRINT ” points de vie.” PRINT “Points de vie perso : “; PRINT @viep erso;”/“:Bvie_pmerasxo ENDEF FRINT RETLIRN La procédure Bsoins perso soigne le personnage et affiche le résultat des soins. Le programme ajuste le nombre de points de soins de manière à ne pas dépasser le nombre de points de vie maximal. Les jeux de rôle micro offrent divers méthodes de soins : sorts de guérison, potions magiques de soins, guérisseurs, herbes médicinales, ete, Ces méthodes fonctionnent toute de la même manière, c'ést-é<di re en augmentant lé nombre de points de vie, Mais ils peuvent varier au niveau de Pefficacité, du prix et de la disponibilité Pour varier les plaisirs, vous pouvez introduire dans votre jeu des soins particuliers permettant de guérir des maux spécifiques (por sons, maladies, malédictions, etc.) ATARI MAGAZIME H BEST OF GFA BASIC Structure du programme complet La srrucrure du programme complet est la suivante : RESERVE 100000 * Déclaration des tableaux Binit datas Emain END ' Code procédure main ' Codes des procédures du programme ' Definition des données en DATA La procédure principale La procédure @maîn est une procédure de test qui vous permet de tester le système de combat. C’est une routine 'minimum' qui simule le programme de jeu de rôle appelant le gestionnaire de combat. PROCEQURE main LOCAL c$,creat% D PRINT “C)ombat” PRINT “S)oins perso” PRINT “F)in combat” LY cH=INKEYS ch=lPPER${(ch}) EXIT IF (c$=“C”) OR (c$=“5”) OR (ch~“F”) LODP SELECT cf CASE “CM, “c* INEUT “Muméro créature ” ,creat= PRINT Bexec combat(creat*) CASE ||–5l.'|!|I5II @soins perso ENDSELECT EXIT IF (c$=“F”) OR (c$=”{”) EXIT IF Émort perso LOOF RETURN Améliorations du programme Le système de combat peut être amélioré de nombreuses manières. -Vous pouvez rajouter une caracteristique D'externite ct faire en sorte que la créature ayant la plus forte dextérité frappe en premier. Le personnage peéur affronter plusieurs ennemis à la fois. Les modifi- La psychologie des creatures du jeu est trés sumple puisqu'elles combattent jusqu'à la mort. Ce n'est pas tres realiste. Les créatures devraient avoir la possibilité de fuir lorsqu'elles commencent à perdre ATARI MAGAZINE Ë BEST OF GFA BASIC l—'–'———fl————nl-l—'– - à ue E à u H à H R u H N S EN E S O S B S rs e S r S S S S B B B S S OB E S S S S S CO E S S C C r E possibilité de rompre le combat. La visualisation des combars est sommaire, Îl est possible d'ajouter des messages supplémentairafeisn de rendre les combats plus réalistes. Aver bmaucoup de travail, vous pouvez réaliser une visualisation graphique des combats. Les listes d'objets (armes, protections, trésors ec creatures) ne sont pas longues. Il peut être amusant de définir de nouvelles armes et de riouvelles créatures, 51 vous nous cnvoyez des listes incéressantes, nous les mettrons en téléchargement sur le serveur 3615 ATARL PLUS DE 1 500 LOGICIELS GRATUITS! TELECHARGEZ [ le commande le KIT DE TELECHARGEMENT (câble de loison Atori STminitel + une disquette confenont des utilitaires de iéléchorgemenmte) permettant de télécharger grruitement des centoines de progrommes, De plus 6 disquétte contient e jau PMAVYIEL, pour jouer contre des centaines d'odverairs à trovers toute o France grâce au réseau minitel. Prix excaptionnel: 95 F + & de frais d'expéditi=o1n0™1 F O Je commande uniguement la disquetie du léchormement, 3 pouces |/2 pour 51 ou prix ge 15 F + 6 F de porticipation oux frais d'expédifion=21 F 16F pour l'étrnger=31 F!, [] le commande vniquement la disquette du téléchargement, 3 pouces 172 pour PC au prix de 16 F + & F de participation aux frois d'expéaition= 22F 116 F pour l'étranger=32 F). NE TAPEZ PLUS LES LISTING! CHARGEZ-LES [] e commande la disquette BEST OF GRA BASIC avec les images ou prix de 70 F Sl es écoipé d'in MAFGAeS To Eo BT e cébidse boson deilête complétpso v cdc péateur SS brocres (non louri por Futicresset. Ci-joint mon réglement da _ il F par chèque bancaire ou postal (les mandats ne peuvent être acceptés sauf pour les DOM/TOM =t étangers en FF] à l'ordre d'ARTIPRESSE. MNom 1 T ey E TG [0 . N o T bL e ) Prénom e e [ el o S d r o B | Adresse Éi e Pt el Él T e o | | | | | | | | | | | Code postal LS d b iy PE O C z vl Ps Ville 0 P, RR HE R 2 Py RN Cm 0 SE ME Pays [0 e e L S oy ool PE E 1S 1 E Date decde L | 1+ | 1 99| IMPORTANT : |l n'est pas accusé récepton des commandes. l'encaissement de votre chèque signifie que volre ordr& à élé enregistré dans le fichier informatique. Délai d'expédition 3 semaines après encaissement. (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 * | RH SRE E R A E E 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 * | RESR RL R A s Ebt b DATA La ville s'étend encore plus loin dans cette DATA direction. Vous ne pouvez pas aller plus loin (pour DATA l'instant). DATA # | NAXÉÉÉEÈAENHRRR E ARAREEEAA A R ! * 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 * | ke kel i i i v TD e e o e ke e É ol S e e E 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 # —— | LHAARRS RRN AN R N IERE | # DIALOGUE & : PRISONNIER 1 * | RRN VV ETE E R RE 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 * | T T o R T i o e e e e R ! # DIALOGUE 5 : PRISONNIER 2 7 | éx th h ek RRN ke sk e e 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 * | XEÉVAVVLARASEEÉAARRWRRE 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 | utilisé dans les 3 résolutions praphiques de PAtari (basse résolution 320×200 en 16 couleurs, movenne résolution 640x2C0 en 4 cou- | leurs, haute résolution 640×400 en deux couleurs &t uniquement sur 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- | tion. Certains jeux utilisent de telles souris, mais pour arriver à leurs fins les programmeurs écrivent entiérement leurs propres routines. @ / d'E =< f TR 8 @ s Ok £ 98 # L | | ce Nce c @ K | |6v2? HUVN0® 6 L B Dessin des souris | Les différentes souris proposées dans cet article ont été déssinées avec | le logiciel de dessin, Degas Flite. Les dessins ont ensuite été trans- . 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 | dans les journaux ou dans les livres, mais il faut savoir que les gra- ' |'_ 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 à | partir du GFA Basic. Vous pouvez employer ces souris dans vos 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, |:' ATARI MAGAZINE m BEST OF-GFA BASIC -_ 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 | LS RRRRRAANA e o e e A R SRE A E RE S RN A e e RE ! = 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 = | RE EAA TVRE REN A NNAAAREÉE RRN RE AAR R 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 | e AP R R R e d É É RE * 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 | VR RE RR RRN RE RR RESRE E AN NNN ÉÉÉ É R PR E E L W & ! = GENERATION DE FICHIERS CODE POUR FORME DE SOURIS * L — — | dkkkd d d d R R é R d d E R AN E A RR RE E ” © 1989 Patrick Leclercq & ATARI MAGAZINE | ukh hhhadé é r E RR R A E d e d in ' # 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 | dede i b e o ok ol e e e ol e ok ok e e e o ok e e e e e e e ok oo ol e ! * 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 | *Paramétres: px% et pyk position de la 1igne à coder.* 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 * |t*gfifitwt*tt*ttti#JIi*##ii#t*tt 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 "