home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / CT / CT9405 / ATLAS4 / PASCAL.TXT < prev    next >
Text File  |  1994-03-19  |  10KB  |  209 lines

  1. ATLAS: (BIJNA ALLE) INTERNE GEHEIMEN!
  2.  
  3. Programmeren is terug van 'weg-geweest'. Wat lang het exclusieve domein
  4. was van professionals of freaks ligt sinds een paar jaar binnen het bereik van
  5. elke serieuze gebruiker en dat hoeft geen verslaafde te zijn.
  6.  
  7. WERKING
  8. 1. Het programma detecteert de muis en de grafische schermdriver. Is er geen
  9.    muisdriver geladen dan wordt op cursorbesturing overgeschakeld. 
  10.    De Cursorbesturing is overigens niet feilloos!! Er volgt een korte 
  11.    instructie.
  12. 2. Het scherm wordt opgebouwd en in het geheugen opgeslagen. Dat ge-
  13.    beurt in 3 delen, want de variabele die de gegevens bevat mag niet groter
  14.    zijn dan 64K.
  15. 3. De koördinaten waar zich de muis (of de cursor) bevindt worden  uitgele-
  16.    zen en al naar gelang de uitkomst wordt er vanuit het hoofdmenu een ak-
  17.    tie ondernomen.
  18. 4. Het menu OPTIES biedt twee speelmogelijkheden: aanwijzen of puzzelen.
  19. 5. Het menu INFO geeft informatie over de gekozen speelmogelijkheid.
  20. 6. Als wij de kaart van Nederland aanwijzen, dan wordt die snel getekend
  21.    en er worden 25 records uit de file NEDERLND.GEO gelezen. Allemaal op het
  22.    gekozen niveau of lager, maar verder in willekeurige volgorde. De 25
  23.    namen uit die records worden op het scherm in een kolom geplaatst.
  24. 7. Intern wordt de stopwatch gestart en steeds als er op de linkermuisknop is
  25.    geklikt wordt de positie van de muis vergeleken met de koördinaten uit het
  26.    record dat aan de beurt is. Als alle opgegeven namen zijn aangewezen wordt
  27.    de score berekend en de prestatie vergeleken met de prestaties die tot nu toe
  28.    waren  vastgelegd. Als er nog niet eerder met het programma was gewerkt,
  29.    dan kunnen de eerste tien spelers hun naam invoeren. Als de elfde beter is
  30.    dan een van de eerste tien, dan zal nummer tien  afvallen: de gegevens (naam
  31.    en puntental) verdwijnen.
  32. 8. Wordt er tijdens een spel of een menu op de rechtermuisknop (of op ESC bij
  33.    cursorbesturing) gedrukt, dan keert het programma terug naar het hoofdmenu.
  34.  
  35. TURBO-PASCAL
  36. De voorbeelden in dit artikel zijn in TURBO-PASCAL. Ervaren programmeurs in
  37. Basic of C kunnen zelf bedenken hoe de voorbeelden in hun taal zouden luiden.
  38. Kent u geen enkele programmeertaal, dan komt u met een paar Engelse woorden
  39. (repeat until, begin end, enz.) al een heel eind op weg. In de voorbeelden zit
  40. geen verdere hocus-pocus.
  41.  
  42. ALLES INBOUWEN EN AUTOMATISCH DETECTEREN
  43. Het doel van de programmeur was ambitieus: hij wilde een educatief spel maken
  44. dat op alle MS-DOS computers zou kunnen werken: met of zonder muis, met of
  45. zonder kleurenscherm en automatisch omschakelend naar zoveel mogelijk verschil-
  46. lende schermen: CGA, HERCULES, EGA-VGA, ATT400 en PC3270.
  47. TURBO-PASCAL wordt geleverd met drivers voor deze schermen. In de handleiding
  48. is te vinden hoe je die drivers in het programma kunt inbouwen, zodat er geen
  49. externe files nodig zijn. Kort gezegd komt het hierop neer:
  50. Alle grafische drivers (*.BGI) worden met BINOBJ.EXE omgezet in *.OBJ files.
  51. Die *.OBJ files worden in het programma gelinkt en binnen het programma ge-
  52. registreerd vóórdat INITGRAPH wordt aangeroepen.
  53. Dat werkt als volgt:
  54.  
  55. procedure EgaVgaDriverProc; external;
  56. {$L EGAVGA.OBJ }
  57. procedure HercDriverProc; external;
  58. {$L HERC.OBJ }
  59. De stukjes tussen {} zijn geen commentaar, maar compilerinstructies.
  60. Nadat deze externe procedure is aangeroepen kan met
  61.  
  62.  RegisterBGIdriver(@EGAVGADriverProc);
  63.  RegisterBGIdriver(@HercDriverProc);
  64.  InitGraph(Gdriver,Gmode);
  65.  
  66. de goede schermdriver worden geïnitialiseerd.
  67.  
  68. Wie dit zelf eens wil proberen kan het door BORLAND met de compiler meegele-
  69. verde voorbeeld GRLINK.PAS bestuderen. Het programma wordt groter, maar
  70. overzichtelijker en de gebruiker komt niet voor verrassingen te staan als:
  71. 'Device driver file not found'.
  72.  
  73. KAARTEN IN KLEUR
  74. Het meest opvallende detail aan het programma ATLAS zijn de acht kaartjes.
  75. Hoe komen die in het programma? Eerst is geprobeerd om de landkaarten met
  76. een scanner en met een digitaal fototoestel in het programma te krijgen.
  77. Dat mislukte, omdat een flink kaartje in kleur op de disk wel zo'n 100K
  78. neemt. Toen groeide het idee niet het hele kaartje op te slaan, maar slechts
  79. de handelingen die nodig zijn om het kaartje te tekenen. Het eenvoudigste
  80. tekenprogramma dat te bedenken was, voldeed voor dit doel. Het werkt zo: el-
  81. ke keer als er op de muisknop wordt gedrukt, worden de koördinaten van de
  82. muis in een array geplaatst.
  83.  
  84. program TEKENEN
  85. var
  86. Tekenarray  : array[1..3500] of word;
  87. Stoppen, MuisKnopGedrukt : boolean;
  88. {er zijn uiteraard nog zo'n 30 andere minder belangrijke variabelen}
  89. begin
  90.   SchermOpbouwen;      {o.a. RegisterBGI en MouseInit}
  91.   Stoppen := false;
  92.   repeat       {begin eerste lus}
  93.        repeat       {begin tweede lus}
  94.         LeesMuis;      {leest DOS-record REGISTERS BX, CX en DX uit}
  95.        until MuisKnopGedrukt;   {eind tweede lus}
  96.      ZetKoördinaten_in_TekenArray; {subroutine die de getallen vastlegt}
  97.  until stoppen      {eind eerste lus}
  98. end.
  99.  
  100. Vanzelfsprekend moesten de programmadelen  LeesMuis en ZetKoördinaten_in_Te-
  101. kenarray ook gemaakt worden, maar de ideeën daarvoor staan in de goede computer-
  102. boeken.
  103.  
  104. AAN HET WERK:
  105. Het tekenen gaat zo: we starten het tekenprogramma en we plakken een trans-
  106. parant landkaartje (overheadsheet) op de beeldbuis van de monitor. In
  107. minder dan 20 minuten wordt dat kaartje met de muis 'overgetrokken'. Ama-
  108. teuristisch, die overheadsheets? Misschien, maar het resultaat mag er zijn.
  109. Op deze manier is het mogelijk acht gedetailleerde kaarten op te slaan in
  110. 28K! Dat is minder dan 4% van de omvang die voor acht complete pixel-georiën-
  111. teerde plaatjes (VGA) nodig zou zijn geweest! Iedere keer als tijdens het te-
  112. kenen op de muisknop wordt geklikt, zet de procedure ZetKoördinaten de X-
  113. en Y-waarde van de muis in de array. In de X- waarde wordt ook de aktie (lijn-
  114. type, kleur enz.) opgeslagen. Die TekenArray wordt later door de procedure
  115. PLOTKAART weer in een kaartje omgezet.
  116.  
  117. procedure PLOTKAART;
  118. begin
  119.    Teller := 1;
  120.   repeat
  121.        Koördinaat_1 := TekenArray[teller];   {de X-Koördinaat ophalen}
  122.        Aktie := trunc(Koördinaat_1/1000);    {Aktie afleiden uit  X-Koördinaat}
  123.        Koördinaat_1 := TekenArray[teller]-Aktie*1000;
  124.        {Nog een keer Koördinaat_1 ophalen en Aktie daaruit 'lospellen'}
  125.        Koördinaat_2 := TekenArray[teller+1]; {de Y-Koördinaat}
  126.        inc(teller,2);     {Teller ophogen met 2}
  127.      Doe(Aktie,Koördinaat_1,Koördinaat_2);
  128.      {Onderaannemer van PLOTKAART, zie beneden}
  129.  until EindeArray;
  130. {EindArray is een boolean die true wordt als de TekenArray verder}
  131. {uit ongebruikte nullen bestaat}
  132. end;
  133.  
  134. Dat 'lospellen' vraagt nog wat uitleg: komen er uit de TekenArray bijv. de ge-
  135. tallen 1600, 500 te voorschijn, dan worden die ontleed tot 1, 600, 500. Het
  136. eerste getal geeft de aktie aan. Die drie getallen worden dan aan de procedu-
  137. re Doe 'gevoerd'. Dat is in dit voorbeeld: vullen (in een bepaalde stijl) op
  138. koördinaat 600, 500. Maar als mijn scherm nou geen koördinaat 600,500 heeft?
  139. Geen nood, deze getallen zijn geen absolute waarden, maar relatieve.
  140.  
  141. OMREKENEN
  142. Deze relatieve koördinaten worden omgerekend naar absolute en dat verlost ons
  143. van de nachtmerrie die ontstaat door de lengte/breedte verhoudingen van de ver-
  144. schillende schermen. De eenvoudigste oplossing voor dit probleem bleek veruit
  145. de beste! Steeds als er X- en Y-waarden uit de array worden gehaald, worden
  146. ze door funktie X en funktie Y  omgerekend voor het scherm dat op dit moment
  147. in gebruik is. IJkpunten zijn daarbij de funkties GetMaxX en GetMaxY.
  148.  
  149. function X(BREEDTE : integer) : integer;
  150.          begin
  151.         X := round(BREEDTE/1000 * GetMaxX);
  152.    end;
  153.  
  154. function Y(HOOGTE : integer) :integer;
  155.    begin
  156.         Y := round(HOOGTE/1000 * GetMaxY);
  157.    end;
  158.  
  159. Een voorbeeld:
  160. X(500) op  VGA: 500/1000 x 640 = 320
  161. X(500) op HERC: 500/1000 x 720 = 360
  162. In beide gevallen is dat precies het midden!
  163. Veel rekenwerk? Welnee, een computer is geen mens: luiheid kent hij niet.
  164.  
  165. Tenslotte: hoe het in de procedure DOE kolkt en bruist; wat een oerkracht!
  166.  
  167. procedure DOE(Aktie,Koördinaat_1,Koördinaat_2);
  168. begin
  169.       case Aktie of
  170.       1..11 : begin
  171.                  SetFillStyle(Aktie,GetColor);
  172.                  FloodFill(X(Koördinaat_1),Y(Koördinaat_2),GetColor);
  173.              end;
  174.       12 : LineTo(X(Koördinaat_1),Y(Koördinaat_2));
  175.     {enz. enz. verder nog zo'n 20 akties mogelijk}
  176.       end;
  177. end;
  178.  
  179. DE FILES MET OPDRACHTEN
  180. Het programma werkt met acht files met opdrachten. Deze files hebben
  181. de extensie *.geo. De files bestaan uit een keten van records die een plaats-
  182. naam en wat getallen bevatten. De type-definitie van dat record (32 bytes)
  183. ziet er zo uit:
  184.  
  185. type
  186.  PLEK = record
  187.       NAAM       : string[20];
  188.       PlekX,PlekY,TekstX,TekstY : word; {Koördinaat v. plaats en naam}
  189.       Symbool,Tolerantie,niveau : byte;
  190.  end;
  191.  
  192. Het niveau wordt ook in dit record vastgelegd. Afrika is niveau 1, Timboek-
  193. toe niveau 6. De tolerantie hangt af van de aard van het aan te wijzen object.
  194. Terschelling heeft een grote horizontale tolerantie en het Kanaal door Zuid
  195. Beveland een kleine! 
  196.  
  197. TOEKOMST
  198. Dit programma kan snel voor andere toepassingen worden aangepast. Als er
  199. in plaats van kaarten andere tekeningen worden opgenomen, dan is al snel een
  200. leesprogramma voor kinderen of een of ander presentatieprogramma te maken
  201. voor een museum of bedrijf. 
  202.  
  203. BRONCODE
  204. In dit artikel zijn de hoofdlijnen van ATLAS duidelijk gemaakt. Wie zelf aan
  205. het werk wil, kan de BRONCODE (van VERSIE 2.1 ong. 250Kb incl. kaarten) 
  206. bestellen. 
  207.  
  208. Tjitte Dijkstra, Van Heemskercklaan 75  3843 XP  Harderwijk
  209.