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
|