home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #7
/
amigamamagazinepolishissue1998.iso
/
magazyn_amiga
/
1196
/
018_deluxe_paint
< prev
next >
Wrap
Text File
|
1998-03-26
|
15KB
|
365 lines
Deluxe Paint w praktyce (odc. 42.)
----------------------------------
MACRO W DELUXE PAINT CZYLI KREW POT I ÎZY
<lead>Deluxe Paint V ma wreszcie moûliwoôê korzystania z
makrodefinicji ARexxa. Jednak kiedy zaczâîem zajmowaê sië tym
zagadnieniem, postanowiîem nadaê wîaônie taki tytuî odcinkowi o
ARexxie w Deluxe Paint.
<a>Stanisîaw Wësîawski
<txt>Zacznë wyjâtkowo od wybrzydzania. Co prawda w odcinku, w
którym po raz pierwszy wspomniaîem o makrodefinicjach Deluxa,
byîem peîen zachwytu. Teraz jestem, powiedzmy, tylko zadowolony.
Ale dlaczego, u licha, nie moûna w rozkazach Deluxowego ARexxa
znaleúê ani jednej instrukcji rozpoznajâcej kolor piksela na
którym stoi kursor? Gdyby ta drobna instrukcja istniaîa,
tworzenie filtrów podobnych do tych z PersonalPainta, byîoby
drobiazgiem. Zaczâîem wiëc eksperymentowaê z ARexxem Deluxe
Painta takim, jaki jest.
Makrodefinicje w Deluxe Paint tworzy sië w niemal identyczny
sposób jak w CED-zie. Jest to (CED) jeden z dwóch chyba
najlepszych programów stworzonych dla Amigi, drugi to Opus 4.x
("piâtki" nie lubië). Naciskamy wiëc klawisze [Prawa Amiga][M],
wykonujemy pewne czynnoôci programem i naciskamy ponownie [Prawa
Amiga][M]. Makrodefinicja zostaîa zapamiëtana. W odróûnieniu
jednak od CED-a Deluxe Paint pozwala jâ "zobaczyê" (jest w RAM:T)
i edytowaê dowolnym edytorem tekstu. Poza tym powstaje
automatycznie lub moûe zostaê przez nas napisana w ARexxie. W
CED-zie po pierwszej sekwencji klawiszy trzeba podaê klawisz,
który w przyszîoôci uruchomi "nagrywane" wîaônie makro, w DP
klawisz (jeden z funkcyjnych [F1]...[F0]) podaje sië na koïcu.
Reszta identycznie.
Spëdziîem wiele godzin nad tâ zabawâ i ûeby skoïczyê z uûalaniem
sië nad sobâ, podam od razu, z czym sâ najwiëksze problemy.
Naleûy bezwzglëdnie sprawdzaê skrypt makrodefinicji w wersji "pod
CED-a". Rozkazy rysowania zastëpujemy poleceniem "TEXT n" i
poprzedzamy (tylko raz na poczâtku skryptu) rozkazem MENU 0 3.
Program wypisze na osobnym oknie CED-a obliczone wartoôci.
Dlaczego takie komplikacje? Otóû w wypadku np. postawienia
dwukropka zamiast ôrednika CED wywiesza odpowiedni komunikat
ARexxa typu "bîâd taki to a taki w linii nr". Sprawdzamy linië,
poprawiamy bîâd i jesteômy w domu. W Deluxe Paint, program
pokazuje w takim wypadku GURU albo bez sîowa zawiesza sië i
pozostaje nam tylko reset systemu. Osoby bardziej wtajemniczone w
ARexx niû ja pewnie potrafiâ jakoô sobie z tym poradziê, ja
jednak znam tylko tyle ARexxa, ile muszë.
Pomimo zastosowania tych mâdrych uwag oglâdaîem GURU wiele razy
przy poprawnie napisanych skryptach. Wielodniowe ôledztwo
skierowaîo podejrzenia na skâdinâd ôwietny program MCP, CED,
ARexx oraz sam Deluxe. Zrobië tu kilka maîych dygresji. Otóû przy
pracy z DP5 i animacjami zauwaûyîem gwaîtowne drûenie obrazu
monitora. W porë nagrana animacja (póki jeszcze litery w menu i
requesterach byîy widoczne) i reset ratowaîy pracë. W tym wypadku
najbardziej prawdopodobnym winowajcâ byî wygaszacz ekranu z MCP,
który usiîowaî sië wîâczyê. Úle to ôwiadczy nie tyle o MCP, ile o
DP5. Pytaî mnie teû kiedyô Czytelnik z Opola o problem z A600,
monitorem od PC i Deluxem4. Nie potrafiîem na to pytanie
sensownie odpowiedzieê. Swojâ drogâ, namawiaîbym Czynniki
Decyzyjne w Redakcji o zbieranie takich informacji i próby
odpowiedzi na nie na îamach Magazynu. Amiga powoli, ale jednak
obrasta w software oraz hardware i konflikty w tym gronie sâ
czësto trudne do wyjaônienia.
Wracajâc do ôledztwa, to na liôcie podejrzanych ostaî sië CED z
uruchomionym ARexxem. Sprawa byîa poszlakowa, ale sprawdzonym
sposobem na unikniëcie kîopotów jest reset komputera po
napisaniu, sprawdzeniu i zapisaniu skryptu.
Pierwszy skrypt, który postanowiîem napisaê, byî programem do
rysowania sinusoidy na ekranie Deluxe Painta. Dlaczego? Wydawaîo
mi sië, ûe jak to sië uda zrobiê, to reszta bëdzie juû
drobnostkâ. Algorytm rysowania sinusoidy znalazîem w ksiâûce*,
reszta jest moja. A wiëc na poczâtek piszemy:
<l>
/* */
ADDRESS "DPAINT.1"
CALL ADDLIB 'rexxmathlib.library',0,-30
LOCKGUI;PANEL OFF;TITLE OFF
<txt>Pierwsze dwie linie sâ oczywiste, trzecia odwoîuje sië do
koniecznej w tym wypadku biblioteki matematycznej -- bëdzie
uûywana funkcja SIN(). Ostatnia linia to juû typowe dla
Deluxowego ARexxa komendy powodujâce odsîoniëcie i przygotowanie
ekranu do pracy. Ôredniki pozwalajâ w kaûdym ARexxie poîâczyê
kilka rozkazów w jednej linii (odwrotnie dziaîa przecinek).
<l>
YM=500;M=YM/2 /* maksymalna wartoôê w pionie */
H=100;W=0.4*0.0314159;D=0 /* H=amplituda, W=czëstotliwoôê, D=przesuniëcie */
XL=0;XR=500;Ye1=H*SIN(W*XL+D) /* XL=minimum, XR=maksimum */
IF Ye1>=0 THEN Ye1=M-Ye1;IF Ye1<0 THEN Ye2=M+ABS(Ye1)
Xe1=XL
<txt>Kolejne linie warto uzupeîniê o komentarz dotyczâcy zmiennej
H -- powinna byê równa lub mniejsza zmiennej M. Czëstotliwoôê (W)
jest dobrana przeze mnie eksperymentalnie, a Ye1 zawiera wîaôciwâ
definicjë sinusoidy. Nazwy zmiennych teû majâ pewien haczyk. Otóû
rozkazy makr DP zawierajâ opcje nazywane czasami X, X1 itd. Na
przykîad rozkaz MOVETO 50 50, polecajâcy przesunâê kursor do
pozycji okreôlonej podanymi wspóîrzëdnymi, moûna napisaê równieû
jako MOVETO X 50 Y 50. Lepiej dla wîasnego dobra unikaê tworzenia
zmiennych o takich wîaônie nazwach.
<l>
MOVETO XL M;MBUTTONS SELECTUP /* lewy klawisz myszy zwolniony */
DO Xe2=XL TO XR;Ye2=H*SIN(W*Xe2+D)
IF Ye2>=0 THEN Ye2=M-Ye2;IF Ye2<0 THEN Ye2=M+ABS(Ye2)
<txt>Powyûsze linie naleûâ do algorytmu, ale dalej jest juû coô
mojego...
<l>
N=Xe1;CALL KONWERSJA;Xe1=N;N=Ye1;CALL KONWERSJA;Ye1=N
N=Xe2;CALL KONWERSJA;Xe2=N;N=Ye2;CALL KONWERSJA;Ye2=N
<txt>Trochë rysowania ...
<l>
MOVETO Xe1 Ye1;MBUTTONS SELECTDOWN /* przesuï kursor, naciônij lewy klawisz */
MOVETO Xe2 Ye2;MBUTTONS SELECTUP /* przesuï kursor, zwolnij klawisz */
Xe1=Xe2;Ye1=Ye2;END /* koniec pëtli */
UNLOCKGUI;PANEL ON;EXIT /* przywróê normalny ekran, zakoïcz program */
<txt>Teraz pora na wyjaônienie "mojego". Parë îadnych GURU
minëîo, nim zorientowaîem sië, ûe ARexx Deluxa przyjmuje tylko i
wyîâcznie caîkowite liczby dodatnie. Przynajmniej w rozkazach
dotyczâcych malowania na ekranie. Potëûny ARexx.guide (dostëpny w
Aminecie) proponowaî w tym wypadku jakieô dziwne rozwiâzanie. Po
pewnym czasie ulepiîem swoje:
<l>
KONWERSJA:
IF VERIFY(N, '.', 'm')=0 THEN RETURN /* jeûeli N=0 to moûe tak pozostaê */
N=(LEFT(N,VERIFY(n, '.', 'm')-1));RETURN /* jeûeli ma dziesiëtne
to wyrzuê je razem z kropkâ */
<txt>Podprogram Konwersja nie bierze w tym wypadku pod uwagë
liczb ujemnych, zajmuje sië tylko liczbami zmiennoprzecinkowymi.
Litera "m" nie ma w tym miejscu nic wspólnego ze zmiennâ "M"
programu. Jest to tylko opcja rozkazu ARexxa, który liczy miejsce
wystâpienia kropki dziesiëtnej i wyrzuca jâ razem z resztâ
liczby, która jak na ARexx przystaîo jest "stringiem".
No i co z tego? Wiele programów rysuje sinusoidë i to o wiele
szybciej. Jednak jest to furtka, przez którâ moûna wejôê do
skryptów rysujâcych najróûniejsze funkcje matematyczne. Zostawiam
to osobom bardziej zaprzyjaúnionym z matematykâ i programowaniem.
Mój skrypt dziaîa pod warunkiem, ûe uruchomimy go na ekranie 640
x 512, uaktywnimy w TOOLBOX jakieô narzëdzie do rysowania "od
rëki" i damy mu jakiô brush. Moûe to byê brush systemowy lub
cokolwiek, co przyczepimy do kursora. Sam skrypt moûemy ostroûnie
rozbudowaê, np. zmieniajâc w pëtli niektóre parametry sinusoidy.
Ale proszë pamiëtaê o ostrzeûeniach na poczâtku tekstu.
Pierwsza ilustracja pokazuje kilka rysunków sinusoidy stworzonych
opisanym wyûej makrem. Zmieniajâc wartoôci "W" i "H" moûna
narysowaê róûne wykresy. Na drugiej ilustracji mamy sinusoidë
rysowanâ nie okrâgîâ plamkâ, ale îukowatym brushem wyciëtym z
pocieniowanej kuli. Druga sinusoida -- "druciana" -- narysowana
zostaîa cienkim îukiem, skryptem sinusoidy z maîâ modyfikacjâ --
do instrukcji pëtli dodano polecenie rysowania w osi X co piâtego
punktu -- "DO ... BY 5".
Myôlâc intensywnie nad stworzeniem jakiegoô przydatnego skryptu,
przypomniaîem sobie odcinki dotyczâce tworzenia tekstur. Skrypt
taki nie musi juû korzystaê z biblioteki matematycznej, ale za to
uûyje funkcji losowej. Pierwsze linie skryptu pomijam i
przechodzë do sedna sprawy:
<l>
DO I=1 TO 10 /* wykonaj dziesiëê razy */
SETFGCOLOR 1 /* rysuj kolorem nr 1 z palety */
N=I/2;CALL KONWERSJA /* zmieï liczbë na caîkowitâ */
IF N*2=I THEN SETFGCOLOR 0 /* jeûeli N parzyste rysuj kolorem tîa */
XE=100;YE=300;DO NY=100 TO 300 /* rysuj od Y=100 do Y=300 */
CALL LOS;MOVETO R NY /* wylosuj liczbë, postaw jâ na osi X */
MBUTTONS SELECTDOWN;MBUTTONS SELECTUP /* naciônij i zwolnij klawisz */
END;END;SETFGCOLOR 1;UNLOCKGUI;PANEL ON;EXIT /* zakoïczenia pëtli i programu */
<txt>Skrypt pokrywa kwadratowy obszar losowo ustawianym brushem.
Nastëpnie powtarza te czynnoôci kolorem tîa, co spowoduje
wymazanie niektórych miejsc. Rysowanie i mazanie wykonuje w sumie
dziesiëê razy. Podprogram Konwersja jest taki sam jak poprzednio,
najwaûniejszy jest jednak podprogram losowania:
<l>
LOS:
R=RANDOM(XE, YE, TIME(S));RETURN
<txt>ARexx losuje wyjâtkowo podle. Funkcja Random dziaîa tylko na
liczbach caîkowitych od XE do YE. Ale w takim wypadku
przypadkowoôê jest wîaôciwie ûadna. Niezbëdnym ziarnem generatora
jest tu funkcja TIME(s), która pobiera czas z Systemu, w tym
wypadku w sekundach (s). I tak zobaczymy na ekranie "gëstsze"
upakowanie brushy w ôrodku zakresu niû na jego koïcach, ale
zawsze lepsze to niû nic. Skrypt produkuje surowiec do
"tekstury". Rozmiar pola dziaîania moûna oczywiôcie dowolnie
zmieniê. Jeûeli jednak chcemy pójôê krok dalej, moûemy przed
"UNLOCKGUI" dodaê parë nowych linii:
<l>
BRUSH 100 100 200 200 CUT /* wycinanie namalowanego obrazka */
OUTLINEBRUSH;TRIMBRUSH /* "obwódka i strzyûenie" */
CLEAR;MOVETO 150 150 /* wyczyôê ekran i postaw kursor w poprzednim miejscu */
MBUTTONS SELECTDOWN;MBUTTONS SELECTUP /* "stempluj" brush */
<txt>I tak dalej... Pole do dziaîania otwarte. Skrypt ten dziaîa
na ekranie 640 x 512 pod warunkiem, ûe tak jak poprzednio ma
jakiô brush, narzëdzie do "kropkowania" i wîâczonâ opcjë COLOR.
Czemu COLOR? Ano, jak damy MATTE, to dziesiëê razy wykonamy
rozrzucanie takich samych brushy. Przy COLOR co drugi raz je
lekko zepsujemy, poniewaû zadziaîajâ rozkazy zmiany koloru z 1 na
0 i odwrotnie. A o to wîaônie chodzi przy tworzeniu tekstur.
Trzecia ilustracja pokazuje kilka takich tekstur przygotowanych z
pomocâ opisanego skryptu. Moûna (i naleûy) zmieniê obszar
rysowania. Natomiast udoskonalanie skryptu przez dodawanie
kolejnych rozkazów jest juû doôê dyskusyjne. Opisane wyûej makro
pozwala wybraê dowolny brush i po skoïczeniu pracy pozostawia nas
z "surowcem" do tworzenia tekstury. Jak widaê, rodzaje takich
tekstur mogâ byê bardzo zróûnicowane. Im bardziej rozbudowany
bëdzie skrypt, tym mniejsza bëdzie moûliwoôê modyfikacji
koïcowego efektu z poziomu Deluxa. Nie pokazaîem tego, ale byê
moûe celowe byîoby uzupeînienie skryptu o opcjë rozmazywania.
Moûna to osiâgnâê przez dodanie polecenia wyciëcia fragmentu
stworzonego obrazu (paska) i przeciâgniëcie go opcjâ SMEAR przez
rysunek. Najbardziej jednak sensownâ modyfikacjâ (rozmazywanie
moûna wykonaê "rëcznie") jest staranne dobranie parametrów
losowania oraz ksztaîtu samego brusha do malowania. Poniewaû, jak
wspomniaîem, losowanie nie jest doskonaîe, pole obrazu jest
zagëszczone w ôrodkowej czëôci i nieco wydîuûone w pionie.
Odpowiednie dobranie brusha -- okrâgîa plamka, kwadracik, pasek
lub skrëcona nitka -- decyduje o koïcowym efekcie.
Jednym z pierwszych skryptów, który wykonaîem "z koniecznoôci",
byî skrypt do wycinania brushy z ekranu. Powód byî taki:
przygotowywaîem zestaw ikon (do menu) komercyjnego programu. Tego
typu praca jest na ogóî wielokrotnie wykonywana. Ikony trzeba
ciâgle poprawiaê, zmieniajâ sië ich nazwy, kolejnoôê, kolory i
tak dalej. Najlepiej w takim wypadku wykonaê serië obrazków na
ekranie programu malarskiego. Obrazki sâ jednakowej wielkoôci,
uîoûone zwykle w prostokât liniami i kolumnami. W ten sposób
moûna îatwo wyciâê z obrazu odpowiednie brushe ikon. Îatwo teû
sprawdzaê ich czytelnoôê róûnymi paletami. Wyciëte brushe
zamieniamy na IFF bez kompresji, np. programikiem IFFtoILBM.
Koder zamieni to z kolei na jëzyk C lub asembler. Problem leûy
jednak w nazwach ikon. Majâc takich obrazków do wykonania
dwadzieôcia lub piëêdziesiât nie wiemy, jak który sië nazywa.
Pisanie nazw przy rysunku nie pozwala na uîoûenie ich w zwarty
blok gotowy do pociëcia na fragmenty.
Przygotowujemy na rysunku blok ikon (brushy do wyciëcia), a do
skryptu poza wymiarami obszaru do wyciëcia umieszczamy kolejno
potrzebne nazwy. Moûemy teraz dowolnie poprawiaê wyglâd ikon na
wspólnym obrazku, a program i tak wytnie automatycznie
odpowiednie brushe, nada im ustalone wczeôniej nazwy i zapisze je
w odpowiednim miejscu. W przeciwnym wypadku zmuszeni jesteômy do
wykonywania "rëcznej" roboty wycinania i ciâgîego sprawdzania,
czy brush zapisujemy pod ustalonâ uprzednio nazwâ. Przy
kilkudziesiëciu ikonach jest to powaûny problem.
Skrypt zaczynamy tradycyjnym nagîówkiem z dodatkami, po czym
wpisujemy odpowiednie nazwy dla kolejnych brushy, ze ôcieûkâ do
miejsca zapisania:
<l>
a$.1="dh1:temp/Zaîaduj_plik.iff" /* 1 komórka tablicy z pierwszâ
nazwâ brusha i ôcieûkâ */
a$.2="dh1:temp/Zapisz_plik.iff" /* 2 komórka tablicy z drugâ
nazwâ brusha i ôcieûkâ */
a$.n="dh1:temp/Pomoc.iff" /* n-ta komórka tablicy z n-tâ nazwâ
brusha i ôcieûkâ */
WIER=w;KOL=k /* iloôê wierszy =w, kolumn =k */
Xn=x;Yn=y /* parametry górnego, lewego naroûnika bloku =x, y */
BX=x1;BY=y1 /* wielkoôê pojedynczego brusha szer=x1, wysok=y1 */
YY=Yn-BY;numer=0
DO i=1 TO WIER;XX=Xn-BX;YY=YY+BY /* kolejne wiersze */
DO j=1 TO KOL;XX=XX+BX /* kolejne kolumny */
BRUSH XX YY BX-1 BY-1 CUT;SOLIDBODY ON /* wytnij brush jako REPLIC */
numer=numer+1 /* ustaw numer brusha */
SAVEBRUSH a$.numer /* zapisz wyciëty brush w sposób podany w
tablicy a$.numer */
END;END /* koniec pëtli */
PANEL ON;TITLE ON;FREEBRUSH;UNLOCKGUI;EXIT /* przywróê panel,
uwolnij brush i skoïcz */
<txt>Oczywiôcie liczba wierszy bloku brushy razy liczba kolumn
powinna odpowiadaê liczbie nazw, pod jakimi zapiszemy brushe.
Jeûeli jednak blok ikon jest nierównomierny, tj. wycinamy wiëcej
maîych brushy niû potrzeba nam ikon, to nie jest to ûaden kîopot.
I tak póúniej przenosimy je z przykîadowo podanego katalogu Temp
do wîaôciwego katalogu, np. "Brushe_do MUI", "Brushe_dwukolorowe"
itd. Rzecz jasna, nazw, czyli komórek tablicy "a$", nie powinno
byê mniej, bo program nie bëdzie wiedziaî, gdzie co zapisaê i
GURU gotowe.
Makra do Deluxe Paint nie zastâpiâ nam normalnej pracy, ale mogâ
jâ bardzo uîatwiê. Ciekawe, ûe jakoô nikt sië w to dotychczas nie
bawiî. Nie znalazîem w Aminecie ani jednego skryptu do naszego
programu. Naleûy jednak pamiëtaê, ûe najbardziej naturalnâ
funkcjâ makra w Deluxe Paint jest zapisanie i powtórzenie
ostatnio wykonywanych czynnoôci. Takâ moûliwoôê miaî kiedyô
DigiPaint III. Kto go jeszcze uûywa?
<przyp>*Donald Hearn, M. Pauline Baker "Grafika
Mikrokomputerowa", str. 90, WNT Warszawa 1988 r.