home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
10
/
ami041.txt
< prev
next >
Wrap
Text File
|
1997-04-07
|
11KB
|
454 lines
------------------Uwaga! Fragmenty w <...> boldem--------------
AMOS_3D, KOMPILATOR, KOMPRESJA -- ROZKAZY
<lead>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...
<a>Krzysztof Prusik
<txt>Zaczynamy:
<sr>Wczytanie obiektów
<l>Td Dir KATALOG$
<txt>Powoduje, ûe katalogiem, z którego bëdziemy wczytywali obiekty,
stanie sië >KATALOG$<.
Przykîad: Td Dir "DF0:Demos/Objects"
<l>Td Load OBIEKT$
<txt>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"
<sr>Definiowanie obiektów
<l>Td Object NR,OBIEKT$,X,Y,Z,KX,KY,KZ
<txt>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
<l>Td Surface OBIEKT$,BLOK1,SCIANA1 To NR,BLOK2,SCIANA2,KAT
<txt>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
<l>Td Kill NR
<txt>Kasuje definicjë obiektu numer >NR<.
Przykîad: Td Kill 1
<sr>Wyôwietlanie obiektów
<l>Td Redraw
<txt>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
<l>Td Background EKRAN,X1,Y1,X2,Y2 To X3,Y3
<txt>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
<l>Td Screen Height Y
<txt>Ustala wysokoôê ekranu 3d, na >Y< pikseli.
<sr>Przesuniëcia
<l>Td Move NR,X,Y,Z
<txt>Przesuwa obiekt numer NR do punktu >X, Y, Z<.
Przykîad: Td Move 0,-1000,2000,-1000
<l>Td Move Rel NR,X,Y,Z
<txt>Przesuwa obiekt numer >NR< o >X, Y, Z< punktów.
Przykîad: Td Move Rel 1,100,1000,-1000
<l>Td Angle NR,KX,KY,KZ
<txt>Ustala kâty nachylenia obiektu >NR< do odpowiednich osi, na
>KX, KY, KZ<.
Przykîad: Td Angle 1,16000,1000,100
<l>Td Angle NR,KX,KY,KZ
<txt>Zmienia kâty nachylenia obiektu numer >NR< o >KX, KY, KZ<.
Przykîad: Td Angle Rel 1,100,100,100
<l>Td Forward NR,Z
<txt>Przesuwa obiekt >NR< w osi Z, o >Z< punktów.
Przykîad: Td Forward 1,100
<l>Td Anim Rel NR,PUNKT,X,Y,Z,ZNACZNIK
<txt>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
<sr>Animacja
<txt>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!
<l>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)"
<txt>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)"
<l>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)"
<txt>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?
<sr>Funkcje
<l>=Td X (NR)
=Td Y (NR)
=Td Z (NR)
<txt>Podaje wspóîrzëdnâ X (Y, Z) obiektu numer >NR<.
Przykîad: X=Td X(1)
<l>=Td Altitude A (NR)
=Td Altitude B (NR)
=Td Altitude C (NR)
<txt>Podaje kât nachylenia obiektu >NR< do osi X (Y, Z).
Przykîad: KX=Td Altitude A(1)
<sr>Kompilator
<txt>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:
<l>Compile _PARAMETRY$
<txt>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:
<l>[plik.AMOS] [-Oplik] [-D00|-D01|-D10|-D01] [-T0|-T1|-T2|-T3]
<txt>
>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"
<l>
1. Comptest Off
2. Comptest On
3. Comptest
<txt>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.
<l>Comp Load
Comp Load KATALOG$
<txt>Wczytanie programu kompilatora do pamiëci. Jeôli dodamy
parametr >KATALOG$<, AMOS wczyta kompilator ACMP z odpowiedniego
katalogu.
<l>Comp Del
<txt>Usuwa kompilator z pamiëci.
<l>=Comp Here
<txt>Jeûeli wynik >True< (-1), oznacza to, ûe kompilator znajduje
sië w pamiëci. W przeciwnym wypadku >False<.
<l>=Comp Err$
<txt>Zwraca komunikat ostatnio wygenerowanego bîëdu.
<l>Comp Size
<txt>Odczytana pierwszy raz, zwraca rozmiar ostatnio
skompilowanego programu w bajtach. Odczytana drugi raz -- liczbë
instrukcji w tym programie.
<sr>Kompresja
<txt>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).
<l>=Squash(ADRES,DLUGOSC,TRYB,SKALA,KOLOR)
<txt>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.
<l>=Unsquash(ADRES,DLUGOSC)
<txt>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:
^-
<l>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"
<txt>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.