home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 09 / ami926.txt < prev    next >
Text File  |  1997-04-07  |  8KB  |  174 lines

  1. EKSPERYMENTY Z LOSEM, CZYLI RYBY
  2.  
  3. <lead>Jest taki rodzaj programów komputerowych, które czësto
  4. wykorzystujâ funkcje losowe. Jaki? Oczywiôcie blanker -- program
  5. do oszczëdzania monitora. Po pewnym ustalonym czasie zamiast
  6. nieruchomego obrazu (mogâcego uszkodziê kineskop) pojawia sië
  7. programik, zapalajâcy gwiazdki, malujâcy fraktale itd. Poprzedni
  8. artykuî na ten temat dotyczyî zmieniania losowo efektów
  9. akustycznych -- mowy. Teraz przedstawië próbë takiego dziaîania
  10. na animowanym obrazie.
  11.  
  12. <a>Stanisîaw Wësîawski
  13.  
  14. <txt>Na wstëpie muszë zaznaczyê, ûe nie jest to przykîad
  15. wyrafinowanego programowania. Wybraîem znowu Director z dwóch
  16. wzglëdów, po pierwsze juû kilkakrotnie byîa o tym mowa, po drugie
  17. Director operuje prostâ odmianâ BASIC-a, îatwâ do przeniesienia
  18. np. do AMOS-a. Samym AMOS-em moûna oczywiôcie podany przykîad
  19. wykonaê o wiele efektowniej, uûywajâc np. bobów. Jednak opis
  20. takich procedur byîby, o ile sië orientujë, o wiele bardziej
  21. obszerny. Sâ zresztâ w Redakcji lepsi fachowcy w tej dziedzinie.
  22.  
  23. Zaîoûenie byîo takie:
  24.  
  25. Po ekranie pîywajâ ryby. Jedna duûa i jedna maîa. Ryby pîywajâ
  26. raz w lewo, raz w prawo, ale nigdy nie wiadomo, kiedy znajdâ sië
  27. naprzeciwko siebie. Jeûeli taka sytuacja nastâpi, duûa ryba zje
  28. maîâ. Mogâ tam jeszcze byê inne ryby, ale gra toczy sië miëdzy
  29. wymienionymi dwiema.
  30.  
  31. Na poczâtek wykonaîem planszë z rybami w postaci rysunku IFF,
  32. podzielonego za pomocâ opcji GRID na pola 160 x 80 pikseli.
  33. Rysunek przedstawia takâ planszë, zrobionâ niejako "na zapas".
  34. Jest tam wiëcej rysunków niû wykorzystaîem w projekcie.
  35.  
  36. W pierwszym rzëdzie duûa ryba pîynie w lewo. Trzy kolejne
  37. rysunki na prawo to fazy machania ogonem. Poniewaû jednak
  38. powiëkszaîo to bardzo skrypt programu, postanowiîem zrezygnowaê z
  39. tej moûliwoôci. Drugi rzâd to ryba pîynâca w prawo. Trzeci i czwarty
  40. rzâd -- fazy otwierania pyska w lewo i prawo. Piâty i szósty to
  41. maîa ryba i îawice jako dodatek do programu.
  42.  
  43. Komendy SETBLACK I FADE sâ typowe dla Directora i na dobrâ sprawë
  44. moûna by je opuôciê. Innymi typowymi komendami jest zestaw
  45. LOAD.., przeznaczony do îadowania gîównego ekranu i ekranów
  46. dodatkowych. Wybraîem najprostszâ moûliwâ sytuacjë i komenda
  47.  
  48. <l>LOAD "df1:ryba.1a"
  49.  
  50. <txt>îaduje rysunek "czystego" ekranu jako ekran gîówny. Druga
  51. komenda
  52.  
  53. <l>LOAD 1,"df1:ryba.1"
  54.  
  55. <txt>îaduje do bufora (numer 1) wîaôciwy ekran z rybami "do
  56. wycinania". Teraz wystarczy coô wyciâê z ekranu nr 1 komendâ BLIT
  57. i bez wspomnianych kiedyô komend DISPLAY i BLITDEST wycinek
  58. znajdzie sië na gîównym ekranie. Jest to doôê prymitywne (brak
  59. podwójnego buforowania itd.), ale bardzo skuteczne, a co
  60. najwaûniejsze, doôê krótkie. Duûâ rybë wycinam (i wklejam
  61. jednoczeônie) komendâ:
  62.  
  63. <l>BLIT 1,1,1+Pionowa,x,y,158,78
  64.  
  65. <txt>BLIT 1 to materiaî do wycinania. Kolejne dwie cyfry to X
  66. równe 1 i Y równe "1+pionowa". Zmienna PIONOWA moûe byê równa 80,
  67. czyli tyle, ile wysokoôci ma kaûde okienko obrazka ryby. To
  68. znaczy, ûe wycinam z miejsca o parametrach 1, 81, a jeûeli
  69. zmienna jest równa zero, to z miejsca o parametrach 1,1. Oznacza
  70. to, ûe raz wycinam drugâ rybë (pîynie w prawo), a raz pierwszâ
  71. (pîynie w lewo).
  72.  
  73. X i Y to parametry miejsca wklejania wycinka. X zmienia sië od
  74. -160 do +640, poniewaû dotyczy górnego lewego naroûnika wycinka.
  75. Zmienna Y jest losowana, na przykîad tak (znak "?" odpowiada w
  76. Directorze funkcji Random):
  77.  
  78. <l>y=?3*80
  79.  
  80. <txt>Znaczy to, ûe moûemy oczekiwaê trzech liczb -- 0, 1, 2, a po
  81. pomnoûeniu przez 80 otrzymamy 0, 80 lub 160. Wynika z tego, ûe
  82. ryba moûe siëgaê najwyûej do pierwszej linii ekranu (zerowej) lub
  83. (w dóî) maksimum do 240 (160 + 80).
  84.  
  85. Liczby 178 i 78 okreôlajâ dîugoôê i wysokoôê wycinania. Ryba jest
  86. wycinana z pewnym "naddatkiem" i nakîadana jak Brush-Replic, to
  87. znaczy razem ze swoim tîem.
  88.  
  89. Ryba pîynâca w prawo napotka w pewnym momencie granicë,
  90. wyznaczonâ przez zmiennâ BRZEG, i musi zawróciê. Trzeba zmieniê
  91. jej rysunek, czyli wycinanie kawaîka o 80 pikseli niûej (ryba
  92. obrócona w prawo) i zmieniê kierunek ruchu. Mniej wiëcej w tym
  93. momencie zaczynajâ sië komplikacje. Program coraz bardziej sië
  94. wikîa i trzeba bardzo uwaûaê na nazwy zmiennych i podprogramów,
  95. ûeby nie zaplâtaê sië w programie. Kierunkiem ruchu steruje
  96. zmienna ZWROT, która raz jest równa -1, a raz +1. Skok, o jaki
  97. porusza sië ryba, jest zmiennâ U, pomnoûonâ przez zmiennâ ZWROT.
  98. Mamy X + U x ZWROT, co daje raz wartoôê malejâcâ, a raz rosnâcâ.
  99. Moûe to wyglâdaê zawile, ale nie ma na to rady.
  100.  
  101. Algorytm przedstawia sië wobec tego nastëpujâco:
  102.  
  103. Ryba startuje z prawej strony. Jeûeli jej pozycja X nie jest
  104. mniejsza od lewej krawëdzi ruchu -- BRZEG, to od X odejmuje sië
  105. U, co daje nowâ wartoôê X i stawia rybë na nowej pozycji bardziej
  106. w lewo. Postëpuje sië w ten sposób tak dîugo, dopóki X nie bëdzie
  107. mniejsze od BRZEG. Jeûeli to nastâpi, program wykona skok do
  108. podprogramu ZWROTY, gdzie losuje sië nowy "pas ruchu" -- zmiennâ
  109. Y, i przestawia zmiennâ ZWROT (mnoûâc jâ przez -1). Program
  110. rozpoznaje kierunek ruchu ryby gîównie przez sprawdzanie zmiennej
  111. ZWROT. Jeûeli jest ujemna, wszystko jest skierowane na ruch w
  112. lewo, jeûeli dodatnia -- odwrotnie.
  113.  
  114. Analogicznie postâpiîem przy uruchomieniu drugiej ryby. Startuje
  115. ona z przeciwnej strony, wobec tego pierwsze odwoîanie do
  116. zmiennych X, ZWROT i BRZEG musi byê przeciwne. Pierwsza ryba to
  117. ciâg, zaczynajâcy sië od rozkazu "DO duzaRyba", a druga startuje
  118. od "DO maîaRyba". Wszystkie nazwy zmiennych maîej ryby, które nie
  119. sâ wspólne z duûâ, majâ dodanâ cyfrë 2 do nazwy. Np. X i X2,
  120. ZWROT i ZWROT2 itd. Trochë to pomaga poîapaê sië w tekôcie
  121. skryptu.
  122.  
  123. Najwaûniejszâ jednak sprawâ jest skonstruowanie fragmentu
  124. programu, który wyîapuje miejsce spotkania ryb i uruchamia jego
  125. konsekwencje. Oczywiôcie uchwycenie momentu spotkania realizujemy
  126. funkcjâ IF, która musi sprawdziê, czy nastâpi jednoczeônie szereg
  127. warunków. Pierwszym warunkiem jest zgodnoôê wysokoôci ruchu ryb,
  128. czyli Y musi byê równe Y2. Odlegîoôci X i X2 muszâ byê wiëksze od
  129. zera, aby "moment" byî widoczny. Róûnica odlegîoôci powinna byê
  130. taka, aby ryby spotkaîy sië prawie dokîadnie pyskami. W
  131. Directorze realizuje sië to operatorem "&", zastëpujâcym znany z
  132. innych jëzyków "AND".
  133.  
  134. Teraz moûna skierowaê program do linii, która wyôwietli kolejne
  135. fazy "îykania" i sprawë mamy czëôciowo z gîowy. Pozostaje problem
  136. -- co zrobiê z poîkniëtâ rybâ? Program bowiem pracuje trochë jak
  137. zegarek i regularnie realizuje wszystkie kolejne fazy ruchu,
  138. wszystkich "aktorów". Nie moûna tak po prostu "uômierciê" ryby.
  139. Najprostszym wyjôciem jest w tym momencie zmiana wysokoôci Y2 --
  140. maîej ryby. Wyrzucamy jâ poza ekran (powyûej) i "poîkniëta ryba"
  141. znika z ekranu, pîynâc w rzeczywistoôci przez chwilë dalej w tym
  142. samym kierunku. Dziëki temu nie trzeba tworzyê dodatkowych linii
  143. programu i zakîócaê normalnego rytmu jego dziaîania.
  144.  
  145. Teraz moûna tylko zapeîniê resztë ekranu (poniûej x = 240) innym
  146. ruchomym obrazem. Wprowadziîem tam îawice ryb z dolnej czëôci
  147. podstawowej planszy. Ryby, dla uîatwienia, pîynâ w jednym
  148. kierunku (w prawo), ale dla urozmaicenia ruchu, po kaûdym
  149. dotarciu do krawëdzi zmienia sië losowo rodzaj îawicy -- duûa lub
  150. maîa. Poniewaû nie wystëpuje tu problem kolizji obiektów, îawice
  151. poruszajâ sië ze zmiennâ szybkoôciâ -- z losowo zróûnicowanymi
  152. wielkoôciami "skoku".
  153.  
  154. Po uruchomieniu caîoôci moûna obserwowaê namiastkë ûycia na
  155. ekranie. Ryby pîywajâ, co jakiô czas jedna zjada drugâ, po czym
  156. akcja pîynie dalej. Gdyby nie to, ûe chciaîem wykonaê moûliwie
  157. krótki zapis programu, moûna by wzbogaciê akcjë o wiele
  158. dodatkowych atrakcji. To znaczy zrobiê machanie ogonem duûej ryby
  159. co kilka klatek i np. zjadanie maîych ryb z îawicy, a nie tylko
  160. pojedynczych osobników. Moûna wprowadziê efekt ucieczki maîych
  161. ryb co jakiô czas i dodatkowo element pogoni. Miîoônicy znanego
  162. modelu typu "lisy i króliki" mogâ wprowadziê element uzaleûnienia
  163. liczby duûych ryb od iloôci pokarmu (maîych ryb) i odwrotnie.
  164. Pole do zabawy jest olbrzymie.
  165.  
  166. Wreszcie trzeba powiedzieê, ûe ryby wybraîem tylko dlatego, ûe
  167. naturalnie wyglâda tu pusty ekran tîa. Przy bardziej ambitnym
  168. zaîoûeniu moûna zrobiê coô w rodzaju znanej gry >Sim Life<. Co
  169. sië zmieni w ôrodowisku naturalnym, jeûeli wprowadzimy losowo
  170. takie czynniki, jak zwierzëta, ich pokarm, naturalni wrogowie i
  171. klimat? I jeûeli jeden czynnik ma wpîyw na inne? Niepostrzeûenie
  172. wchodzimy w temat ekologii, co jest osobnym zagadnieniem, ale
  173. warto sië nad tym w wolnej chwili zastanowiê.
  174.