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.
Ciekawy pomysł. Z jednym się nie zgodzę. Wydaje mi się że wprowadzenie możliwości rysowania różnymi kolorami można by zrobić dosyć łatwo. Znaczy nie wiem czy byłoby łatwo w czystym Hollywood, jednak z pomocą Designera, mam już w zasadzie zwizualizowane w głowie jak szybko można to osiągnąć. W wolnym czasie będę musiał to sprawdzić.
Wtedy by już to nie była „Ośla łączka” 🙂 Cel jest minimum kodu, maksymalny efekt. Dodanie kolejnych pisaków wymaga dorobienia możliwości wyboru. Można by to było zrobić klawiszowo, ale w cywilizowany sposób trzeba by dorobić GUI programu z wyborami kolorów za pomocą myszki. A to jest już długi kod.
Wiem że w przykładach Hollywood jest kolorowanka „Flood Fill” (w moim podręczniku strona 125), ale nie wiem czy to byłoby ci pomocne. Dla mnie nie było.
Generalnie w piątek wyjeżdżam na kilka dni a już przed wyjazdem nie będę miał czasu się tym zająć. Natomiast pod koniec przyszłego tygodnia mam nadzieję przysiade do tematu. Jeśli osiagnę jakikolwiek sukces dam Ci znać i podeślę kod.
Cóz wróciłem z zagranicznych wojaży mocno przeziębiony, a co za tym idzie mocno pozbawiony energii do jakiegoś działania. Niemniej skoro obiecałem że spróbuję powalczyć to słowa dotrzymam, jak tylko wydobrzeje. Natomiast mimo choroby postanowiłem dziś włączyć na chwilę Amigę i na OS4Depot znalazłem Polar Paint. Hollywoodzki program graficzny, kţóry oczywiście nie jest szpilem na miarę Deluxe Paint, niemniej jest wyposażony w szereg typowych dla tego typu programów narzędzi jak rysowanie z możliwością wyboru różnych kolorów jak i różnej grubości linii, wypełnianie kolotem, efektami odbicia a nawet magiczną różdżką. Są też dostępne opcje dyskowe, typu load save, jest undo redo, wreszcie są zakładki, pozwalające na równoczesną pracę nad kilkoma rysunkami. Reasumując, to co pokazałeś to pierwszy krok, ale widać że możliwości Hollywood w tym aspekcie pozwalają na żwawe pokonywanie kolejnych kroków milowych. Trzymam kciuki by Polar Paint się rozwijał dalej.