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
        13

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

BitHodnotaSmer
01hore
12dole
24vľavo
38vpravo

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:

Action!
; 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!")
RETURN
action26 joystick.act --run

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

  1. nakreslí hviezdičku na aktuálne miesto,
  2. chvíľu počká (Wait(3) – bez toho by hviezdička lietala rýchlejšie, než sa dá ovládať),
  3. pozrie na tlačidlo a prípadne skončí,
  4. 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:

Action!
; 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)
RETURN
action26 dice.act --run

Vý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 key

Ako to funguje

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 strigzakryje funkciu knižnice; error ACT021: illegal array
Rand(6) v zmysle 1 až 6dáva 0 až 5
slučka hry bez čakaniapohyb je príliš rýchly a trhaný
súradnica typu BYTE klesne pod 0pretočí sa na 255 a kurzor je mimo obrazovky (chyba 141) – preto kontroly okrajov

Vyskúšaj si

  1. Zmeň hviezdičku na iný znak a zrýchli pohyb.
  2. Nechaj za hviezdičkou stopu – nezmazávaj starú polohu.
  3. 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

Späť: 28. Zvuk · Ďalej: 30. Súbory