Tajemnice ATARI

PIERWSZE KROKI


   Miesiąc temu zapoznaliśmy się "na sucho" z trybami i funkcjami graficznymi. Aby oswoić się trochę z poznanymi wiadomościami, napiszemy programik przybliżający problemy posługiwania się grafiką i animacją. Będzie to prościutka gra polegająca na strzelaniu do celu. Na początek należy określić jej zasady. W losowym punkcie ekranu pojawiać się będzie tarcza, do której po wycelowaniu oddamy strzał jednocześnie z dwóch dolnych rogów ekranu. Jako, że całość będzie nieco większa niż pisane przedtem programiki, postaramy się napisać nasze dzieło "porządnie", stosując tzw. programowanie metodą zstępującą. Polega ono na opracowaniu danego zagadnienia od najbardziej ogólnych założeń i stopniowym przechodzeniu do przekładania na język komputera coraz to prostszych części zadania. Praktycznie w każdym z języków wysokiego poziomu istnieją możliwości zrealizowania takiego sposobu rozwiązania określonego problemu. Program buduje się jakby z cegiełek rozwiązujących kolejne zadania. Każda z nich może się również składać z cegiełek rozwiązujących z kolei jeszcze prostsze problemy, aż dojdziemy do prostych i oczywistych działań, które bez trudu można przełożyć na komendy danego języka.    W dialekcie ATARI BASIC zmuszenie interpretera do wykonania podprogramu (takiej "cegiełki") niestety nie jest wcale eleganckie. Służy do tego celu komenda

GOSUB nr_wiersza (GOS.)

gdzie nr_wiersza określa początek wycinka programu zakończonego komendą

RETURN (RET.)

   W innych językach, a także w nowszych mutacjach basicu dozwolone jest wywoływanie podprogramów za pomocą ich nazwy, a nie numeru wiersza, dzięki czemu pisany program staje się przejrzystszy. W naszym przypadku pozostaje tylko komentowanie kolejnych komend GOSUB lub zastosowanie małej sztuczki. W związku z tym, że nr_wiersza nie musi być stałą, można tam używać zmiennych o nazwach odpowiednich do zadań realizowanych przez podprogram. Ich wartości ustalamy wcześniej jako numery wierszy, od których będą rozpoczynały się kolejne podprogramy. Spróbujmy zapisać bardzo ogólnie nasz program.
10 GOSUB 1000:REM gramy?
20 GOSUB 2000:REM ustaw tryb ekranu
30 GOSUB 3000:REM rysuj tarcze
40 GOSUB 4000:REM celowanie
50 GOSUB 5000:REM strzal
60 GOSUB 6000:REM wynik
70 GOTO 10
   Prawda, że ładnie wygląda? Niestety, nie działa i nie będzie, dopóki nie napiszemy wszystkich podprogramów. Jeszcze jedna uwaga. Celowo zostawiłem tak dużo wolnych wierszy między samym programem a pierwszym podprogramem. Jak również między nimi, bowiem w tej fazie pisania nie jestem w stanie dokładnie przewidzieć, ile miejsca zajmą kolejne części.

   Bierzmy się powoli do dzieła. Zaczynamy od pierwszej cegiełki. Zapytajmy się najpierw, czy ktokolwiek ma ochotę grać w nasze wypociny.

1000 REM gra czy koniec?
1010 ? "1-gra,   0-koniec      ";
1020 INPUT GRA:IF GRA THEN RETURN
1030 GRAPHICS 0:END
   Gierkę zrealizujemy w najwyższym trybie rozdzielczości, z okienkiem tekstowym umożliwiającym wypisywanie wyniku. Napiszmy więc:

2000 REM tryb wyswietlania obrazu
2010 GRAPHICS 8
2020 RETURN
   Ta część okazała się bardzo prosta do zrealizowania i można ją było właściwie napisać od razu w programie, a niejako podprogram, ale niech już tak zostanie. Dalej nie pójdzie tak łatwo. Przystępujemy do rysowania tarczy. Dla ułatwienia żyda będzie ona kwadratowa. Aby rysowała się w miarę szybko, składać się na nią będą trzy kwadraciki, najmniejszy o boku długości 6 punktów ekranowych, następne o 3 z każdej strony szersze. Aby całość rysowała się w nieokreślonym miejscu na ekranie, musimy współrzędne środka tarczy wybrać losowo. Posłuży nam do tego funkcja

RND (liczba)

która zwraca zawsze wartość rzeczywistą z zakresu od 0 do 1 (bez liczby 1). Otrzymane dzięki temu dwie przypadkowe liczby należy przekształcić we współrzędne środka tarczy, czyli na liczby z zakresu (X) 9-310 i (Y) 9-150. Dlaczego takie? Określają one bowiem odpowiednio najmniejsze i największe wartości współrzędnych środka, przy których cała tarcza o wymiarach 18 na 18 mieści się na ekranie.

3000 REM rysowanie tarczy
3010 OX=RND(0)*301+9
3020 OY=RND(0)*141+9
3030 RYSKWAD=3500
3040 BOK=6:GOSUB RYSKWAD
3050 BOK=12:GOSUB RYSKWAD
3060 BOK=18:GOSUB RYSKWAD
3070 RETURN
   Podprogram ten generuje współrzędne środka tarczy (OX i OY) i wywołuje trzy razy inny podprogramik, którego zadaniem jest narysować kwadrat o boku BOK i środku OX,OY. Zastosowałem tu opisaną wcześniej sztuczkę z wywołaniem podprogramu, dzięki czemu tekst programu jest przynajmniej częściowo samokomentujący i czytelniejszy. Część rysująca kwadrat wymaga komentarza. Użyta została w niej komenda

DRAWTO wx,wy (DR.) gdzie wx i wy są współrzędnymi punktu określonymi jak przy komendzie PLOT. DRAWTO rysuje linię łączącą ostatnio narysowany punkt z miejscem określonym przez wx i wy. Gdy nie użyto wcześniej PLOT czy DRAWTO, to linia zacznie się w lewym górnym rogu ekranu (0,0).

3500 REM rysowanie kwadratu
3510 COLOR 1:B2=BOK/2:PLOT OX-B2,OY-B2
3520 DRAWTO OX+B2,OY-B2:DRAWTO OX+B2,O
Y+B2:DRAWTO OX-B2,OY+B2:DRAWTO OX-B2,O
Y-B2
3530 RETURN 
   Pozostało nam jeszcze do zaprogramowania celowanie, strzał i wypisywanie wyniku. To pierwsze będzie polegało na ręcznym nakierowaniu (za pomocą joysticka) na wizerunek tarczy punkcików poruszających się po brzegach ekranu. Będziemy potrzebowali w jakiś sposób odczytac stan "manipulatora". Służą do tego celu dwie funkcje:

STICK (nr_joysticka}

zwracająca przeróżne wartości w zależności od kierunku w jakim został przechylony joystick, oraz

STRIG (nr_joysticka}

zwracająca 0, gdy został naciśnięty przycisk FIRE, 1 zaś, gdy go nie ruszamy. Nr_joysticka może być liczbą od 0 do 3, z tym, że 2 i 3 we wszystkich współcześnie spotykanych komputerach ATARI są traktowane jak 0 i 1. Będziemy więc, w zależności od stanu joysticka, poruszać malutkimi kreseczkami uosobiającymi celownik, dopóki nie zostanie naciśnięty strzał.

4000 REM celowanie
4010 CX=160:CY=80:NCX=CX:NCY=CY
4020 COLOR 1:GOSUB 4500:REM celownik
4030 ST=STICK(0)
4040 IF ST=14 AND CY>2 THEN NCY=CY-2
4050 IF ST=13 AND CY<157 THEN NCY=CY+2
4060 IF ST=7 AND CX<317 THEN NCX=CX+2
4070 IF ST=11 AND CX>2 THEN NCX=CX-2
4080 COLOR 0:GOSUB 4500:REM celownik
4090 CX=NCX:CY=NCY
4100 IF STRIG(0) THEN 4020
4110 RETURN 
4500 PLOT CX,160:DRAWTO CX,155:PLOT 0,
CY:DRAWTO 5,CY:RETURN 
   W napisanym właśnie podprogramie mamy do czynienia z jednym z problemów animacji komputerowej. Polega on z grubsza na przesuwaniu elementu na nowe miejsce, z wymazaniem starej pozycji. Do zrealizowania tego celu został użyty jeszcze jeden podprogramik rysujący celowniczek na pozycji CX,CY zadanym wcześniej kolorem.

Oprogramowanie strzału będzie dziecinnie proste.

5000 REM strzal
5010 COLOR 1:GOSUB 5030
5020 COLOR 0
5030 PLOT 0,159:DRAWTO CX,CY:DRAWTO 31
9,159
5040 RETURN 
   Obliczenie i wypisanie punktów również nie powinno sprawić kłopotów. Tarcza ma teoretyczną średnicę 25 punktów (tyle miałaby, gdyby była okrągła), i tyle też w zależności od celnoci maksymalnie można będzie otrzymać. Odległość od środka tarczy liczona jest z wzoru na długość odcinka.

6000 REM WYNIK
6010 W=INT(SQR((OX-CX)^2+(OY-CY)^2))
6020 W=25-W:IF W<0 THEN W=0
6030 ? CHR$(125),"Twoj wynik ";W
6040 RETURN 
Nie pozostaje mi nic innego jak życzyć wszystkim udanych eksperymentów.

Mirosław Liminowicz

Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001