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:
;@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
RETURNPreklad a spustenie
action26 pm-lanes.act --runV 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 --simEnemy 1 stopped at x=150
Enemy 2 stopped at x=170
Enemy 3 stopped at x=190Ako 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 |
- Pás 0 je vrch obrazovky. Pásy 1–7 začínajú riadkom z
PMBand; riadky musia s číslom pásu rásť. - Sprite je objekt ako každý iný:
PMCreate,PMMove,PMShape,PMClearkreslia jeho tvar do pásu hráča (len jeho riadky),PMHPosaPMColorzmenia jeho polohu a farbu – ale len v jeho páse. Na to, kde sa ktorý riadok zobrazí, nemá vplyv nič iné: tvar spritu musí ležať v riadkoch jeho pásu. - Hráč bez spritu v páse si tam drží vlastnú polohu a farbu.
- Zrážky hlási hardvér pre celého hráča –
PMHitPM(8)je zrážka hráča 0 v ktoromkoľvek páse. Ktorý sprite to bol, poviePMOverlap. Šírka (PMWidth) tiež patrí celému hráčovi.
Na čo si dať pozor
- Pásy majú byť od seba aspoň dva riadky textu a prvý riadok pásu nech je v tvare prázdny – nová poloha sa zapisuje práve počas neho.
Graphics(n)postaví nový display list: po ňom treba zavolaťPMBandsznova.- Program, ktorý má vlastné prerušenie display listu (kapitola 37,
ASM), pásy nepoužije. - Koniec programu,
PMBands(0)ajPMGraphicspásy vypnú a vrátia všetko, ako bolo.
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:
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:
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
- Pridaj štvrtý pás a štvrtého nepriateľa (
PMSprite(11, 0, 4),PMBand(4, 21)). - Daj do pásu 2 aj hráča 1 ako sprite (
PMSprite(12, 1, 2)) – dvaja nepriatelia v jednom páse. - Prelož
pm-ship.actapm-lanes.acts--memory-mapa porovnaj, koľko bajtov má program. Koľko pridali sprity a pásy?
Zhrnutie
PMSprite,PMBand,PMBandsukážu jedného hráča vo viacerých pásoch obrazovky s inou polohou a farbou.- Sprite (objekt 8–15) má vlastný tvar a polohu; zrážky a šírka patria celému hráčovi.
PMMemorys poľom v okne aXAnticukážu hráčov z banky 130XE.- Hráč so šírkou 4 je dobré zvýraznenie riadku menu.
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