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

  1. ----------Fragmenty w >...< -- wytîuszczone (bold)--------------------
  2.  
  3.  
  4. AMAL
  5.  
  6. <lead>W wielu listach proszono mnie, abym opisaî AMAL-a. A cóû to
  7. jest ten... AMAL? No tak, musi to byê naprawdë dziwny system,
  8. skoro niczego podobnego nie zawierajâ ûadne inne (znane mi)
  9. jëzyki programowania. A skoro tak, to po co go wsadzili do
  10. naszego kochanego AMOS-a? Aaaaach -- ja niewierny...
  11.  
  12. <a>Krzysztof Prusik
  13.  
  14. <txt>Skrót AMAL oznacza AMos Animation Language, czyli Animacyjny
  15. Jëzyk AMosa. A cóû to oznacza w praktyce? Otóû producenci AMOS-a
  16. przeanalizowali programy pisane przez ludzi (dla ludzi) i doszli
  17. do mâdrego wniosku, ûe we wszelkiego rodzaju demach, grach itp.
  18. najwiëcej czasu komputera zabiera animacja, czyli wyôwietlanie
  19. obiektów (sprite'ów i BOB-ów) w róûnych punktach ekranu, scroll
  20. pasków (barów), przesuwanie ekranu itp. Zwykle hackerzy muszâ sië
  21. mocno natrudziê, ûeby zmieôciê niezliczone przesuwania obiektów
  22. podczas jednego pionowego wygaszania ekranu. Juû oni dobrze
  23. wiedzâ, ûe kaûda jednostkowa operacja animacyjna powinna sië
  24. odbyê raz na 1/50 sekundy (synchronizacja!), co zapewni
  25. odpowieniâ pîynnoôê ruchów. Wiedzâ teû, jak bardzo jest to
  26. trudne.
  27.  
  28. Twórcy AMOS-a rozumieli dobrze te (i inne) bolâczki producentów
  29. demosów i opracowali system (AMAL), który zwalnia programistów
  30. (koderów) od obowiâzku zastanawiania sië, co, kiedy i w którym
  31. momencie wyôwietliê na ekranie. Jednoczeônie jednak AMAL jest
  32. bardzo prosty (udostëpnia maîâ liczbë rozkazów sterujâcych
  33. obiektami), ale wîaônie dziëki temu zapewnia dostatecznâ szybkoôê
  34. wykonywanym programom (skompilowany kod zbliûony do "generowanego
  35. przez asembler"). Oczywiôcie nie muszë chyba przypominaê, ûe AMOS
  36. ma wewnëtrzny kompilator programów AMAL-a, przez co programy
  37. AMAL-a sâ szybkie nawet wtedy, gdy je uruchomimy w ôrodowisku
  38. AMOS-a (bez uprzedniej kompilacji).
  39.  
  40. I najwaûniejsze: programy AMAL-a pracujâ w multitaskingu (sic!).
  41. Kaûdy program obsîuguje jeden obiekt, którym moûe byê BOB (duszek
  42. blittera), sprite (duszek sprzëtowy), ekran (wielkoôê, rozmiar,
  43. offset) lub rainbow (tëcza). Uwaga wiëc! Odpalajâc kilka
  44. programów AMAL-a, powodujemy ruch wszystkich obiektów
  45. jednoczeônie! (Patrz rys. 1.) Zwalniamy sië w ten sposób z
  46. obowiâzku pilnowania faz ruchu poszczególnych obiektów. Po prostu
  47. dla kaûdego obiektu tworzymy odpowiedni program, uruchamiamy
  48. go... i tyle. Teraz wszystko dzieje sië juû samo, a my moûemy sië
  49. zajâê czymô innym.
  50.  
  51. --------------------!Rys.1!-----------------------------------------
  52.  
  53. <sr>Pierwszy przesuwany obiekt
  54.  
  55. <txt>Weúmy takiego... BOB-a. Chcemy, ûeby sië przesuwaî po
  56. ekranie. Jak to zrobiê? Ano trzeba napisaê program AMAL-a, a
  57. nastëpnie odpaliê go. Moûe to wyglâdaê np. tak:
  58.  
  59. <l>'-------- îadujemy obrazy BOB-ów do pamiëci
  60.  
  61. Load "AMOSPro_Tutorial:Objects/Amal_bobs.ABK"
  62.  
  63. '
  64.  
  65. '-------- piszemy program dla AMAL-a
  66.  
  67. A$=""
  68.  
  69. A$=A$+" Let R0=1 predkosc x   "
  70.  
  71. A$=A$+" Let R1=1 predkosc y   "
  72.  
  73. A$=A$+"                       "
  74.  
  75. A$=A$+" AUtotest( petla       "
  76.  
  77. A$=A$+"                       "
  78.  
  79. A$=A$+"  Let X=X+R0 poziom    "
  80.  
  81. A$=A$+"  Let Y=Y+R1 pion      "
  82.  
  83. A$=A$+"                       "
  84.  
  85. A$=A$+"  If X>319 Direct Lewo "
  86.  
  87. A$=A$+"  If X<0 Direct Prawo  "
  88.  
  89. A$=A$+"  If Y>199 Direct Gora "
  90.  
  91. A$=A$+"  If Y<0 Direct Dol    "
  92.  
  93. A$=A$+"                       "
  94.  
  95. A$=A$+")Wait powrot do petli  "
  96.  
  97. A$=A$+"                       "
  98.  
  99. A$=A$+"Lewo:                  "
  100.  
  101. A$=A$+"  R0=-1 ruch w lewo    "
  102.  
  103. A$=A$+"  Wait powrot do petli "
  104.  
  105. A$=A$+"                       "
  106.  
  107. A$=A$+"Prawo:                 "
  108.  
  109. A$=A$+"  R0=1 ruch w prawo    "
  110.  
  111. A$=A$+"  Wait powrot do petli "
  112.  
  113. A$=A$+"                       "
  114.  
  115. A$=A$+"Gora:                  "
  116.  
  117. A$=A$+"  R1=-1 ruch w gore    "
  118.  
  119. A$=A$+"  Wait powrot do petli "
  120.  
  121. A$=A$+"                       "
  122.  
  123. A$=A$+"Dol:                   "
  124.  
  125. A$=A$+"  R1=1 ruch w dol      "
  126.  
  127. A$=A$+"  Wait powrot do petli "
  128.  
  129. A$=A$+"                       "
  130.  
  131. '- kompilujemy program
  132.  
  133. Amal 1,A$
  134.  
  135. '- przyporzâdkowujemy BOB-owi
  136.  
  137. Channel 1 To Bob 1
  138.  
  139. '- odpalamy go
  140.  
  141. Amal On 1
  142.  
  143. '- wyôwietlamy BOB-a
  144.  
  145. Bob 1,100,100,1
  146.  
  147. '- wszystko sië rusza, a my
  148.  
  149. '- w tle robimy coô innego
  150.  
  151. Repeat
  152.  
  153.    Print "SAI BABA ";
  154.  
  155. Until Mouse Key
  156.  
  157.  
  158. <txt>A teraz miniwyjaônienie zasady dziaîania programu:
  159.  
  160. 1. Do pamiëci îadujemy bank z obrazami BOB-ów (>Load...<). AMOS
  161. poprosi o wîoûenie odpowiedniego dysku z przykîadami BOB-ów. Skâd
  162. taki dysk wziâê? Jeôli mamy caîego AMOS-a, mamy równieû i ten
  163. dysk (patrz któryô tam Magazyn AMIGA, artykuî: "Co to jest
  164. AMOS?"). Oczywiôcie jeôli chcemy, moûemy bank bobów zmieniê na
  165. inny.
  166.  
  167. 2. Tworzymy zmiennâ tekstowâ z programem AMAL-a (>A$=...<).
  168.  
  169. 3. Kompilujemy pierwszy program AMAL-a (>Amal 1,A$<).
  170.  
  171. 4. Przyporzâdkowujemy pierwszy program AMAL-a odpowiedniemu
  172. obiektowi (Channel To...), w tym wypadku pierwszemu BOB-owi.
  173.  
  174. 5. Odpalamy pierwszy program AMAL-a (>Amal On 1<). Od tej pory na
  175. ekranie porusza sië "niewidoczny" BOB.
  176.  
  177. 6. Wyôwietlamy BOB-a na ekranie (>Bob...<). Teraz juû ruch jest
  178. widoczny.
  179.  
  180. 7. W pëtli AMOS-a, bez przerwy wyôwietlamy napis "SAI BABA".
  181. Program koïczy swoje dziaîanie, gdy naciôniemy którykolwiek
  182. przycisk myszy.
  183.  
  184. Czy wszystko proste, piëkne i przyjemne? To w takim razie
  185. przechodzimy do sedna sprawy, czyli: a co w ôrodku? Co to za
  186. dziwne znaczki zostaîy zapisane w zmiennej >A$<?
  187.  
  188. <sr>Rozkazy AMAL-a
  189.  
  190. <txt>Pierwsza i najwaûniejsza rzecz: rozkazy AMAL-a pisane sâ
  191. duûymi literami, a wszystko inne traktowane jest jako komentarz
  192. (patrz tekst programu). Wiemy juû, ûe kaûdy program AMAL-a
  193. steruje dokîadnie jednym obiektem (np. BOB-em). Nic nie stoi na
  194. przeszkodzie, aby sië dowiedzieê, ûe kaûdy program AMAL-a ma
  195. swoje zmienne specjalne >X,Y,A<, które umoûliwiajâ nam
  196. bezpoôrednie kierowanie obiektem. Zmieniajâc wiëc wartoôê >X,Y< w
  197. naszym programie, powodujemy zmianë miejsca pobytu BOB-a.  A
  198. teraz krótki opis komend:
  199.  
  200. >AUtotest(...)Wait< -- pëtla analogiczna do >Do...Loop< (AMOS), z
  201. tym ûe wykonanie wszystkich rozkazów w niej zawartych
  202. synchronizowane jest z wygaszaniem pionowym ekranu (aû promieï
  203. wizji wyôwietli caîy obraz). Zwykle kaûdy program AMAL-a zawiera
  204. jednâ (gîównâ) pëtlë AUtotest, w której przeprowadzane sâ
  205. wszystkie operacje.
  206.  
  207. >Let X=X+R0< -- coô rodem ze starego Spectrum. Powoduje
  208. zwiëkszenie/zmniejszenie pozycji x obiektu o R0 (rejestr AMAL-a).
  209. Odpowiada to instrukcji AMOS-a >X=X+R0<.
  210.  
  211. >If X>319 Direct Lewo< -- jeôli pozycja X sterowanego obiektu
  212. jest wiëksza niû 319 (wyszedî poza ekran), skocz (>Goto<) do
  213. etykiety >Lewo<. W AMOS-ie podobnâ instrukcjë zapisalibyômy
  214. nastëpujâco: >If X>319 Then Goto LEWO<. Uwaga! Etykiety AMAL-a
  215. mogâ byê tylko jednoliterowe (tylko duûe znaki sâ brane pod
  216. uwagë).
  217.  
  218. >Wait< -- powoduje powrót do pëtli AUtotest.
  219.  
  220. I tyle! Oto algorytm w pseudokodzie, który powinien ostatecznie
  221. rozjaôniê wszystkie wâtpliwoôci.
  222.  
  223. <l>Powtarzaj w pëtli:
  224.  
  225.     Przesuï obiekt w X
  226.  
  227.     Przesuï obiekt w Y
  228.  
  229.     Jeôli X wyjdzie poza ekran
  230.  
  231.        zmieï kierunek ruchu w X na przeciwny
  232.  
  233.     Jeôli Y wyjdzie poza ekran
  234.  
  235.        zmieï kierunek ruchu w Y na przeciwny
  236.  
  237. <txt>Jak îatwo sië domyôliê, program przesuwa po ekranie
  238. "piîeczkë", która odbija sië od ôcian ekranu.
  239.  
  240. <sr>Modyfikacje
  241.  
  242. ---------------------------!Rys.2!-------------------------------
  243.  
  244. <txt>A gdybyômy chcieli na ekranie poruszaê 15 obiektów (rys. 2.)
  245. i uzyskaê zîudzenie, ûe wszystkie poruszajâ sië losowo? Nic
  246. prostszego! Program w AMAL-u mamy napisany (zmienna A$), teraz
  247. pozostaîo tylko przypisaê go 15 BOB-om, a nastëpnie to wszystko
  248. uruchomiê. Zamiast ostatnich trzynastu linii poprzedniego
  249. programu wpisujemy wiëc np. coô takiego:
  250.  
  251. <l>
  252. For K=1 To 15
  253.    '- kompilujemy program
  254.    Amal K,A$
  255.    '- przyporzâdkowujemy BOB-owi
  256.    Channel K To Bob K
  257.    '- odpalamy go
  258.    Amal On K
  259.    '- wyôwietlamy BOB-a
  260.    Bob K,100,100,1
  261. Next
  262. '- wszystko sië rusza, a my
  263. '- w tle robimy coô innego
  264. Repeat
  265.    Print "SAI BABA ";
  266. Until Mouse Key
  267.  
  268. <txt>Pomiëdzy 6. a 5. liniâ programu (liczâc od koïca), moûemy
  269. wstawiê rozkaz >Wait Key<, co spowoduje, ûe bëdziemy lepiej
  270. widzieli, jak puszczane sâ w ruch kolejne obiekty.
  271.  
  272. Jeûeli chcemy spowodowaê nie tylko ruch obiektów, ale równieû
  273. animacjë poklatkowâ (pokazywanie kolejnych klatek animacji, czyli
  274. wyôwietlanie kolejnych obrazów BOB-a -- rys. 3.), wystarczy, jak
  275. pomiëdzy piâtym a szóstym wierszem programu dopiszemy linië:
  276.  
  277. ---------------------!Rys.3!------------------------------
  278.  
  279. <l>A$=A$+" Anim 0,(1,2)(2,2)(3,2)(4,2)"
  280.  
  281. <txt>No dobrze, a teraz wciônijmy [F1], co spowoduje uruchomienie
  282. programu AMOS-a. No i...? Uups! Piëtnaôcie obiektów moûe sië i
  283. porusza, ale wszystkie startujâ z tego samego punktu (100,100) i
  284. majâ ten sam kierunek oraz zwrot, przez co na ekranie widzimy
  285. tylko jednego poruszajâcego sië BOB-a (przykrywajâcego wszystkie
  286. pozostaîe -- patrz rys. 4.). Zmodyfikujmy wiëc siódmâ linië
  287. programu (od koïca) nastëpujâco:
  288.  
  289. <l>Bob K,Rnd(319),Rnd(199),1
  290.  
  291. ---------------------!Rys.4!------------------------------------
  292.  
  293. <txt>Teraz juû lepiej. Gdyby tak jeszcze obiekty podczas startu
  294. poruszaîy sië w róûnych kierunkach... (a nie, jak gîupie,
  295. wszystkie w kierunku prawego górnego rogu ekranu). Ha! I tu z
  296. pomocâ przychodzi moûliwoôê zmiany zmiennych AMAL-a, z poziomu
  297. AMOS-a. Wiemy, ûe kaûdy z programów AMAL-a, swojâ prywatnâ
  298. prëdkoôê ruchu poziomego przechowuje w rejestrze (zmiennej) >R0<,
  299. a pionowego w >R1<. Jeûeli chcemy zmieniê ich zawartoôê z poziomu
  300. AMOS-a, wystarczy uûyê rozkazu >Amreg<:
  301.  
  302. >Amreg(REJ,NR)=WAR< -- podstawienie wartoôci WAR, rejestrowi REJ
  303. (0..9) programu AMAL-a numer NR.
  304.  
  305. >WAR=Amreg(REJ,NR)< -- przypisanie zmiennej WAR, wartoôci
  306. przechowywanej w rejestrze REJ, programu NR.
  307.  
  308. A co w naszym wypadku? Trzeba skasowaê niepotrzebne przypisania
  309. na poczâtku programów AMAL-a (pierwsze dwie linie, zmienna >A$<),
  310. a zamiast tego inicjowaê rejestry AMAL-a z poziomu AMOS-a, czyli
  311. przed instrukcjâ:
  312.  
  313. <l>Amal On K
  314.  
  315. <txt>wstawiê
  316.  
  317. <l>Amreg(0,K)=1-Rnd(2) : Rem Let R0=
  318.  
  319. Amreg(1,K)=1-Rnd(1) : Rem Let R1=
  320.  
  321. <txt>Gdzie: >1-Rnd(2)< wyznacza losowo liczbë ze zbioru {-1,0,1}.
  322.  
  323. Ok? A tak przy okazji: to, co zrobiliômy, moûna byîo, zamiast
  324. wykorzystywania >Amreg<, uzyskaê innâ metodâ. Jak myôlisz, jakâ?
  325.  
  326.  
  327. <sr>Obsîuga joysticka w AMAL-u
  328.  
  329. <txt>A gdybyômy tak sami chcieli poruszaê stworzonym przez nas
  330. obiektem? Czy byîoby to moûliwe? Pewnie! Chyba nie ma rzeczy,
  331. której nie moûna by zrobiê w AMAL-u. Program moûe wyglâdaê np.
  332. tak:
  333.  
  334. <l>
  335. ...
  336.  
  337. A$=A$+" AUtotest( petla       "
  338.  
  339. A$=A$+"                       "
  340.  
  341. A$=A$+"  If J1=4 Direct Lewo  "
  342.  
  343. A$=A$+"  If J1=8 Direct Prawo "
  344.  
  345. A$=A$+"  If J1=1 Direct Gora  "
  346.  
  347. A$=A$+"  If J1=2 Direct Dol   "
  348.  
  349. A$=A$+"                       "
  350.  
  351. A$=A$+")Wait powrot do petli  "
  352.  
  353. A$=A$+"                       "
  354.  
  355. A$=A$+"Lewo:                  "
  356.  
  357. A$=A$+"  Let X=X-1 ruch w lewo"
  358.  
  359. A$=A$+"  Wait powrot do petli "
  360.  
  361. A$=A$+"                       "
  362.  
  363. A$=A$+"Prawo:                 "
  364.  
  365. A$=A$+"  Let X=X+1 w prawo    "
  366.  
  367. A$=A$+"  Wait powrot do petli "
  368.  
  369. A$=A$+"                       "
  370.  
  371. A$=A$+"Gora:                  "
  372.  
  373. A$=A$+"  Let Y=Y-1 w gore     "
  374.  
  375. A$=A$+"  Wait powrot do petli "
  376.  
  377. A$=A$+"                       "
  378.  
  379. A$=A$+"Dol:                   "
  380.  
  381. A$=A$+"  Let Y=Y+1 w dol      "
  382.  
  383. A$=A$+"  Wait powrot do petli "
  384.  
  385. A$=A$+"                       "
  386.  
  387. ...
  388.  
  389. <txt>Pojawiîa sië nowa funkcja >J1<. Cóû ona robi? Ano podaje nam
  390. stan joysticka, podîâczonego do portu pierwszego (analogicznie
  391. >J0< -- zerowego). Moûliwe stany pokazane sâ na rys. 5. Program
  392. dziaîa nastëpujâco: jeûeli przesuniemy dúwignië joysticka w
  393. którâkolwiek stronë, wtedy on w odpowiednim kierunku przesuwa
  394. obiekt (o 1).
  395.  
  396. ------------------------------!Rys.5!-------------------------------
  397.  
  398. <sr>Myszka
  399.  
  400. <txt>Analogiczne funkcje obsîugujâ myszkë w AMAL-u. Jak
  401. wyglâdaîby program, którego zadaniem byîoby przesuwanie obiektu
  402. do punktu poîoûenia wskaúnika myszki, natychmiast po tym, jak
  403. "ktoô" wciônie lewy jej przycisk? Spójrzmy niûej:
  404.  
  405. <l>
  406. ...
  407.  
  408. A$=A$+" AUtotest( petla       "
  409.  
  410. A$=A$+"                       "
  411.  
  412. A$=A$+"  If K1=-1 Direct Ruch "
  413.  
  414. A$=A$+"                       "
  415.  
  416. A$=A$+")Wait powrot do petli  "
  417.  
  418. A$=A$+"Ruch:                  "
  419.  
  420. a$=A$+"  Move XM-X,YM-Y,30    "
  421.  
  422. A$=A$+"  Wait powrot do petli "
  423.  
  424. ...
  425.  
  426. <txt>Nowe funkcje to: 
  427.  
  428. >K1< -- podaje stan lewego przycisku myszy (-1 wciôniëty, 0 --
  429. nie). Analogicznie >K2< odnosi sië do przycisku prawego.
  430.  
  431. >XM< -- podaje wspóîrzëdnâ X wskaúnika myszki.
  432.  
  433. >YM< -- analogicznie podaje wspóîrzëdnâ Y.
  434.  
  435. >Move XM-X,YM-Y,30< -- przesuwa obiekt do miejsca pobytu
  436. wskaúnika myszki w trzydziestu krokach.
  437.  
  438. Skoro tyle wiemy, moûemy zrobiê juû prawie wszystko. Na przykîad
  439. kazaê komputerowi przesuwaê wszystkich piëtnaôcie obiektów
  440. zgodnie ze wskazaniami joysticka albo myszki. Ômieszne to,
  441. prawda? Stadko obiektów poruszajâce sië na nasze zawoîanie.
  442. Proponujë jednak zrobiê coô innego. Niech pierwszych trzynaôcie
  443. BOB-ów bezmyôlnie odbija sië od ôcianek. Czternasty niech bëdzie
  444. obsîugiwany joystickiem, a piëtnasty myszkâ. Zróbmy to! Juû?
  445.  
  446. To teraz
  447.  
  448. <sr>niespodzianka
  449.  
  450. <txt>Uruchom program, popatrz na efekt jego dziaîania, po czym
  451. naciônij lewy przycisk myszy, a nastëpnie [Esc] (przejdziemy w
  452. ten sposób do bezpoôredniego trybu AMOS-a). Czy widzisz, ûe BOB-y
  453. nadal poruszajâ sië po ekranie? Wpisz komendë:
  454.  
  455. <l>Print "Ala ma kota"
  456.  
  457. <txt>Zadziaîaîo? Przesuï okno trybu bezpoôredniego myszkâ.
  458. Dziaîa? Poruszaj joystickiem -- obiekt rusza sië zgodnie z
  459. naszymi wachniëciami? I to jest wîaônie to, czego nie majâ
  460. wîaôciciele pecetów -- multitasking w peînej krasie. Moûesz to
  461. pokazaê jakiemuô zatwardziaîemu facetowi z niebieskimi klapkami
  462. na oczach, a rëczë, ûe jego oczy wyjdâ z orbit (i przebijâ te
  463. niebieskie klapki). Nie ma to, jak porównywanie mîotka do
  464. siekierki czy, jak kto woli, siekierki do mîotka...
  465.  
  466. Jak to sië mówi, przyganiaî kocioî garnkowi...
  467.