49. Hráči a strely: --modern a PMGRAPHICS
Na čo to je
Okrem obrazu má Atari ešte štyroch hráčov (anglicky players) a štyri strely (missiles). Sú to úzke zvislé pásy, ktoré čip GTIA kreslí cez obraz: každý má vlastnú farbu, vodorovnú polohu a šírku, a čip sám zistí, do čoho narazil. Na loď, ktorá letí cez hviezdy, je to ako stvorené – loď sa hýbe, a obraz pod ňou sa nemusí prekresľovať.
V Atari BASICu aj v Turbo-BASICu XL sa s nimi dá pracovať len cez POKE: nájsť zarovnaný blok pamäte, zapísať jeho adresu do PMBASE, zapnúť ich v SDMCTL a GRACTL, kresliť tvar bajt po bajte. Basic26 má na to vlastné slová. Sú to rozšírenia prekladača – pôvodný interpreter ich nepozná.
Ako sa to zapne
Voľbou --modern, najlepšie v hlavičke programu (kapitola 40):
REM @COMPILE --modern
Bez nej sú slová PMGRAPHICS, PMX, HITCLR obyčajné mená premenných, tak ako v dobových programoch. A program, ktorý ich nepoužije, z nich v súbore .xex nemá ani bajt. Rovnaké slová má prekladač jazyka Action! Action26.
Slová
Objekt n je 0 až 3 pre hráča a 4 až 7 pre strely 0 až 3.
| Slovo | Čo robí |
|---|---|
PMGRAPHICS m | 0 vypne, 1 zapne s jemnými pásmi (riadok obrazu na bajt), 2 s hrubými (dva riadky na bajt) |
PMCREATE n,TVAR$,šírka,x,y | nakreslí objekt: riadky tvaru sú bajty reťazca, šírka 1, 2 alebo 4 |
PMSHAPE n,TVAR$ | iný tvar na tom istom mieste (animácia) |
PMCLEAR n | zmaže objekt |
PMMOVE n,x,y | presunie objekt |
PMHPOS n,x, PMVPOS n,y | len vodorovne, len zvislo |
PMX(n), PMY(n) | kde objekt je |
PMWIDTH n,w | šírka 1, 2 alebo 4 |
PMCOLOR n,odtieň,jas | farba ako pri SETCOLOR; strela má farbu svojho hráča |
PMPRIORITY p | 1 hráči nad obrazom, 4 obraz nad hráčmi |
PMHIT(n,c) | 1, keď objekt n narazil do hráča c (0–3) alebo do farby obrazu c-4 (4–7) |
PMHITPF(n), PMHITPM(n) | to isté ako bity: farby obrazu, hráči |
HITCLR | zabudne všetky nárazy |
PMWAIT | počká na ďalšiu snímku |
PMOVERLAP(a,b) | 1, keď sa objekty prekrývajú – počíta sa z polohy a veľkosti, platí hneď |
PMADR(n) | adresa pásu objektu v pamäti |
Súradnice sú tie, ktoré používa čip: x od 48 po 207 je na obrazovke zľava doprava, y je riadok v páse – pri PMGRAPHICS 2 od 0 po 127, viditeľné asi 16 až 111.
Celý program
Kameň padá zhora na loď. Na konci program povie, do čoho narazil.
Súbor examples/players.tbas:
REM @COMPILE --no-line-numbers --modern
REM A ship, a rock and what they hit
DIM SHIP$(8),ROCK$(6)
RESTORE #SHAPES
FOR I=1 TO 8:READ B:SHIP$(I)=CHR$(B):NEXT I
FOR I=1 TO 6:READ B:ROCK$(I)=CHR$(B):NEXT I
GRAPHICS 0
POSITION 2,2:? "XXXXXXXXXXXXXXXXXXXXXXXX"
PMGRAPHICS 2
PMCREATE 0,SHIP$,1,120,90
PMCREATE 1,ROCK$,2,116,24
PMCOLOR 0,1,10:PMCOLOR 1,3,6
FOR Y=24 TO 86
PMWAIT
PMMOVE 1,116,Y
NEXT Y
PMWAIT:HITCLR:PMWAIT:PMWAIT
POSITION 2,10:? "Rock hits the text: ";PMHIT(1,6)
? "Rock hits the ship: ";PMHIT(1,0)
? "Ship is at ";PMX(0);",";PMY(0)
END
# SHAPES
DATA 24,60,126,255,219,255,36,66
DATA 60,126,255,255,126,60Preklad a spustenie
Hráčov treba vidieť, takže v emulátore:
Basic26 players.tbas --runČo uvidíš
Žltú loď dole, kameň, ktorý k nej pomaly padne cez riadok písmen, a pod písmenami:
Rock hits the text: 0
Rock hits the ship: 1
Ship is at 120,90Ako to funguje
- Tvar je reťazec. Každý bajt je jeden riadok: bit 7 vľavo, bit 0 vpravo. Loď
24,60,126,255,…je v dvojkovej sústave00011000,00111100,01111110… – špička hore a krídla dole. Reťazec musí ostať, kým sa objekt používa: prekladač si pamätá, kde leží, a priPMMOVEho číta znova. - Pamäť pridelí prekladač. Hráči potrebujú blok, ktorý začína na násobku 1 KB (pri
PMGRAPHICS 12 KB). Prekladač ho dá hneď za program aFRE(0)je o toľko menšie;--memoryho ukáže akoPM graphics(kapitola 42). - Pohyb prekreslí len to, čo sa zmenilo.
PMMOVEvodorovne zapíše jeden register, zvislo prepíše riadky tvaru – nie celý pás. - Nárazy hlási čip, a až po snímke. GTIA si náraz poznačí, keď objekty kreslí, a drží ho, kým program nezavolá
HITCLR. PretoPMWAIT, potom čítanie, potomHITCLR. Prečítať náraz hneď poPMMOVEnemá zmysel – nová poloha ešte nebola nakreslená. - Písmo je farba 2. V
GRAPHICS 0čip hlási písmená ako farbu obrazu 2, pretoPMHIT(1,6)(6 = 4 + 2). Kameň na začiatku cez písmená preletel, aleHITCLRpo slučke to zabudol. GRAPHICShráčov nevypne, hoci operačný systém pri otvorení obrazovky vypne ich kreslenie – prekladač ho zapne znova. Návrat do DOS-u ich vypne.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
program bez --modern | PMGRAPHICS 2 je pre prekladač priradenie premennej: error B26017: expected '=' … |
hodnota nad 255 (PMHPOS 0,300) | chyba za behu 3 |
náraz čítaný bez PMWAIT | PMHIT ukáže nárazy z minulej polohy alebo nič |
tvar z textu v úvodzovkách s --pack-text | tvar sa rozbalí na chvíľu do voľnej pamäte a potom ho niečo prepíše – použi premennú s DIM |
| strela a strela | čip ich zrážku nehlási; pomôže PMOVERLAP |
Vyskúšaj si
- Zmeň
PMCOLOR 0,1,10na iné farby. Ktorý odtieň je červený? - Daj lodi
PMWIDTH 0,4. Narazí kameň do lode aj vtedy, keď ho posunieš o kúsok vedľa? - Pridaj strelu:
PMCREATE 4,SHOT$,1,123,80s tvaromCHR$(3)štyrikrát a nechaj ju letieť hore cezPMVPOS.
Väčšia hra so strieľaním je medzi príkladmi pri prekladači: examples/turbobasic/pmg/.
Zhrnutie
--modernzapne slová, ktoré pôvodný interpreter nemá:INCLUDEa hráčov a strely.PMGRAPHICS 2zapne hráčov a strely, pamäť pridelí prekladač.PMCREATE,PMMOVE,PMCOLORa ďalšie ich kreslia a posúvajú;PMHITpoPMWAITpovie, do čoho narazili.
Späť: 48. Nečitateľný súbor · Ďalej: 50. Rýchle celé čísla