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):

Turbo Basic XL
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 m0 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,ynakreslí objekt: riadky tvaru sú bajty reťazca, šírka 1, 2 alebo 4
PMSHAPE n,TVAR$iný tvar na tom istom mieste (animácia)
PMCLEAR nzmaže objekt
PMMOVE n,x,ypresunie objekt
PMHPOS n,x, PMVPOS n,ylen vodorovne, len zvislo
PMX(n), PMY(n)kde objekt je
PMWIDTH n,wšírka 1, 2 alebo 4
PMCOLOR n,odtieň,jasfarba ako pri SETCOLOR; strela má farbu svojho hráča
PMPRIORITY p1 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
HITCLRzabudne všetky nárazy
PMWAITpoč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:

Turbo Basic XL
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,60

Preklad 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,90

Ako to funguje

Časté chyby

Čo sa staloČo sa stane
program bez --modernPMGRAPHICS 2 je pre prekladač priradenie premennej: error B26017: expected '=' …
hodnota nad 255 (PMHPOS 0,300)chyba za behu 3
náraz čítaný bez PMWAITPMHIT ukáže nárazy z minulej polohy alebo nič
tvar z textu v úvodzovkách s --pack-texttvar 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

  1. Zmeň PMCOLOR 0,1,10 na iné farby. Ktorý odtieň je červený?
  2. Daj lodi PMWIDTH 0,4. Narazí kameň do lode aj vtedy, keď ho posunieš o kúsok vedľa?
  3. Pridaj strelu: PMCREATE 4,SHOT$,1,123,80 s tvarom CHR$(3) štyrikrát a nechaj ju letieť hore cez PMVPOS.

Väčšia hra so strieľaním je medzi príkladmi pri prekladači: examples/turbobasic/pmg/.

Zhrnutie

Späť: 48. Nečitateľný súbor · Ďalej: 50. Rýchle celé čísla