42. Viac objektov, banky a menu

Rozšírenie action26; programy začínajú riadkom ;@modern (kapitola 35). Nadväzuje na kapitoly 40 a 41.

Na čo to je

Štyria hráči sú pre hru málo. Hry na Atari preto ukazujú jedného hráča na viacerých miestach: obrazovka sa rozdelí na pásy a v každom má hráč inú polohu a farbu. Prepína ich krátky program, ktorý počítač spustí uprostred kreslenia obrazu – prerušenie display listu (DLI). Action26 ho má hotové: stačí povedať, kde pásy začínajú a čo v nich má byť.

Kapitola ukazuje aj dve menšie veci: hráčov v banke 130XE a hráča ako zvýraznenie riadku v menu.

Program: traja nepriatelia z jedného hráča

Súbor examples/pm-lanes.act:

Action!
;@modern
; Three enemies made of one player: sprites in bands

BYTE ARRAY enemy=[$3C $7E $DB $FF $FF $A5 $81 $C3]

PROC Main()
  BYTE i, t

  Graphics(0)
  PMGraphics(1)
  FOR i=0 TO 2
  DO
    PMSprite(8+i, 0, i+1)             ; sprite 8+i is player 0 in band i+1
    PMBand(i+1, 4+6*i)                ; bands from text rows 4, 10 and 16
    PMCreate(8+i, enemy, 8, 1, 50+20*i, 32+8*(5+6*i))  ; on rows 5, 11, 17
  OD
  PMColor(8, 4, 8)                    ; red
  PMColor(9, 12, 10)                  ; green
  PMColor(10, 8, 12)                  ; blue
  PMBands(4)                          ; band 0 (the top) and bands 1-3

  FOR t=1 TO 100
  DO
    PMWait()
    FOR i=0 TO 2
    DO
      PMHPos(8+i, PMX(8+i)+1)         ; each one in its own band
    OD
  OD

  FOR i=0 TO 2
  DO
    Print("Enemy ")
    PrintB(i+1)
    Print(" stopped at x=")
    PrintBE(PMX(8+i))
  OD
RETURN

Preklad a spustenie

action26 pm-lanes.act --run

V emulátore idú zľava doprava traja nepriatelia – červený, zelený a modrý – každý v inom pruhu obrazovky, hoci sú všetci hráč 0. Simulátor nemá display list, takže pásy v ňom nie sú, ale program prebehne:

action26 pm-lanes.act --sim
Enemy 1 stopped at x=150
Enemy 2 stopped at x=170
Enemy 3 stopped at x=190

Ako to funguje

RutinaČo robí
PMSprite(s, n, pás)objekt s (8–15) je sprite: kreslí sa do hráča n (0–3) a ukazuje sa v páse pás
PMBand(pás, riadok)pás 1–7 začína riadkom obrazovky (v GRAPHICS 0 riadkom textu)
PMBands(počet)zapne pásy 0 až počet-1; PMBands(0) ich vypne

Na čo si dať pozor

Väčšia hra – loď, ktorá sa vyhýba nepriateľom v troch pruhoch – je lekcia examples/modern/bands.act.

Hráči v banke 130XE

Obrazový čip číta tvary hráčov z pamäte rovnako ako obrazovku. Keď je pamäť hráčov v okne $4000–$7FFF, XAntic (kapitola 38) určí, či ju číta z bežnej pamäte alebo z banky:

Action!
BYTE ARRAY pm(1024)=$4000      ; pamäť hráčov v okne

PMMemory(pm)
XBank(1)  PMGraphics(2)  PMCreate(0, down, 8, 2, 60, 50)   ; obrázok v banke 1
XBank(0)  PMGraphics(2)  PMCreate(0, up, 8, 2, 60, 50)     ; obrázok v bežnej pamäti
…
XAntic(1)   ; ukáž banku 1
XAntic(0)   ; ukáž bežnú pamäť

Dva obrázky na tej istej adrese a prepínanie XAntic dajú animáciu, pri ktorej sa nekreslí ani bajt. Procesor a obrazový čip však nemôžu vidieť naraz dve rôzne banky – striedať sa dá bežná pamäť a jedna banka. Celý program je lekcia examples/modern/pmbank.act (potrebuje 130XE).

Hráč ako zvýraznenie v menu

Hráč so šírkou 4 má 32 bodov – to je šírka ôsmich znakov textu. Dvaja vedľa seba dajú pruh cez 16 znakov, ktorý sa dá posúvať po riadkoch menu bez prekresľovania textu:

Action!
SetBlock(bar, 8, $FF)                    ; tvar: 8 plných riadkov = jeden riadok textu
PMCreate(0, bar, 8, 4, 60, 32+8*riadok)  ; stĺpec 3: x = 48 + 4*3
PMCreate(1, bar, 8, 4, 92, 32+8*riadok)
PMColor(0, 9, 4)  PMColor(1, 9, 4)       ; tmavá farba
…
PMVPos(0, 32+8*riadok)  PMVPos(1, 32+8*riadok)

Hráč je pred textom, ale písmená v ňom ostanú čitateľné: podľa opisu obvodu GTIA im v textovom režime nechá jas textu a dá im odtieň hráča. Preto má byť pruh tmavý. Celé menu s joystickom je lekcia examples/modern/cursor.act.

Koľko to stojí

Rutiny hráčov zaberajú v programe od asi 500 bajtov (len hráči, bez striel) po asi 2 kilobajty (všetko vrátane spritov a pásov). Prekladač pribalí len to, čo program naozaj volá – napríklad kód pre strely len vtedy, keď program použije objekt 4–7, a kód pre pásy len s PMSprite, PMBand alebo PMBands. Program bez hráčov nemá z toho nič.

Vyskúšaj si

  1. Pridaj štvrtý pás a štvrtého nepriateľa (PMSprite(11, 0, 4), PMBand(4, 21)).
  2. Daj do pásu 2 aj hráča 1 ako sprite (PMSprite(12, 1, 2)) – dvaja nepriatelia v jednom páse.
  3. Prelož pm-ship.act a pm-lanes.act s --memory-map a porovnaj, koľko bajtov má program. Koľko pridali sprity a pásy?

Zhrnutie

Podrobnejšie: lekcie 47 až 49 v examples/modern/, opis v docs/runtime.md.

Späť: 41. Zrážky · Ďalej: Príloha A – Jazyk na jednej strane