Ośla łączka w Hollywood

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.

Dodaj komentarz