home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
RUN Flagazine: Run 1
/
run1.zip
/
LES9GWB.ASC
< prev
next >
Wrap
Text File
|
2013-08-18
|
22KB
|
269 lines
De Basic Interpreter (9)
Grafische mogelijkheden
Tot nu toe hebben we ons in deze cursus uitsluitend bezig gehouden met
karaktergeoriënteerd programmeren. Karaktergeoriënteerd wil zeggen dat
we gebruik maakten van de 256 tekens van de ASCII-tabel waarvan we een
groot deel vanaf het toetsenbord op het scherm zichtbaar kunnen maken:
de zogenoemde printable characters. Behalve deze intoetsbare tekens
(letters, cijfers, leestekens en bijzondere tekens) kunnen we in de
karaktergeoriënteerde modus nog gebruik maken van 'kwasi grafische
tekens' als lijnstukjes, hoekjes en blokjes waarmee we in de vorige les
kaders hebben gemaakt.
Karaktergeoriënteerde Basic-programma's kunnen er heel mooi uitzien,
zeker wanneer op verantwoorde wijze van kleuren gebruik wordt gemaakt.
Maar toch heeft karaktergeoriënteerd Basic zijn beperkingen. We kunnen
bijvoorbeeld prachtige explosiekaders maken, inclusief schaduwrandjes,
maar cirkels of ovalen zijn er niet bij.
Op de keper beschouwd is karaktergeoriënteerd nogal grof. De matrix
waarin we de baas op het scherm kunnen spelen, is slechts 25x80
tekenposities in omvang: 25 regels van elk 80 ASCII-tekens.
De Screens
Karaktergeoriënteerd Basic speelt zich af in een stukje geheugen dat
door de beeldbuis zichtbaar wordt gemaakt. Basic kent deze wijze van
weergeven als Screen 0 (niet grafisch). In Screen 0 kunnen we met een
groot aantal Basic-opdrachten en functies werken maar niet alle. Geven
we in Screen 0 bijvoorbeeld een grafische opdracht als:
CIRCLE (50,50),10
dan volgt onmiddellijk de foutmelding:
Illegal function call of Ongeldige functie-aanroep.
We zullen eerst naar een grafisch Screen moeten omschakelen alvorens
we van de typisch grafische commando's gebruik kunnen maken en om dat
te kunnen doen moet uw PC over een grafische kaart beschikken.
Na Screen 0 (karaktergeoriënteerd) volgen de grafische Screens 1 tot en
met 12. Vaak wordt tegenwoordig gebruik gemaakt van de hoge resolutie
van Screen 12: VGA omdat alle PC's van recente datum grafische beelden
met een hoog oplossend vermogen van 640x480 beeldpunten of pixels
kunnen weergeven. Sommige PC's gaan zelfs nog verder en hebben grafische
kaarten en kleurenbuizen die Super VGA (SVGA) kunnen laten zien. Het op-
lossend vermogen van SVGA bedraagt: 1024x840 pixels.
Voordat (S)VGA zijn intrede deed was EGA (Screen 9) de hoogste resolutie:
640x350 pixels. Voor GWBasic is dit het hoogst bereikbare scherm.
Voor Screen 12 moet naar een andere Basic als Q-, Quick-, Power-
of TurboBasic worden gegrepen.
CGA en Hercules
Tussen Screen 0 en 10 liggen negen screens waarvan er (voor wat GWBasic
betreft) slechts zes interessant zijn: de Screens 1, 2, 3, 7, 8 en 9.
De eerste twee dateren uit de begintijd van de PC toen voor het eerst gra-
fische mogelijkheden werden geïntroduceerd in de vorm van de Color Graphics
Array (CGA). CGA zit nog steeds op elke PC maar het oplossend vermogen is
matig tot slecht: 320x200 beeldpunten in Screen 1 en 640x200 in Screen
2.
In die begintijd had lang niet iedereen een kleurenscherm. Om de
grafische beelden van het spreadsheetprogramma Lotus 123 beter weer te
geven dan in CGA intoduceerde Hercules een videokaart voor de monochrome
(groene) IBM-buis met een betere resolutie dan IBM's CGA. Zonder kleur
weliswaar is de resolutie van Hercules in Screen 3: 720x348 pixels vrij
hoog.
Het grote nadeel van Hercules is dat deze grafische modus
NIET
COMPATIBLE
is met de standaard. Programma's in Screen 0 geven meestal
geen problemen zolang er maar geen kleur is gebruikt. Cyaan bijvoorbeeld
op Hercules onderstreept weergegeven. Veel 'gewone' grafische programma's
in de Screens 1,2,9 en 12 lopen zonder aanpassingen niet in Hercules. Daar
zijn weer allerlei kunstgrepen voor nodig zoals CGA-emulatoren die het
soms mogelijk maken een niet voor Hercules aangepast grafisch Basic-
programma te laten draaien op een Hercules-scherm.
Gebruikers van Hercules-schermen kennen inmiddels de beperkingen van
deze PC-vreemde modus en kijken niet vreemd op wanneer een nieuw
programma het op hun schermen niet doet. Ook veel grafische programma's
in RUN Flagazine laten het helaas op Hercules afweten.
Andere coördinaten
In GWBasic zijn de grafische Screens 1, 2 en 9 het meest interessant;
Screen 12 (VGA) is onbereikbaar. In Screen 0 werkten we met een
gemakkelijk stelsel van coordinaten. Met LOCATE y,x adresseren we elke
van de 2000 (25*80) posities. In de grafische Screens werkt LOCATE nog
steeds maar de typische grafische commmando's als LINE en PSET moeten
anders worden geadresseerd.
In Screen 1 hebben we maken met een grafische matrix van 320x200 punten.
Op elk punt kunnen we met PSET (x,y) een punt neerzetten. PSET (0,0)
plaatst een punt in de linker bovenhoek en PSET (319,0) in de rechter
bovenhoek. Onderstaand programmaatje illustreert hoe we in een
FOR/NEXT-loop bovenin Screen 1 een dunne horizontale lijn kunnen trekken
met PSET:
┌───────────────────────────┐
│ 100 CLS:SCREEN 1 │
│ 110 FOR A=0 TO 319 │
│ 120 PSET (A,0) │
│ 130 NEXT A │
│ 140 LOCATE 5,1 │
└───────────────────────────┘
Een verticale streep aan de linker kant van het scherm krijgt u door in
regel 120 de A en de 0 te verwisselen: PSET (0,A).
Het grafische commando PSET is overigens niet de juiste methode om
lijnen horizontaal, diagonaal en verticaal te tekenen. Daarvoor
gebruiken we het grafische commando: LINE (x1,y1)-(x2,y2).
Uit het bovenstaande blijkt al min of meer hoe de horizontale lijn in
het programmaatje hierboven moet worden getrokken. In tegenstelling tot
een punt (PSET) wordt een lijn altijd getrokken tussen het ene en het
andere punt. Het punt links boven wordt aangegeven als: (0,0) en het
punt rechtsboven als:
(319,0). Tussen deze twee punten trekken we de grafische lijn aldus:
100 CLS:SCREEN 1
110 LINE (0,0)-(319,0)
120 LOCATE 5,1
tenslotte een diagonale lijn. Hoe trekken we in Screen 1 de diagonale
lijn van links boven naar rechts onder?
100 CLS:SCREEN 1
110 LINE (0,0)-(319,199)
Het commando LINE kan ook nog worden gebruikt in combinatie met STEP:
-STEP(dx,dy). Hiermee wordt de stap aangegeven waarmee de coördinaten
worden bepaald ten opzichte van de laatste grafische cursorpositie.
Een lijn die wordt getrokken kan ook nog een kleur krijgen. De optie:
,B of ,BF zorgen ervoor dat er geen lijn wordt getrokken maar een recht-
hoek (B=Blok) eventueel ingekleurd met de opgegeven kleur (BF = Block
Fill).
Schakel nu zelf over naar Screen 2 en besef dat u daarmee een hogere
resolutie heeft in een coördinatiestelsel van 640x200. Daarbinnen zet
PSET (0,639) dus een punt in de uiterste rechter bovenhoek en PSET (0,0)
nog steeds in de uiterste linker bovenhoek. Een diagnonale lijn van
links boven naar rechts onder tekent u met: LINE (0,0)-(619,199).
Cirkels en kleuren
Als we bij een lijn rekening moeten houden met de verbinding tussen twee
punten, vraagt een cirkel om andere gegevens. Hierbij zijn middelpunt en
straal bepalend.
Een kleine cirkel in het midden van Screen 2 wordt getekend met:
SCREEN 2
CIRCLE (320,100),50
waarin (320,100) het middelpunt van het scherm is en het toevoegsel ,50
de straal. Hoe simpel is het nu niet om concentrische cirkels te tekenen
in een FOR/NEXT-loop...!
┌───────────────────────────────────────┐
│ 100 CLS:SCREEN 2 │
│ 110 FOR A=10 TO 200 STEP 5 │
│ 120 CIRCLE (320,100),A │
│ 130 NEXT A │
└───────────────────────────────────────┘
Voor CIRCLE kennen we de volgende opties:
-STEP(dx,dy), vergelijkbaar dus met die van het commando LINE. Verder ge-
ven ,BeginBoog, EindeBoog de mogelijkheid om een deel van een cirkel (een
cirkelboog) te tekenen. De waarden moeten wel in radialen worden opgegeven.
,Aspect tenslotte is een verhoudingsgetal van de x- en de y-as met als re-
sultaat dat er geen cirkels maar ellipsen ontstaan.
We kunnen nu ook een moiré-patroon maken door er nog een serie concen-
trische cirkels vlak naast te zetten:
┌─────────────────────────────────────────┐
│ 140 FOR A=10 TO 200 STEP 5 │
│ 150 CIRCLE (322,100),A │
│ 160 NEXT A │
└─────────────────────────────────────────┘
Screen 2 is aantrekkelijker dan Screen 1 vanwege zijn hogere resolutie
maar het nadeel is dat daarin geen kleur kan worden gebruikt. Vandaar
dat in de begintijd van de PC zo veel 'kleurrijke' games in Screen 1 zijn
geprogrammeerd ter wille van de kleur maar ten koste van het oplossend
vermogen.
Screen 9 (EGA) was dus een geweldige verbetering: een hogere resolutie
dan Screen 2 EN de mogelijkheid om kleur te gebruiken. Rekening houdend
met de grotere matrix van Screen 9 (640x350) herschrijven we het
voorbeeldprogrammaatje van de concentrische cirkels aldus:
┌─────────────────────────────────────────────────────────────────────┐
│ 100 CLS:KEY OFF:SCREEN 9 │
│ 110 FOR A=10 TO 200 STEP 10 │
│ 120 CIRCLE (320,160),A,14:' ,14 bepaalt de tekenkleur: geel │
│ 130 NEXT A │
└─────────────────────────────────────────────────────────────────────┘
In Screen 9 kunnen we 16 kleuren gebruiken die we kennen van het
commando COLOR. Die kleuren kunnen we op tal van manieren gebruiken: om
blokken of kaders in te kleuren, schaduwrandjes te maken, enzovoorts.
Voor het 'inkleurwerk' beschikken we over een gespecialiseerd commando:
PAINT (a,b),y,z
waarin a en b het punt aangeven waar het kleuren moet beginnen, y de
grenskleur is tot waar er wordt ingekleurd en z de tekenkleur.
Een vereiste is wel dat die grens een gesloten geheel vormt. Zit er
ergens een 'lek' dan ontsnapt de in te vullen kleur buiten deze grens.
We kunnen nu gekleurde concentrische cirkels maken. Type onderstaand
programma in en bestudeer de listing. Als u dit begrijpt, programmeert u
al heel aardig grafisch en in kleur en mag ik uw inzendingen dus zeer
binnenkort tegemoet zien.
┌─────────────────────────────────┐
┌───────────────────┤ GEKLEURDE CONCENTRISCHE CIRKELS ├───────────────┐
│ └─────────────────────────────────┘ │
│ 100 CLS:KEY OFF:SCREEN 9 │
│ 110 FOR A=10 TO 200 STEP 10 │
│ 120 R=R+7 │
│ 130 KLEUR=KLEUR+1:IF KLEUR=16 THEN KLEUR=0 │
│ 140 CIRCLE (320,160),A,14 │
│ 150 PAINT (320,160-R),KLEUR,14 │
│ 160 NEXT A │
└─────────────────────────────────────────────────────────────────────┘
Zie ook PTIL
Krijgt u de smaak te pakken van de vele mogelijkheden van deze grafische
commando's? Maak dan vooral eens kennis met het zeer fraaie en veelzij-
dige programma PTIL (Grafische Behangen) op RUN7. Gewapend met de kennis
die u nu heeft opgedaan, zult u met heel andere ogen naar dit spectacu-
laire en veelzijdige grafische programma kijken. PAINT kan namelijk nog
veel meer maar daar vertelt PTIL u alles over...
Animatie met PCOPY
Heeft u nog niet voldoende nieuwe gereedschappen om een leuke inzending
op te sturen naar RUN Flagazine of te 'uploaden' naar TeleRUN? Dan
krijgt u er nog een bij waarmee uw fantasie in vuur en vlam wordt gezet:
het veelzijdige maar weinig gebruikte PCOPY waarmee u met twee schermen
tegelijk kunt werken en (in een FOR/NEXT-loop) tot animaties kunt komen.
PCOPY werkt in alle schermen, dus zowel in Screen 0 als in de grafische
schermen.
De werking van het PCOPY kan niet helderder worden uitgelegd dan in een
levend voorbeeld. Dit voorbeeld is speciaal voor deze les gemaakt door
de heer Ger Corba te Leiderdorp.
Zijn voorbeeldprogramma staat op deze RUN-diskette en u kunt het zelf
in GWBASIC bekijken en bestuderen: niet alleen de verschijningsvorm maar
ook de listing zelf.
Experimenteer met de grafische commando's en met PCOPY en probeer een
afgerond 'programma' van uw vingeroefeningen te maken dat u naar RUN
kunt insturen.
Ik ben benieuwd....
Wordt vervolgd...
In de volgende les behandelen we een van de moeilijkste onderwerpen van
Basic: Disk I/O (Input/Output). We leren wat een bestand is, wat records
zijn en hoe records worden ingedeeld in velden. Ook leren we welke ver-
schillende soorten bestanden Basic onderscheidt.
Met deze kennis en ervaring zullen we zelf een 'database' kunnen program-
meren. Het ontwerpen en schrijven van een NAW-programma (Naam Adres Woon-
plaats) staat in deze les centraal.
■═══════════════════════════════════════════════════════════════════════════■