------------------Uwaga! Fragmenty w <...> boldem-------------- AMOS_3D, KOMPILATOR, KOMPRESJA -- ROZKAZY Poniewaû komputer mi nie padî, rabusie nie przyszli i mi go nie zabrali, poniewaû wbrew temu, co sië dzieje w polityce, moja Amisia byîa gotowa na wszystko -- wspólnie z mojâ ukochanâ opracowaliômy spis rozkazów rozszerzenia AMOS-a do animacji trójwymiarowych, a takûe inne ciekawostki... Krzysztof Prusik Zaczynamy: Wczytanie obiektów Td Dir KATALOG$ Powoduje, ûe katalogiem, z którego bëdziemy wczytywali obiekty, stanie sië >KATALOG$<. Przykîad: Td Dir "DF0:Demos/Objects" Td Load OBIEKT$ Wczytuje obiekt z pliku o nazwie >OBIEKT$< do pamiëci komputera. >OBIEKT$< stanie sië identyfikatorem, uûywanym przy innych komendach. Przykîad: Td Load "Amiga" Definiowanie obiektów Td Object NR,OBIEKT$,X,Y,Z,KX,KY,KZ Definicja obiektu numer >NR<. >OBIEKT$< -- nazwa obiektu (uûyta przy rozkazie >Td Load<); >X,Y,Z< -- wspóîrzëdne poîoûenia obiektu w przestrzeni trójwymiarowej; >KX,KY,KZ< -- kâty nachylenia obiektu do odpowiednich osi (16384 = kât 90 stopni). Przykîad: Td Object 1,"Amiga",0,0,800,-5000,0,5000 Td Surface OBIEKT$,BLOK1,SCIANA1 To NR,BLOK2,SCIANA2,KAT Powoduje wyôwietlenie ôciany >SCIANA1<, zdefiniowanej w pliku >OBIEKT$<, na ôcianie >SCIANA2< obiektu >NR<, obróconej o kât >KAT<*90 stopni. Przykîad: Td Surface "Amiga",1,2 To 1,0,4,0 Td Kill NR Kasuje definicjë obiektu numer >NR<. Przykîad: Td Kill 1 Wyôwietlanie obiektów Td Redraw Wyôwietla wszystkie zdefiniowane obiekty na ekranie 3d. Tuû za tym rozkazem wypadaîoby uûyê komendy >Screen Swap< oraz >Wait Vbl<. Przykîad: Td Redraw Td Background EKRAN,X1,Y1,X2,Y2 To X3,Y3 Definiuje tîo, na którym bëdâ wyôwietlane obiekty. Ekran-tîo, jest zwykîym ekranem AMOS-a i musi byê identyczny z ekranem przestrzeni 3d (rozdzielczoôê, kolory itp.). Aby to uzyskaê, powinniômy po prostu utworzyê ekran AMOS-a taki sam, jak ekran 3d. Pamiëtajmy, ûe rozkaz >Td Background< powinien byê zaraz za >Td Redraw<. Parametry: >EKRAN< -- numer ekranu AMOS-a, uûyty do stworzenia tîa; >X1,Y1< -- wspóîrzëdne lewego górnego rogu ekranu tîa; >X2,Y2< -- wspóîrzëdne prawego dolnego rogu ekranu tîa; >X3,Y3< -- lewy górny róg ekranu tîa na ekranie 3d. Przykîad: Td Background 1,0,0,160,100 To 0,0 Td Screen Height Y Ustala wysokoôê ekranu 3d, na >Y< pikseli. Przesuniëcia Td Move NR,X,Y,Z Przesuwa obiekt numer NR do punktu >X, Y, Z<. Przykîad: Td Move 0,-1000,2000,-1000 Td Move Rel NR,X,Y,Z Przesuwa obiekt numer >NR< o >X, Y, Z< punktów. Przykîad: Td Move Rel 1,100,1000,-1000 Td Angle NR,KX,KY,KZ Ustala kâty nachylenia obiektu >NR< do odpowiednich osi, na >KX, KY, KZ<. Przykîad: Td Angle 1,16000,1000,100 Td Angle NR,KX,KY,KZ Zmienia kâty nachylenia obiektu numer >NR< o >KX, KY, KZ<. Przykîad: Td Angle Rel 1,100,100,100 Td Forward NR,Z Przesuwa obiekt >NR< w osi Z, o >Z< punktów. Przykîad: Td Forward 1,100 Td Anim Rel NR,PUNKT,X,Y,Z,ZNACZNIK Rozciâgniëcie obiektu >NR<. Polega to na tym, ûe punkt numer >PUNKT< tego obiektu, zostanie przesuniëty o >X, Y, Z<. Gdy >ZNACZNIK<=0 -- rozkaz jest pomijany, gdy >ZNACZNIK=1< -- rozkaz jest wykonywany. Wykorzystujâc ten rozkaz, moûemy np. zaprogramowaê metamorfozë obiektu trójwymiarowego. Przykîad: Td Anim Rel 1,3,200,0,30,1 Animacja Poniûsze rozkazy dziaîajâ w podobny sposób jak rozkazy STOS oraz AMAL, tj. wykonywane sâ niezaleûnie od gîównego programu. Gdy interpreter AMOS-a natrafi na takie polecenie, nie wstrzymuje dziaîania programu, lecz wykonuje go nadal. Jednak po czasie >czas1<, zostanie wykonane odpowiednie polecenie (przez >czas2< jednostek czasu). To sië nazywa wykorzystanie multitaskingu! Td Move X NR,"(a,w1,czas1)(czas2,w2,w3)" Td Move Y,NR,"(a,w1,czas1)(czas2,w2,w3)" Td Move Z,NR,"(a,w1,czas1)(czas2,w2,w3)" Automatyczne przesuniëcie obiektu >NR< wzdîuû osi X (Y, Z). >czas1< -- czas, po którym zostanie wykonany ruch; >czas2< -- czas trwania ruchu; >w1, w2, w3< -- wspóîczynniki okreôlajâce odlegîoôê, wedîug wzoru: odlegîoôê = 5 * w1 + w2 * w3. Przykîad: Td Move X 1,"(1,0,5)(1,20,40)" Td Angle A NR,"(a,w1,czas1)(czas2,w2,w3)" Td Angle B NR,"(a,w1,czas1)(czas2,w2,w3)" Td Angle C NR,"(a,w1,czas1)(czas2,w2,w3)" Automatyczny obrót obiektu >NR< wokóî osi X (Y, Z). >czas1< -- czas, po którym zostanie wykonany obrót; >czas2< -- czas trwania obrotu; >w1,w2,w3< -- wspóîczynniki okreôlajâce kât obrotu, wedîug wzoru: kât = 5 * w1 + w2 * w3 Przykîad: Td Angle A 1,"(1,0,20) W rozkazach wystëpujâ teû dziwne parametry 'a', ale niestety nie powiem, do czego one sîuûâ, bo po prostu nie wiem. Zwykle w to miejsce wstawiona jest jedynka i wtedy rozkazy dziaîajâ poprawnie. Moûe któryô z Czytelników pokusi sië o sprawdzenie, czym jest ten parametr? Funkcje =Td X (NR) =Td Y (NR) =Td Z (NR) Podaje wspóîrzëdnâ X (Y, Z) obiektu numer >NR<. Przykîad: X=Td X(1) =Td Altitude A (NR) =Td Altitude B (NR) =Td Altitude C (NR) Podaje kât nachylenia obiektu >NR< do osi X (Y, Z). Przykîad: KX=Td Altitude A(1) Kompilator A skoro juû jesteômy przy dodatkowych rozkazach AMOS-a, moûe na ruszt wrzucimy sobie równieû kompilatorek? Otóû, jeôli mamy zainstalowany w AMOS-ie kompilator, automatycznie mamy dostëp do nowych rozkazów, zdefiniowanych w rozszerzeniu Compiler.Lib. Oto one: Compile _PARAMETRY$ Kompiluje program AMOS-a do pamiëci. Dziëki istnieniu tej komendy moûemy tworzyê wîasne kompilatory AMOS-a. Moûemy teû kompilowaê programy z trybu bezpoôredniego AMOS-a. >_PARAMETRY$< to tekst, przechowujâcy parametry wywoîania kompilatora (identyczne z parametrami kompilatora, wywoîywanego z CLI -- ACMP). Oto skîadnia tych parametrów: [plik.AMOS] [-Oplik] [-D00|-D01|-D10|-D01] [-T0|-T1|-T2|-T3] >plik.AMOS< -- kompilowany plik z programem w AMOS-ie. >-Oplik< -- umoûliwia wybranie pliku docelowego, do którego zostanie zapisany skompilowany program. >-D00< -- kompilacja caîkowicie w pamiëci (najszybsza). Wymaga duûo pamiëci (jak sama nazwa wskazuje...). >-D01< -- kompilacja w pamiëci, lecz zapis na dyskietkë. >-D10< -- kompilacja na dyskietce, zapis do pamiëci. >-D11< -- kompilacja na dyskietce, zapis na dyskietkë (metoda najwolniejsza, ale za to zajmuje minimalnâ iloôê pamiëci operacyjnej komputera). >-T0< -- wraz z kompilowanym programem tworzona jest ikona, dziëki czemu moûna go bez problemów wywoîaê z Workbencha. >-T1< -- generuje program w zwykîym formacie CLI, dziëki czemu moûe on byê uruchomiony z jakiegoô SHELL-a, a nawet pobieraê parametry wywoîania programu (moûna je póúniej odczytaê w funkcji >Command Line$<). >-T2< -- program w CLI, ale uruchomiony w tle (multitaskingu). >-T3< -- program do uruchomienia jedynie w Edytorze AMOS-a. Przykîad: Compile "program.AMOS -T3" 1. Comptest Off 2. Comptest On 3. Comptest 1. Wyîâcza caîkowicie testowanie stanu klawiatury, myszy (np. wywoîanie menu) oraz rysowanie sprite'ów na aktualnych pozycjach, dziëki czemu program moûe dziaîaê nawet do 10% szybciej. Uûywaj tego rozkazu tylko w ostatecznoôci, tj. jedynie w tych fragmentach programu, w których szybkoôê moûe zawaûyê na ûyciu i ômierci uûytkownika programu. Uwaga! Uûywajâc tego rozkazu uniemoûliwia sië przerwanie programu klawiszami [Ctrl][C]. 2. Sprawdza sië przed instrukacjami skoków (Goto, While) oraz poleceniami dîugo sië wykonujâcymi (Print, Wait). Standardowy sposób dziaîania AMOS-a. 3. Wymuszenie procesu testowania. Comp Load Comp Load KATALOG$ Wczytanie programu kompilatora do pamiëci. Jeôli dodamy parametr >KATALOG$<, AMOS wczyta kompilator ACMP z odpowiedniego katalogu. Comp Del Usuwa kompilator z pamiëci. =Comp Here Jeûeli wynik >True< (-1), oznacza to, ûe kompilator znajduje sië w pamiëci. W przeciwnym wypadku >False<. =Comp Err$ Zwraca komunikat ostatnio wygenerowanego bîëdu. Comp Size Odczytana pierwszy raz, zwraca rozmiar ostatnio skompilowanego programu w bajtach. Odczytana drugi raz -- liczbë instrukcji w tym programie. Kompresja Nie wszyscy wiedzâ, ûe w AMOS-ie sâ zaimplementowane rozkazy, umoûliwiajâce kompresjë i dekompresjë bloków pamiëci, a proszë pamiëtaê, ûe twórca AMOS-a jest teû twórcâ doskonaîego programu >Power Packer< (chyba wszyscy wiedzâ, do czego on sîuûy). =Squash(ADRES,DLUGOSC,TRYB,SKALA,KOLOR) Kompresuje fragment pamiëci. >ADRES< -- adres poczâtku kompresowanego bloku pamiëci (najlepiej podaê tutaj adres banku np. >Start(1)<). Uwaga! Nigdy nie kompresuj banku ikon, sprite'ów ani BOB-ów, poniewaû majâ one nieco innâ organizacjë. >DLUGOSC< -- dîugoôê bloku pamiëci, poddawanego kompresji (najlepiej uûyê tutaj funkcji okreôlajâcej dîugoôê banku, np. >Length(1)<). >TRYB< -- wybór trybu kompresji. Jeôli równa 0 -- >Slow Mode<, przeznaczony dla uûytkowników z Amigami 512 KB, czyli mówiâc proôciej dla kustoszy, wielbicieli zabytków. Jeôli róûna od zera -- >Fast Mode<. Wtedy uûywany jest obszar pamiëci dwa razy wiëkszy od kompresowanego bloku. Przyspiesza to operacjë. >SKALA< -- tylko w trybie >Slow Mode<. Ustala moc kompresji. Jest to wartoôê z zakresu od 256 do 4096. >KOLOR< -- numer koloru z zakresu od 0 do 31, który bëdzie migaî podczas procesu kompresji. Po zakoïczeniu kompresji funkcja zwraca wartoôê, która mówi, czy operacja zakoïczyîa sië sukcesem. I tak: wartoôê>0 -- wszystko ok. Wartoôê oznacza dîugoôê skompresowanego programu. wartoôê=0 -- kompresja przerwana przez naciôniëcie klawiszy [Ctrl][C]. wartoôê<0 -- kompresja przerwana, poniewaû skompresowany plik jest dîuûszy od pliku úródîowego. =Unsquash(ADRES,DLUGOSC) Dekompresuje blok danych o poczâtku pod adresem >ADRES<. >DLUGOSC< oznacza liczbë bajtów do dekompresji. A oto przykîadowy program kompresujâcy, a nastëpnie dekompresujâcy ekran: ^- Screen Open 0,640,200,2,Hires Colour 1,$FFF For I=0 To 80 Circle Rnd(639),Rnd(199),Rnd(50)+1 Next Screen Open 1,640,3*8,4,Hires Curs Off Screen Display 1,,220,, Wait Vbl Bell Centre At(,1)+"Naciônij dowolny klawisz" Centre At(,3)+"to rozpoczniemy kompresjë" Wait Key Screen 0 : Screen To Front 0 : Wait Vbl Timer=0 S=Squash(Logbase(0),16000,-1,1024,17) Screen 1 : Screen To Front 1 : Wait Vbl Cls Centre At(,1)+"Obrazek skompresowany w " Centre At(,3)+Str$(Timer/50)+" sekund" Centre At(,5)+"Orginalny rozmiar: 16000 bajtów" Centre At(,7)+"Po kompresji: "+Str$(S) Centre At(,9)+"Naciônij dowolny klawisz" Centre At(,11)+"to rozpoczniemy dekompresjë" Wait Key Screen 0 : Screen To Front : Wait Vbl L=Unsquash(LogBase(0),S) 'Screen 1 : Screen To Front 1 : Wait Vbl 'Cls 'Centre At(,1)+"Obrazek odtworzony" To tyle na dzisiaj. Dla zainteresowanych podajë mój adres w sieci internet: KPrusik@laser.mimuw.edu.pl. Jeôli ktoô ma dostëp -- zapraszam.