27. Grafika: Graphics, SetColor, Plot, DrawTo, Fill, Position, Locate

Na čo to je

Atari vie okrem textu kresliť body a čiary vo farbe. Táto kapitola ukáže textovú obrazovku s farbami a kurzorom na ľubovoľnom mieste a potom obrázok z čiar.

Od tejto kapitoly potrebuješ emulátor. Simulátor (--sim) obrazovku nekreslí. Programy sa spúšťajú voľbou --run a na konci čakajú na kláves.

Ako sa to píše

RutinaČo robí
Graphics(režim)prepne obrazovku do grafického režimu a vymaže ju
SetColor(register, odtieň, jas)nastaví farbu jedného z piatich farebných registrov
color=číslopremenná knižnice: ktorou farbou sa bude kresliť
Plot(stĺpec, riadok)nakreslí bod
DrawTo(stĺpec, riadok)nakreslí čiaru z posledného bodu do zadaného
Fill(stĺpec, riadok)vyplní plochu (vysvetlenie nižšie)
Position(stĺpec, riadok)nastaví kurzor – kde bude ďalší výpis textu
Locate(stĺpec, riadok)funkcia – vráti farbu bodu (v textovom režime kód znaku)

Súradnice: bod (0, 0) je vľavo hore. Stĺpec rastie doprava, riadok nadol. Vždy sa píše najprv stĺpec, potom riadok.

Grafické režimy

Najpoužívanejšie (všetky sú v prílohe D):

RežimDruhRozmerFarby
0text40 × 24 znakov1 farba písma, 1 pozadia
1veľký text20 × 20 znakov + 4 riadky textu5
2ešte väčší text20 × 10 znakov + 4 riadky textu5
3body40 × 20 + 4 riadky textu4
5body80 × 40 + 4 riadky textu4
7body160 × 80 + 4 riadky textu4
8body320 × 160 + 4 riadky textu1 farba, 2 jasy

Režimy 1 až 8 nechávajú dole textové okno so štyrmi riadkami, do ktorého píše Print. Keď k číslu režimu pripočítaš 16 (Graphics(7+16)), okno zmizne a grafika zaberie celú obrazovku.

Farby

Farba je odtieň (0 až 15) a jas (párne číslo 0 až 14).

OdtieňFarbaOdtieňFarba
0sivá8nebeská modrá
1zlatá9svetlomodrá
2oranžová10tyrkysová
3červenooranžová11zelenomodrá
4ružová12zelená
5fialová13žltozelená
6fialovomodrá14oranžovozelená
7modrá15svetlooranžová

Presný odtieň závisí od televíznej normy (v Európe PAL, v USA NTSC).

V režime 7 platí:

color=Kreslí farbou z registraNastaví sa cez
0pozadie (maže)SetColor(4, …)
1register 0SetColor(0, …)
2register 1SetColor(1, …)
3register 2SetColor(2, …)

Všimni si posun: color=1 kreslí farbou registra 0.

Program 1: textová obrazovka

Súbor examples/textscreen.act:

Action!
; The text screen: colours and the place of the cursor

PROC Main()
  BYTE i

  Graphics(0)                ; clear the screen
  SetColor(2, 9, 4)          ; the background is blue
  SetColor(1, 0, 14)         ; the letters are bright
  SetColor(4, 9, 4)          ; the border is the same blue

  Position(12, 2)
  Print("THE TEXT SCREEN")

  FOR i=0 TO 9
  DO
    Position(5+i*3, 5+i)     ; column, row
    PrintB(i)
  OD

  Position(2, 19)
  Print("Press any key")
  GetD(7)
RETURN
action26 textscreen.act --run

Uvidíš modrú obrazovku s nadpisom hore a číslicami 0 až 9 usporiadanými šikmo nadol. Position postaví kurzor a nasledujúci Print píše od toho miesta.

V režime 0 má register 2 farbu pozadia, register 1 jas písma (odtieň písma je vždy rovnaký ako pozadie) a register 4 okraj.

Program 2: kreslenie

Súbor examples/graphics.act:

Action!
; Graphics: a house in graphics mode 7 (160 x 80 points, 4 colours)

PROC Main()
  BYTE i, found

  Graphics(7)                ; 160 x 80 points and 4 lines of text below
  SetColor(0, 2, 8)          ; colour 1 is orange
  SetColor(1, 12, 10)        ; colour 2 is green
  SetColor(2, 9, 6)          ; colour 3 is blue
  SetColor(4, 0, 0)          ; the background is black

  color=1                    ; a frame around the picture
  Plot(0, 0)
  DrawTo(159, 0)
  DrawTo(159, 79)
  DrawTo(0, 79)
  DrawTo(0, 0)

  color=2                    ; the walls
  Plot(50, 60)
  DrawTo(50, 35)
  DrawTo(110, 35)
  DrawTo(110, 60)
  DrawTo(50, 60)

  color=3                    ; the roof
  Plot(45, 35)
  DrawTo(80, 15)
  DrawTo(115, 35)

  color=1                    ; a filled door
  Plot(86, 59)
  DrawTo(86, 45)
  DrawTo(74, 45)
  Fill(74, 59)

  color=3                    ; a dotted path
  FOR i=0 TO 9
  DO
    Plot(80+i*4, 70)
  OD

  found=Locate(50, 40)       ; which colour has the point 50,40?

  PrintE("A house in graphics mode 7")
  Print("The point 50,40 has colour ")
  PrintBE(found)
  Print("Press any key")
  GetD(7)
  Graphics(0)
RETURN

Preklad a spustenie

action26 graphics.act --run

Čo uvidíš

Čiernu obrazovku s oranžovým rámom. V strede domček: zelené steny, modrá strecha, oranžové vyplnené dvere a pod ním bodkovaná modrá cestička. V textovom okne dole:

A house in graphics mode 7
The point 50,40 has colour 2
Press any key

Ako to funguje

Ako funguje Fill

Fill vypĺňa plochu zľava doprava, kým nenarazí na nakreslený bod. Treba mu preto pripraviť pravý okraj a povedať, kadiaľ ide ľavý:

  1. Plot(86, 59) a DrawTo(86, 45) – pravá strana dverí, zdola nahor.
  2. DrawTo(74, 45) – horná strana, doľava. Kurzor ostal v ľavom hornom rohu.
  3. Fill(74, 59) – ťahá čiaru z ľavého horného rohu do ľavého dolného a z každého jej bodu vypĺňa doprava, až po pravú stranu.

Časté chyby

Čo sa staloČo sa stane
bod mimo obrazovky (Plot(200, 10) v režime 7)chyba 141 – program skončí hlásením Err: 141
zabudnuté color=kreslí sa farbou, ktorá ostala naposledy; ak je to 0 – pozadie –, nie je nič vidieť
zámena riadka a stĺpcaobrázok je preklopený alebo mimo obrazovky
SetColor(1, …) v nádeji, že zmení color=1color=1 je register 0
nepárny jaszaokrúhli sa nadol; jas 9 je to isté ako 8
program vlastní premennú colorzakryje premennú knižnice a kreslenie prestane meniť farbu

Posledný riadok je všeobecná pasca: meno premennej nesmie byť rovnaké ako meno rutiny alebo premennej knižnice, a veľké a malé písmená sa nerozlišujú. Premenná stick zakryje funkciu Stick, premenná position procedúru Position.

Vyskúšaj si

  1. Pridaj domčeku okno – malý štvorec vedľa dverí.
  2. Nakresli v slučke FOR desať zvislých čiar vedľa seba, každú o 10 bodov ďalej.
  3. Zmeň režim na Graphics(7+16). Čo sa stane s textovým oknom a s výpismi?

Zhrnutie

Späť: 26. Formátovaný výpis a prevody · Ďalej: 28. Zvuk