Ostatnio dzióbię znowu w Hollywood i tak sobie pomyślałem, że może coś dorzucę początkującym takim jak ja – w końcu wszyscy od siebie się uczymy, jak to w hobby.
Dzisiejszy kawałek kodu oswaja z funkcjami dla myszy.
Kod programu
@DISPLAY {Title = "Program do bazgrania", Width = 800, Height = 600}
; Współrzędne poprzedniej pozycji kursora myszy
Local poprzednieX, poprzednieY
; Grubość linii
Local gruboscLinii = 5
; Rozmiar gumki
Local gumka = 15
; Obsługa zdarzeń z myszą
InstallEventHandler({
; Przypisanie aktualnych współrzędnych myszy do zmiennych 'poprzednieX' i 'poprzednieY' przy naciśnięciu przycisku myszy
OnMouseDown = Function() poprzednieX, poprzednieY = MouseX(), MouseY() EndFunction,
; Funkcja wywoływana przy ruchu myszy
OnMouseMove = Function()
; Deklarowanie i przypisanie aktualnych współrzędnych myszy do zmiennych 'obecneX' i 'obecneY'
Local obecneX, obecneY = MouseX(), MouseY()
If IsLeftMouse()
; Rysowanie białej linii od poprzednich do obecnych współrzędnych o grubości 'gruboscLinii'
Line(poprzednieX, poprzednieY, obecneX, obecneY, #WHITE, {Thickness = gruboscLinii})
ElseIf IsRightMouse()
; Rysowanie czarnej linii (gumki) od poprzednich do obecnych współrzędnych o grubości 'gumka'
Line(poprzednieX, poprzednieY, obecneX, obecneY, #BLACK, {Thickness = gumka})
EndIf
; Aktualizacja poprzednich współrzędnych na bieżące współrzędne
poprzednieX, poprzednieY = obecneX, obecneY
EndFunction
})
; Pętla oczekująca na zdarzenia (ruch myszy, kliknięcie)
Repeat WaitEvent Forever
Przykładowy rysunek poniżej.

To co się dzieje w kodzie jest okomentowane. Teraz rozwlekle wytłumaczę: co, po co i dlaczego tak.
Podstawy działania programu
Programik będzie reagował na wciśnięcia myszy. Przy wciśnięciu przycisku i przesuwaniu wskaźnika będzie rysował białą linię na czarnym tle. Biała linia jest pogrubiona. Kolor tła nie został zadeklarowany, więc domyślnie w Hollywood jest czarny. Gumka do mazania jest także linią, tylko trzy razy grubszą od linii rysowania; doświadczalnie ustaliłem, że tak będzie najlepiej. Gumka ma kolor czarny, bo takie jest tło. Mazanie nie jest usuwaniem linii tylko zamalowywaniem bieli czernią. W przypadku innego koloru tła kolor gumki musi być oczywiście zmieniony. Próbowałem użyć jako gumki kształtu podstawowego z wypełnieniem (kwadrat, koło), ale nie dawało to równomiernego pokrycia (postawały cieniutkie prążki), więc zrezygnowałem.
Na początku kodu (po podaniu parametrów okna programu) są Local – zmienne lokalne. Zmienne powinno umieszczać się na górze kodu – ułatwia to jego czytanie i zarządzanie zmiennymi. Zmienne przechowują wartości funkcji. Jeśli byłyby to zmienne globalne – wręcz musiałyby być na samej górze.
Widoczne litery X i Y oznaczają współrzędne. Nazwy zmiennych dałem polskie dla lepszego zrozumienia, ale nie wolno dawać znaków diakrytycznych („ogonków”). Jeżeli są nazwy angielskie to znaczy, że pochodzą z Hollywood i nie mogłem ich zmienić. Nazwy funkcji lub poleceń wbudowanych w język programowania są niezmienne. Program monitoruje wskaźnik myszy i gdy lewy przycisk myszy jest wciśnięty to rysuje na biało, a jak prawy przycisk to na czarno (czyli wymazuje).
If to spełnienie warunku, takie polskie „jeśli”. Cała konstrukcja If-ElseIf-EndIf to tak jakby po polsku napisać „jeśli-chyba, że- koniec jeśli”.
Line zajmuje się rysowaniem linii. Widoczne Thickness (czyli grubość linii) jest przypisane zarówno do rysowania jak i mazania.
Handlery
Używany jest InstallEventHandler. To jest worek na obsługę różnych zdarzeń związanych z poczynaniami użytkownika. Obszerny opis na prawie 18 stron jest w dokumentacji Hollywood. Słowo handler (które nieraz jest używane na forach amigowych) określa kawałek kodu, który obsługuje jakieś zdarzenie. Tak więc użycie w kodzie InstallEventHandler zapowiada właściwych „pomocników” (opisanych w dokumentacji). OnMouseDown to „przy naciśnięciu myszy” a OnMouseMove to „przy ruchu myszy”. Jak widać nazwy są wzięte z prostego angielskiego i to bardzo pomaga. W tym miejscu muszę zaznaczyć, że wymyślanie nazw opisujących co „to coś” robi jest dobrym nawykiem.
Nawiasy
Jest tu konstrukcja z nawiasami po słowie. Przykładowo IsLeftMouse() – po polsku by to było „jest lewy przycisk myszy” – to warunek, po którym określa się co ma sie dziać jak lewy przycisk myszy będzie wciśnięty. Nawiasy () na pierwszy rzut oka pozwalają odróżnić zmienną od funkcji, to funkcje mają nawiasy. W nawiasach umieszcza się argumenty funkcji. Argument funkcji to dane wejściowe do funkcji; można napisać, że po przyjęciu jakichś danych funkcja przybiera jakąś wartość. Jeśli nawias jest pusty to oznacza, że funkcja nie potrzebuje argumentów. Na przykład MouseX() i MouseY() pobiera dane o pozycji kursora z systemu operacyjnego i nie potrzebuje do tego żadnych dodatkowych informacji. Funkcja może też zwracać wartość, która jest wynikiem jej działania. Nie można pominąć nawiasów w funkcjach, bo wtedy interpreter (czyli program wykonujący kod) nie wiedziałby co to jest i byłby błąd składni, nie zadziałało by to.
Możliwości rozwijania programu
Pierwsze co przyszło mi do głowy:
- można dodać czyszczenie ekranu, żeby zacząć od nowa rysowanie bez konieczności wychodzenia z programu i powtórnego jego uruchomiania
- można dodać zapis obrazka do pliku graficznego
- można dodać więcej kolorów, ale to byłby przełom wymagający dołożenia dużo do kodu – żeby wybierać kolory trzeba wpierw stworzyć menu wyboru, czyli interfejs dla użytkownika; zaczęlibyśmy robić program graficzny do rysowania
- można przebudować kod tak, żeby był bardziej dojrzały i przyszłościowy, wprowadzając funkcje
Funkcje wprowadzają istotny smak w programowaniu – modułowość kodu. Taki kod jest lepiej zorganizowany i łatwiej wykorzystać powtórnie poszczególne elementy.
Teoretycznie jest możliwość – na superwolnym komputerze i przy bardzo szybkim rysowaniu – że linia wyjdzie przerywana. Wtedy można sobie poradzić opracowując algorytm, który interpoluje brakujące pozycje kursora. Interpolacja to kolejne obce słowo – najprościej to wstawienie przewidywanych wartości albo słów do kontekstu. Interpolacja w tym programie pozwalałaby na „domyślenie się” brakujących pozycji kursora.
No ale, miało być prosto dla początkujących i na tym poprzestańmy na dzisiaj. Jeżeli będzie zainteresowanie, na oślą łączkę będziemy wychodzić częściej.