29. Joystick a náhoda: Stick, STrig, Paddle, PTrig, Rand
Na čo to je
Hra potrebuje vedieť, čo robí hráč, a potrebuje náhodu. Táto kapitola ukazuje čítanie joysticku a náhodné čísla.
Oba programy sú pre emulátor. V emulátore atari800 sa joystick zvyčajne ovláda šípkami alebo číselnou klávesnicou a tlačidlo pravým klávesom Ctrl – presné nastavenie nájdeš v jeho ponuke (kláves F1).
Ako sa to píše
| Funkcia | Čo vráti |
|---|---|
Stick(port) | smer joysticku v porte 0 až 3 |
STrig(port) | tlačidlo joysticku: 0 = stlačené, 1 = pustené |
Paddle(port) | poloha otočného ovládača (paddle) 0 až 7: číslo 1 až 228 |
PTrig(port) | tlačidlo paddla: 0 = stlačené |
Rand(rozsah) | náhodné číslo od 0 po rozsah − 1; Rand(0) dá 0 až 255 |
Prvý joystick je v porte 0.
Hodnoty Stick
14
10 6
11 15 7
9 5
13Stred je 15, hore 14, dole 13, vľavo 11, vpravo 7; šikmé smery sú medzi nimi.
Čísla nie sú náhodné. Každý smer je jeden bit, ktorý sa pri vychýlení vynuluje:
| Bit | Hodnota | Smer |
|---|---|---|
| 0 | 1 | hore |
| 1 | 2 | dole |
| 2 | 4 | vľavo |
| 3 | 8 | vpravo |
15 je 1111 – nič nie je vychýlené. 14 je 1110 – bit „hore“ je nula. Preto sa smer najpohodlnejšie skúša bitovým & z kapitoly 22: (joy&1)=0 znamená „hore“. Šikmý smer tak vyjde sám – platia dve podmienky naraz.
Program 1: hviezdička na obrazovke
Súbor examples/joystick.act:
; Joystick: move a star around the screen, the button ends the program
BYTE clock=20 ; grows by 1 fifty times a second
BYTE cursorOff=752 ; 1 hides the cursor
PROC Wait(BYTE ticks)
clock=0
WHILE clock<ticks
DO
OD
RETURN
PROC Main()
BYTE x, y, joy
Graphics(0)
cursorOff=1
Position(2, 0)
Print("Joystick moves, the button ends")
x=20
y=10
DO
Position(x, y)
Put('*)
Wait(3)
IF STrig(0)=0 THEN ; 0 means the button is pressed
EXIT
FI
joy=Stick(0)
IF joy#15 THEN ; 15 means the stick is in the middle
Position(x, y)
Put(' ) ; rub out the old star
IF (joy&1)=0 AND y>2 THEN y==-1 FI ; up
IF (joy&2)=0 AND y<22 THEN y==+1 FI ; down
IF (joy&4)=0 AND x>2 THEN x==-1 FI ; left
IF (joy&8)=0 AND x<37 THEN x==+1 FI ; right
FI
OD
Position(2, 23)
Print("Bye!")
RETURNaction26 joystick.act --runNa obrazovke je hviezdička, ktorá sa hýbe podľa joysticku. Tlačidlo program ukončí.
Ako to funguje
Toto je hlavná slučka hry v najjednoduchšej podobe. Každý prechod:
- nakreslí hviezdičku na aktuálne miesto,
- chvíľu počká (
Wait(3)– bez toho by hviezdička lietala rýchlejšie, než sa dá ovládať), - pozrie na tlačidlo a prípadne skončí,
- prečíta joystick; ak je vychýlený, zmaže starú hviezdičku medzerou a zmení súradnice.
Podmienky y>2, y<22, x>2, x<37 držia hviezdičku na obrazovke.
Premenná sa volá joy, nie stick. Meno stick by zakrylo funkciu Stick (veľké a malé písmená sa nerozlišujú) a prekladač by Stick(0) odmietol s error ACT021: illegal array.
Program 2: kocka
Súbor examples/dice.act:
; Rand: throwing a die
PROC Main()
BYTE i, throw
BYTE ARRAY counts(7)
Zero(counts, 7)
Print("Ten throws: ")
FOR i=1 TO 10
DO
throw=Rand(6)+1 ; Rand(6) gives 0 to 5
PrintB(throw) Put(' )
counts(throw)==+1
OD
PutE()
FOR i=1 TO 6
DO
PrintB(i)
Print(" came ")
PrintB(counts(i))
PrintE(" times")
OD
PutE()
Print("Press any key")
GetD(7)
RETURNaction26 dice.act --runVýpis je pri každom spustení iný, napríklad:
Ten throws: 3 1 5 2 2 4 3 6 2 1
1 came 2 times
2 came 3 times
3 came 2 times
4 came 1 times
5 came 1 times
6 came 1 times
Press any keyAko to funguje
Rand(6)dá číslo 0 až 5. Kocka má 1 až 6, preto+1.countsje pole počítadiel:counts(throw)==+1zväčší počítadlo pre hodené číslo. Pole má 7 prvkov, aby sa dali použiť indexy 1 až 6 priamo; prvok 0 ostane nevyužitý.Zero(counts, 7)pole pred použitím vynuluje (kapitola 31).
V simulátore náhoda nefunguje. Rand číta zvukový čip, ktorý simulátor nemá, a vracia stále to isté číslo. Programy s Rand skúšaj v emulátore.
Paddle
Paddle je otočný ovládač – koliesko. Paddle(0) vráti číslo podľa natočenia, približne 1 až 228. Typické použitie je pálka v hre Breakout: x=Paddle(0)/2 prevedie natočenie na stĺpec v režime 7. Paddle sa pripájali po dvoch do jedného portu, preto je ich až osem (0 až 7).
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
IF STrig(0)=1 v zmysle „stlačené“ | je to naopak: stlačené je 0 |
premenná s menom stick alebo strig | zakryje funkciu knižnice; error ACT021: illegal array |
Rand(6) v zmysle 1 až 6 | dáva 0 až 5 |
| slučka hry bez čakania | pohyb je príliš rýchly a trhaný |
súradnica typu BYTE klesne pod 0 | pretočí sa na 255 a kurzor je mimo obrazovky (chyba 141) – preto kontroly okrajov |
Vyskúšaj si
- Zmeň hviezdičku na iný znak a zrýchli pohyb.
- Nechaj za hviezdičkou stopu – nezmazávaj starú polohu.
- Polož na náhodné miesto obrazovky znak
O(Rand(36)+2,Rand(20)+2) a ukonči program, keď naň hviezdička príde.
Zhrnutie
Stick(0)vráti smer: 15 je stred, bity 1, 2, 4, 8 znamenajú hore, dole, vľavo, vpravo a pri vychýlení sú nulové.STrig(0)je 0, keď je tlačidlo stlačené.Rand(n)dá 0 ažn−1.- Hra je slučka: nakresli, počkaj, prečítaj ovládač, pohni.
- Premenné nepomenúvaj rovnako ako rutiny knižnice.
Späť: 28. Zvuk · Ďalej: 30. Súbory