Podsumowanie
Dotychczas stworzyliśmy aplikacje w wizualnym języku programowania Scratch oraz w Pythonie. To oczywiście tylko dwa spośród wielu dostępnych języków. W kolejnych materiałach pokażemy, jak budować strony internetowe w HTML, natomiast w tej części skupimy się na możliwościach kolejnego języka o nazwie Processing.
Treści zawarte w tym e‑materiale wykraczają poza podstawę programową. Jeśli jednak:
interesujesz się informatyką i programowaniem,
chcesz poszerzyć swoją wiedzę na temat tekstowych języków programowania,
poznać mniej znane języki i zintegrowane środowiska programistyczne,
zachęcamy cię do zapoznania się z tym e‑materiałem.
Wstęp
Chcąc przystąpić do wykonania interaktywnej aplikacji, należy najpierw pozyskać odpowiednie materiały potrzebne do realizacji projektu. Możesz znaleźć je w internecie lub wykonać je sam.
Posiadając odpowiednie materiały, można przystąpić do programowania aplikacji. Pierwszym krokiem powinien być wybór języka programowania. Dobrym kandydatem jest język ProcessingProcessing. Służy on do:
tworzenia projektowanych scenografii do spektakli tanecznych i muzycznych,
generowania obrazów do teledysków i filmów,
tworzenia obrazów do plakatów, czasopism i książek,
tworzenia interaktywnych instalacji w galeriach, muzeach i na ulicy.
Chcąc stworzyć interaktywną aplikację, należy mieć możliwość wyświetlania tekstu, ilustracji oraz filmów, dodatkowo należy mieć możliwość obsługiwania zdarzeń generowanych przez użytkownika (przykładowo kliknięcie myszy). Processing oferuje wszystkie powyższe możliwości, dodatkowo jest przyjazny dla początkujących, posiada własne środowisko oraz prostą składnię.
Drugim krokiem powinno być pobranie i zainstalowanie zintegrowanego środowiska programistycznego. (IDE - ang. Integrated Development Environment)(IDE - ang. Integrated Development Environment)
Processing rozwijany jest jako projekt Open Source, natomiast Processing IDE jest rozpowszechniane na licencji GPLlicencji GPL. Biblioteki oraz kod dostarczony przez producentów objęte są licencją LGPL, co pozwala autorom na rozpowszechniane swoich prac pod dowolną licencją, bez ograniczeń. Wszystkie wersje środowiska Processing znajdują się na stronie http://processing.org.
Instalacja środowiska
Dla każdego systemu operacyjnego wystarczy pobrać i uruchomić środowisko programistyczne wybierając odpowiednią zakładkę na stronie oprogramowania Processing:
https://processing.org/download/?processing
Wersja środowiska omawiana w materiale to 4.2
Po pobraniu pliku z rozszerzeniem .zip, wypakuj go w wybranym przez siebie miejscu. Następnie otwórz folder i kliknij dwukrotnie ikonę pliku processing.exe.

Po wykonaniu powyższych czynności powinno ukazać się następujące okienko, przeanalizuj jego poszczególne elementy:
Programowanie w Processing
Twórcy środowiska Processing zalecają, by swoje projekty przechowywać wewnątrz folderu nazwanego przez nich szkicownikiem (ang. sketchbook). Dzięki temu projekty będą dostępne w łatwy sposób z menu File->Sketchbook. Folder ten jest ważny jednak przede wszystkim z innego powodu. To wewnątrz niego musi się znajdować folder z zewnętrznymi bibliotekami, z których chcemy korzystać (instalacja zewnętrznych bibliotek omówiona jest poniżej). Można jednak samodzielnie wybrać inny folder, korzystając z opcji z menu File->Preferences. Pierwszą rzeczą, jaką należy ustawić w oknie Preferences, jest położenie wybranego folderu szkicownika. Powinien on być wybrany tak, aby był do niego łatwy dostęp przy instalowaniu dodatkowych bibliotek. Drugą ważną opcją jest maksymalna dostępna pamięć. W sytuacji, gdy operujemy na dużej ilości plików (zwłaszcza graficznych, wideo czy audio) możemy mieć do czynienia z wyjątkiem java.lang.OutOfMemoryError, którego można uniknąć poprzez zwiększenie maksymalnej pamięć dla środowiska Processing (co jest analogiczne do zwiększania ilości pamięci dla maszyny wirtualnej Javy, bo przecież Processing powstał jako opakowanie właśnie na Javę, a obecnie rozwinął się do obsługi Android SDK oraz JavaScript). Środowisko Processing daje nam możliwość zwiększenia maksymalnej dostępnej pamięci, w tym celu należy wybrać kolejno File, Preferences oraz zaznaczyć pozycję Increase maximum available memory to..., wpisać nową wartość i zatwierdzić zmiany. Pozostałe opcje nie są już tak istotne i mogą być dowolnie konfigurowane.
Przykłady wykorzystania języka Processing
Sztuka
Prostota składni języka Processing, pozwoliła wielu osobom, które nie miały doświadczenia programistycznego w realizacji projektów bez konieczności zatrudniania specjalistów z branży IT. To czysto akademickie rozwiązanie umożliwiło wielu badaczom opracować prototypy i sprawdzić ich działanie w środowisku o bardzo dużych możliwościach graficznych i interakcyjnych bez ponoszenia znacznych nakładów finansowych. W internecie można znaleźć dużo przykładów zastosowania tej technologii przez różne grupy zawodowe. Wystarczy wspomnieć o projekcie, który wzbudził spore zainteresowanie świata sztuki. Artyści Daniel Franke (czyt. Daniel Franke) i Cedric Kiefer (czyt. Cedrik Kiefe) opracowali pomysł wirtualnej ruchomej rzeźby z piasku. Rzeźba powstała na podstawie ruchu tancerki, sczytanego przez kontroler Kinect. Animacja została zrealizowana na podstawie analizy w czasie rzeczywistym właśnie w Processing.

Wizualizacja danych
Naukowcy ze znanego niemieckiego Instytutu Max Planck, zwizualizowali za pomocą Processing dane około 94,000 publikacji z ostatnich dziesięciu lat zgromadzonych w portalu „SciVerse Scopus”. Zaprojektowana i zaimplementowana dynamiczna sieć pozwoliła na zwizualizowanie połączeń pomiędzy instytucjami naukowymi.
Sieć ta pozwoliła na stworzenie interaktywnego środowiska prezentującego aktywność naukową i współpracę instytutu z innymi jednostkami na całym świecie.

Analiza fleksyjna
Stephan Thiel (czyt. Stefan Tiel) z uniwersytetu w Adelajdzie zrealizował projekt polegający na nowoczesnym sposobie interpretacji dzieł Shakespeare. Użycie Processing pozwoliło na zliczenie słów i znalezienie istniejących relacji i powiązań pomiędzy dziełami autora.

Przedstawione przykłady miały za zadanie zilustrować szerokie zastosowanie technologii którą poznacie podczas najbliższych lekcji. Zdobyta wiedza pozwoli wam zrealizować ciekawe a przede wszystkim kreatywne pomysły.
Typy danych
Zmienna jest to miejsce w pamięci, w którym możemy przechowywać dane. W zależności od rodzaju danych zmienna zajmować będzie odpowiedni rozmiar pamięci. Do najczęściej stosowanych typów danych możemy zaliczyć liczby całkowite, liczby rzeczywiste, znaki (np. litery, cyfry) oraz wartości logiczne.

Można określić początkową wartość zmiennej już przy jej deklaracji, można też zrobić to później, za pomocą operatora przypisania:
nazwa_zmiennej = nowa_wartość_dla_zmiennej;.
Operator = służy do przypisywania nowej wartości zmiennej. Wartość jaką przechowuje zmienna, możesz zmieniać wielokrotnie w trakcie działania aplikacji.
Kolejną rzeczą, jest nazewnictwo zmiennych. Nazwy zmiennych nie mogą zawierać polskich znaków, znaków specjalnych (z wyjątkiem _ i $) i nie mogą zaczynać się od cyfry.
Instrukcje sterujące
Dobrą praktyką jest pisanie czytelnego oraz łatwego do zrozumienia kodu, używając struktur sterujących takich jak pętle oraz instrukcje warunkowe (m. in. if...else) do sekwencyjnego wykonywania odpowiednich instrukcji.
Processing dostarcza standardowe możliwości, które dostępne są w każdym języku programowania takie jak :
komentarze:
To, co następuje po dwóch ukośnikach to tzw. komentarz. Processing tego nie czyta, bo są to tylko informacje dla programistów. Komentarz obejmuje wszystko, co znajduje się za znakiem podwójnego ukośnika do końca linii, lub między znakami
/* ... */
pętle: for, while,
Pętle for i while będą powtarzać ciąg instrukcji (iteracja) tak długo, jak długo zdefiniowane warunki będą prawdziwe. Pętla for jest pętlą licznikową, natomiast pętla while jest pętlą warunkową. Przeanalizuj przykłady umieszczone poniżej.
Instrukcje złożone składają się z ciągu pojedynczych instrukcji, które należy w pewien sposób od siebie oddzielić, dlatego każdą pojedynczą instrukcję należy zakończyć średnikiem. Pojedyncze instrukcje grupujemy w złożone za pomocą nawiasów klamrowych. W ogólności instrukcje złożone zajmują wiele wierszy, choć w prostych przypadkach cała instrukcja złożona może się mieścić w jednym wierszu.

Taki sam efekt możemy osiągnąć używając pętli while:
instrukcje warunkowe: if, if. . .else,
Podstawowym rodzajem instrukcji warunkowej spotykanej w większości języków programowania jest if. Instrukcja ta pozwala na wykonanie określonego bloku kodu w przypadku spełnienia określonego warunku. Jeśli warunek nie jest spełniony zostanie wykonany blok alternatywny. Pomiędzy różnymi językami programowania występują w tej instrukcji nieznaczne różnice składniowe. W Processing instrukcja ta wygląda następująco:
instrukcję wyboru: switch,
Podobnie jak if ... else, jest to instrukcja warunkowa, tzw. instrukcja wielokrotnego wyboru. Możemy podejmować decyzje na podstawie wartości jednej zmiennej. Najczęściej wykorzystywana jest do obsługi zdarzeń (np. sterowanie za pomocą klawiatury). W zależności od wartości parametru uruchamiana jest odpowiednia akcja.
operatory
W poniższej tabeli znajdują się najważniejsze operatory pozwalające wykonywać obliczenia oraz porównywać zmienne ze sobą.
Przeanalizuj i przetestuj poniższy kod.
Wynikiem kodu z pętli for oraz pętli while jest osiem poziomych linii, natomiast wynikiem kodu z instrukcji warunkowej if...else oraz instrukcji wyboru switch jest fragment tekstu wypisywany w konsoli środowiska.
Kształty
Układ współrzędnych w Processing wygląda inaczej niż ten wykorzystywany w matematyce, tutaj punkt (0,0) znajduje się w lewym górnym rogu okna programu. Kształty w Processing składają się z punktów. Każdy punkt posiada współrzędne:
x – współrzędna pozioma, odległość (w pikselach) od lewej krawędzi okna.
y – współrzędna pionowa, odległość (w pikselach) od górnej krawędzi okna.

Najprostsze figury geometryczne w Processing możemy otrzymać za pomocą funkcji:

Przeanalizuj i przetestuj poniższy kod.
Kolor
Wartości jakie przyjmuje każda z funkcji odpowiedzialna za generowanie koloru to np.: background( R, G, B); Gdzie R – jest wartością z przedziału od (0‑255) dla koloru czerwonego G – jest wartością z przedziału od (0‑255) dla koloru niebieskiego B – jest wartością z przedziału od (0‑255) dla koloru zielonego

Oprócz wartości RGB stosowana jest też czwarta wartość – „alpha – A”, określająca przezroczystość koloru. Każda z funkcji odpowiedzialna za kolor może przyjmować więc wartości (R, G, B, A);
Metoda Setup
Processing posiada kilka predefiniowanych metod, które określają strukturę programu i odpowiadają za najważniejsze dla każdego projektu części. Pierwszą taką metodą jest funkcja setup:
Jest to metoda wejściowa dla naszego programu i wewnątrz niej definiujemy wszelkie ustawienia programu (takie jak rozmiar okna, silnik renderujący itp.), inicjalizujemy obiekty klas i zmienne. Po skompilowaniu programu otrzymamy okno aplikacji o domyślnym rozmiarze 100 na 100 pikseli. Uruchomić program można na trzy sposoby:
poprzez pierwszą od lewej ikonkę na górnym pasku (ikona „play”),
poprzez menu Sketch->Run,
poprzez skrót klawiaturowy Ctrl+R.
Można również samemu ustawić rozmiar okna poprzez następujące wywołanie wewnątrz funkcji setup:
Jeśli nie określimy silnika renderującego, domyślnie zostanie ustawiony silnik JAVA2D, który pozwala na operacje dwuwymiarowe. Jest on dokładny, lecz nieco wolniejszy niż silnik P2D. Dostępne opcje silników to:
P2D (Processing 2D) – silnik dwuwymiarowy wykorzystujący możliwości kart graficznych wspierających OpenGL.
P3D (Processing 3D) – silnik trójwymiarowy wykorzystujący możliwości kart graficznych wspierających OpenGL.
FX2D (JavaFX 2D) – silnik dwuwymiarowy, używający JavaFX (dla niektórych aplikacji może być szybszy).
PDF – silnik pozwalający zapisać grafikę dwuwymiarową bezpośrednio do pliku PDF, zamiast wyświetlać ją na ekranie. Co więcej, elementy wektorowe zostaną zapisane również jako wektorowe, co umożliwia późniejszą manipulację nimi w programach typu Adobe Ilustrator. Przydatny, gdy potrzebujemy wysokiej jakości grafiki do druku czy edycji.
SVG – silnik dwuwymiarowy, który zapisuje obraz wynikowy prosto do pliku SVG.
W starszych wersjach środowiska dostępny jest również:
OPENGL – silnik trójwymiarowy, do którego potrzebny jest sprzęt, który wspiera OpenGL, wykorzystuje bibliotekę JOGL (Java for OpenGL) i pozwala na rendering trójwymiarowy na stronach www.
P2D oraz P3D – były to sprzętowe implementacje nie wykorzystujące silnika OpenGL.
Aby korzystać z możliwości oraz zapisu do PDF, należy zaimportować moduł PDF export, informacja jak to zrobić znajduje się w dalszej części materiału. Rodzaj silnika określa się poprzez podanie trzeciego parametru metody size np.
Powyższy kod jest wszystkim, czego potrzeba, by uruchomić okno dla OPENGL.
Metoda draw
Drugą istotną funkcją jest funkcja draw:
Jest ona wywoływana cyklicznie w każdej klatce działania programu, zatem w niej należy umieścić kod odpowiedzialny za rysowanie i wszelkie operacje, które powinny odbywać się co klatkę. Można prześledzić to na przykładzie. Należy dodać dwie zmienne typu całkowitego do kodu programu, które będą przechowywać położenie rysowanego obiektu:
Linię tę trzeba umieścić poza omawianymi wcześniej metodami. Teraz w metodzie draw() można dodać rysowanie kwadratu i zwiększenie położenia jego wyrysowania:
Całość powinna wyglądać następująco:
Aby wyrysować tylko jedną klatkę lub zatrzymać animację należy skorzystać z metody noLoop(). Jeśli umieści się ją wewnątrz metody setup, program wywoła metodę draw() tylko raz:
Funkcją o działaniu odwrotnym do noLoop() jest funkcja loop(), która jest domyślnie wywoływana przy starcie programu, (jeśli nie zadeklaruje się inaczej). Jeśli do kodu zostanie dopisane wywołanie funkcji loop() na końcu metody draw(), to otrzymany efekt będzie taki, jakby w ogóle nie dodano wywołania pary loop() i noLoop(). Aby powrócić do widoku animacji należy usunąć oba wpisy (loop() oraz noLoop()).
W powyższym przykładzie kwadrat rysowany jest od lewego górnego narożnika, jednak można to zmienić, przez dodanie odpowiedniego ustawienia w metodzie setup(), dla wbudowanych funkcji rysujących kształty, czy ma on być rysowny od narożnika, czy względem środka. Dla metody rect() wygląda to następująco:
By powrócić do domyślnego ustawienia, należy skorzystać z metody:
Analogiczne metody istnieją dla pozostałych metod rysujących – jest to omówione w dokumentacji programu Processing.
Kolor obrysu i wypełnienia zostały ustawione na wartości domyślne. Zmienić je można przy pomocy następujących metod:
W powyższym przykładzie kolor wypełnienia ustawiony jest na czarny, a kolor obrysu na biały. Można także użyć innego koloru, ale zostanie to omówione później. Jeśli powyższe metody zostaną umieszczone w metodzie setup(), będą dotyczyły wszystkich rysowanych obiektów tak długo, póki nie zostaną zmienione. Można je także umieścić wewnątrz funkcji draw(). Wtedy dotyczyć będą obiektów narysowanych po ich wywołaniu. Dlatego można określić Processing jako maszynę stanową – raz ustawiony stan jest używany globalnie, aż do jego zmiany. Jeżeli chce się korzystać jedynie z wypełnienia lub tylko z obrysu, należy skorzystać z jednej z poniższych metod:
Wypełnienie i/lub obrys będą wyłączone do ponownego wywołania metody ustawiającej ich kolor (czyli fill() lub stroke()).
Przeanalizuj i przetestuj poniższy kod.
Metoda exit
Ostatnią główną metodą (lecz nie ostatnią dostępną), jest funkcja wyjścia. W niej należy określić wszystkie czynności konieczne do wykonania przed zamknięciem programu. Metoda ta nazywa się exit(). W metodzie tej można wyświetlić komunikat podczas zamykania programu:
Po uruchomieniu programu komunikat ten jest wyświetlany, ale program nie zostanie zamknięty. Należy samemu obsłużyć zamknięcie okna aplikacji, przez dopisanie na końcu programu, instrukcji:
Spowoduje to wywołanie domyślnej obsługi metody exit(). Metody tej można również użyć w dowolnym miejscu kodu np. w reakcji na działanie użytkownika. Jej wywołanie spowoduje zamknięcie aplikacji. Dla testów można dopisać jej wywołanie np. na końcu metody draw(), która teraz powinna wyglądać następująco:
Aby zapoznać się z efektem działania programu, należy jednak usunąć tę linijkę, gdyż w przypadku jej pozostawienia aplikacja momentalnie zakończy swoje działanie po uruchomieniu.
Własne funkcje i błędy kompilacji
W celu poprawienia czytelności kodu można rysowanie kwadratu przenieść do osobnej funkcji, i jej wywołanie umieścić w metodzie draw():
Należy pamiętać, by plik z kodem źródłowym programu znajdował się w folderze o tej samej nazwie co nazwa pliku (czyli plik „test.pde” powinien znajdować się w folderze „test”) - inaczej otrzyma się błąd. Jeśli chodzi o błędy kompilacji w środowisku Processing, warto wspomnieć o jednej, nie do końca oczywistej, właściwości tego środowiska. By to zobrazować, należy wygenerować celowy błąd, np. poprzez wywołanie nieistniejącej funkcji. Na dole okna pojawia się wtedy treść powstałego błędu oraz dodatkowo numer linii, w której on się pojawił.

Należy jednak uważać, bowiem w tym miejscu standardowo pojawia się numer bieżącej linii, w programie. Po kliknięciu gdziekolwiek na kod, zniknie zaznaczenie linii błędu i jej numer. Żeby się dowiedzieć o którą linię chodziło, należy ponownie uruchomić program.
Tryby pracy
Od wersji 2.0 środowisko Processing.org oferuje kilka trybów pracy (a nowe są cały czas tworzone i dodawane). Są to m. in.:
Standard – podstawowy i domyślny tryb dostępny w Processing'u. Pozwala tworzyć i eksportować aplikacje desktop'owe jednocześnie na różne platformy (Windows, Mac OS, Linux). Umożliwia także zapis projektu jako aplet w środowisku java uruchamiany w przeglądarce (wraz ze wsparciem dla 3D), jednak to rozwiązanie nie jest już rozwijane (zamiast tego zaleca się wykorzystanie trybu JavaScript). Tryb ten zalecany jest jako domyślny podczas nauki i pisania pierwszych programów w środowisku Processing.org.
Android – zaprezentowany po raz pierwszy w wersji 1.5 środowiska Processing.org, był pierwszym dostępnym, poza standardowym, trybem. Umożliwia tworzenie i uruchamianie projektów na urządzeniach z systemem Android. Począwszy od wersji 2.0 środowiska, wspierane są tylko wersje wyższe niż Android 2.3.3 (Gingerbread, API 10). Zanim napisze się aplikację, należy podłączyć urządzenie wykorzystując kabel USB, następnie w środowisku rozwijamy zakładkę Android, z rozwijanej listy Devices wybieramy nasze urządzenie. Teraz można uruchomić kod w języku Processing na urządzeniu z systemem Android. Dokumentację Processing dla Android znajdziesz pod linkiem: https://android.processing.org/
p5.js – pozwala tworzyć aplikacje uruchamiane bezpośrednio z przeglądarki. Jest to biblioteka JavaScript do kreatywnego kodowania, dostarcza narzędzia, które upraszczają proces tworzenia interaktywnych wizualizacji z kodem w przeglądarce internetowej. To rozwiązanie zastępuje aplety znane z wcześniejszych wersji środowiska. Dokumentacja znajduje się pod linkiem: https://p5js.org/
Python - rozszerzenie do Processing, umożliwiające pisanie programów Processing w języku programowania Python. Dokumentacja znajduje się pod linkiem: https://py.processing.org/
Tryb można zmienić poprzez menu rozwijane w prawym górnym obszarze okna programu.

Samo środowisko nie ulega znacznej zmianie przy zmianie trybu pracy, lecz należy mieć na uwadze w jakim trybie obecnie pracujemy, gdyż ma to wpływ na to jak powinniśmy pisać kod.
Działanie trybów przeanalizujemy na przykładzie napisanym w różnych trybach pracy. Przykładowy kod stworzy kilka kolorowych kół rysowanych na środku okna, promień koła początkowo ma wartość równą szerokości okna, następnie zmniejsza się, aż osiągnie wartość 0. W kodzie mamy zmienną kroku, która mówi o ile zmniejszany jest promień koła przy każdej iteracji.
Standard
Domyślny tryb pracy w środowisku Processing.
Szkicownik:
Wynik kodu:

p5.js
Kod piszemy w języku JavaScript, struktura kodu dalej jest intuicyjna. Należy zauważyć, że chcąc zdefiniować rozmiar naszego „okna”, trzeba skorzystać z metody createCanvas(), jej dwa parametry definiują kolejno szerokość oraz wysokość naszego „okna” w przeglądarce. Należy zwrócić uwagę, że nie powinno się używać width, przed wywołaniem createCanvas(). Przy pracy w trybie p5.js oprócz szkicownika mamy do czynienia jeszcze z plikiem index.html, który jest stroną zawierającą skrypt tworzonego szkicownika. W większości przypadków ten plik powinien pozostać bez zmian.
Szkicownik:
Plik index.html:

Wynik kodu:

Python
Kod piszemy w języku Python, struktura dalej pozostaje intuicyjna. Istotne jest, aby nadać zmiennym pewną wartość na początku, w tym przykładzie zmienna promien początkowo ma wartość 0, gdyż nie można do niej przypisać width w tym momencie ( size() nie zostało jeszcze wywołane ). Aby odwołać się do zmiennej lub zmienić jej wartość należy wykorzystać słowo kluczowe global.
Szkicownik:

Instalacja zewnętrznych bibliotek
Gdy w API Processing'u nie można znaleźć potrzebnej metody czy klasy, warto poszukać dodatkowych bibliotek. Biblioteki takie znajdują się na stronie środowiska - http://processing.org/reference/libraries/ , a także na wielu innych stronach. Samo środowisko zawiera już kilka przydatnych bibliotek jak np. Video, Network czy PDF Export. Jedyne co trzeba zrobić, by zainstalować pobraną bibliotekę, to przekopiować wszystkie pliki (zachowując strukturę folderów stworzoną przez autora biblioteki) do odpowiedniego folderu. Od wersji 1.0 i wyższej, wszelkie biblioteki potrzebne do wykonania projektu umieszcza się w podfolderze „libraries” w folderze „szkicownika” (czyli jako podfolder folderu sketchbook, którego lokalizacja została ustalona wcześniej podczas konfiguracji). By dodać bibliotekę do projektu, wystarczy, że wykonasz jeden z poniższych kroków:
skorzystaj z menu Sketch->Import Library wybierając żądaną bibliotekę,
wpisz na początku programu słowo „import” i po spacji nazwę biblioteki wraz z pakietem, w którym się znajduje.
Niezależnie od wybranego sposobu, otrzymuje się identyczny efekt. Przykładowo, jeśli chcemy zaimportować bibliotekę do obsługi wideo, na początku pliku należy wpisać:
co pozwoli na korzystanie z klas i metod tej biblioteki.


Obsługa klawiatury
Za obsługę klawiatury odpowiada kolejna główna metoda, a mianowicie:
Ustawienie wewnątrz niej obsługi klawiatury zapewnia, że będzie ona wykonywana w każdej klatce. Można jednak pominąć tę metodę i umieścić obsługę w każdej innej metodzie (np. draw()), gdyż nie zawiera ona żadnych parametrów. Zdarzenie klawiatury nie jest przekazywane do metody, a zachowywane w zmiennych globalnych, które zostaną omówione w dalszej części. Ta metoda gwarantuje jednak wywołanie w każdej klatce i estetykę kodu. Zamiast niej można sprawdzać flagę naciśnięcia klawisza o tej samej nazwie co metoda (czyli keyPressed()), w następujący sposób:
Zaleca się jednak korzystanie z metody keyPressed(). Aby sprawdzić, który klawisz został wciśnięty, należy użyć zmiennej globalnej key:
Można dodać także zmienną bgColor, która będzie odpowiadać za zmianę koloru tła i przekazać ją jako parametr do funkcji background w metodzie rysującej. Dzięki temu, po naciśnięciu klawisza „a” tło zmieni się na czarne, po naciśnięciu klawisza „s” na ciemnoszare, a naciśnięcie klawisza „d” zmieni je na jasnoszare. Co jednak zrobić, gdy jest to klawisz specjalny, jak np. strzałka czy Enter? Należy wówczas skorzystać z kolejnej zmiennej globalnej – keyCode. Zawiera ona kod ASCII klawisza, który został wciśnięty. Aby więc dopisać obsługę zatrzymania i wznowienia animacji przy pomocy strzałek na klawiaturze należy napisać kod:
Powyższy przykład zawiera pewne stałe zdefiniowane w języku Processing. Łącząc oba przypadki poprzez dodanie słowa kluczowego „else” przed obsługą zwykłych klawiszy, otrzymamy kompletną obsługę klawiatury.
Przeanalizuj i przetestuj poniższy kod.
Obsługa myszy
Obsługa myszy, tak jak w przypadku klawiatury, możliwa jest na dwa sposoby. Najczęściej wykorzystuje się zmienne globalne (dostępne w każdym miejscu programu) przechowujące położenie kursora myszy: mouseX oraz mouseY. Po zakomentowaniu wywołania utworzonej poprzednio funkcji rysującej kwadrat, można napisać wywołanie rysowania z położeniem kursora myszy jako pozycją tworzonego kwadratu. Dodając do tego poznaną wcześniej metodę, by rysować kwadrat od środka, otrzyma się efekt podążania kwadratu za kursorem myszy (kursor w środku obiektu). Fragment kodu za to odpowiedzialny powinien wglądać następująco:
Główną metodą, odpowiadającą za obsługę kliknięcia myszy jest mousePressed() bez żadnych parametrów. Jeśli umieści się ją w programie i przeniesie do niej napisane przed chwilą dwie linie rysujące kwadrat, to otrzyma się białe tło i „mignięcie” kwadratu przy kliknięciu przycisku myszy. Dlaczego tak się dzieje? Co należy zmienić w kodzie, by rysowany kwadrat pozostawał widoczny? Trzeba zakomentować (lub usunąć) pierwszą linię w metodzie draw(), czyli wypełnienie tła kolorem. Alternatywnie można ją przenieść do metody setup, dzięki czemu będzie wywołana tylko raz z zadanym kolorem jako parametr. Teraz rysowany na kliknięcie kwadrat powinien pozostawać na obrazie. Dodatkowo można sprawdzić, który przycisk został wciśnięty. Do tego celu służy kolejna globalna zmienna - mouseButton(). Najlepiej zobrazuje to poniższy przykład:
Inne przydatne podczas obsługi myszy metody to:
mouseClicked() - dla obsługi kliknięcia (w przeciwieństwie do naciśnięcia jest to złożenie dwóch akcji – wciśnięcia i puszczenia przycisku myszy),
mouseDragged() - dla obsługi przeciągania,
mouseMoved() - dla obsługi ruchu myszą (bez wciśnięcia przycisku myszy),
mouseReleased() - odwrotne niż mousePressed() - puszczenie przycisku myszy.
Przeanalizuj i przetestuj poniższy kod.
Operowanie na plikach wektorowych
Przeanalizuj i przetestuj poniższy kod.
Linijka 10‑14
Transformacje w języku Processing działają w taki sposób, że przekształcany jest cały obecny układ współrzędnych. Zatem można narysować przykładowo prostokąt w punkcie (100, 200) na dwa sposoby.
Pierwszy przypadek jest oczywisty, natomiast w drugim najpierw przenosi się cały układ do zadanego punktu, a następnie rysuje obiekt.
Linijka 17‑25
Aby narysować kwadrat również w punkcie (100, 200), ale obrócony o 45 stopni, trzeba skorzystać ze złożenia przekształceń – translacji oraz obrotu. Jako argument metoda rotate() przyjmuje kąt, którego wartość podajemy w radianach. Jeśli kąt obrotu określony jest w stopniach, to należy skorzystać z metody radians(), konwertującej stopnie na radiany.
Linijka 5‑7
Trzecią przydatną transformacją jest skalowanie, czyli operacją zmiany proporcji wymiarów względem początku układu współrzędnych – metoda scale(), której przekazuje się procentowe wartości o ile chcemy przeskalować wzdłuż osi X oraz Y.
Operowanie na obrazach rastrowych.
W dalszej części potrzebny będzie obrazek, możesz wykorzystać własny obrazek lub pobrać przykładowy poniżej.
Aby pracować na poziomie pikseli obrazu, należy wykonać kilka kroków, a mianowicie: załadować piksele, dokonać zmian na nich, zaktualizować piksele na obrazie. Ten proces pokazany jest na przykładzie funkcji zmieniającej wyświetlany obraz na negatyw.
Przeanalizuj i przetestuj poniższy kod.
Linijka 7
Będziemy pracować na pikselach wczytanych obrazów. Należy w tym celu utworzyć zmienna globalną, która będzie przechowywała wczytany obraz. Typ PImage to typ danej obrazu.
Linijka 11
Wczytujemy przykładowy obraz do zmiennej o nazwie img. Można użyć dowolnego obrazu (obsługiwane typy plików to .gif, .jpg, .tga, .png). Przy tak podanej ścieżce musi się on znajdować w folderze projektu (tam gdzie plik .pde).
Linijka 16
W ten sposób wskazany obrazek zostanie wyrysowany począwszy od punktu (0, 0). Oprócz położenia, jako kolejne dwa parametry można przekazać do metody image() rozmiar, do jakiego należy przeskalować obrazek, w naszym przypadku jest to szerokość i wysokość okna.
Linijka 20‑31
Metoda loadPixels() służy do załadowania pikseli obrazu (w tym przypadku obrazek z małą kaczką) do tablicy pixels, którą później wykorzystuje się do przeprowadzenia zmian. Jest to tablica jednowymiarowa, a więc można zastosować następującą pętlę:
Jednak częściej trzeba poruszać się po obrazie w dwóch wymiarach. Wymaga to indeksowania tablicy jednowymiarowej tak, jakby była dwuwymiarową.
Przeanalizuj i przetestuj poniższy kod.

Globalne właściwości width oraz height odnoszą się do wymiarów obrazu (są identyczne z wartością ustawioną poprzez size()). Metody red, green oraz blue pozwalają pobrać odpowiednie składowe koloru, by je zmodyfikować. Po dokonaniu zmian (odwróceniu koloru), można zapisać kolor piksela przy wykorzystaniu metody color() z parametrami, odpowiednio – składową czerwoną, zieloną i niebieską koloru. Ostatnim krokiem jest zaktualizowanie pikseli wyświetlanych na ekranie – updatePixels(). By uniknąć nieprzyjemnych efektów zmiany pikseli na obrazie podczas jego wyświetlania, należy je zmodyfikować w osobnym buforze (tablica pixels), po czym zamienić te tablice.
Dodatkowe informacje na temat metody image() można znaleźć w dokumentacji
http://processing.org/reference/image_.html
Wczytywanie i zapis plików
Aby zapisać utworzony plik obrazu stosuje się instrukcję:
Zapisanie więcej niż jednego obrazu (jednej klatki) lub serii klatek, można wykonać poprzez odpowiednią konstrukcję nazwy pliku wyjściowego:
Spowoduje to zapis każdej klatki do pliku z odpowiednią nazwą tj. output-001.png, output-002.png itd. Jednak przed uruchomieniem powyższego przykładu należy dodać w metodzie setup() jeszcze ustawienie liczby klatek na sekundę:
Umieść pobrany plik tekstowy w folderze projektu.
Przeanalizuj i przetestuj poniższy kod.
Linijka 4‑5
W metodzie setup() wczytujemy zawartość tekstową pliku do wcześniej przygotowanej zmiennej poprzez podanie ścieżki do pliku.
Linijka 7‑9
W metodzie setup() wczytujemy zawartość tekstową pliku do wcześniej przygotowanej zmiennej poprzez wybór pliku. Zostaje otworzone okno dialogowe do wyboru pliku, następnie należy sprawdzić, czy plik został wybrany, czy naciśnięto przycisk „anuluj” lub pojawił się inny błąd, co spowodowało, że zmienna jest pusta. Wtedy można wyświetlić stosowny komunikat lub zakończyć działanie programu. Jeśli nie ma błędu, można zacząć pracę z zawartością pliku. W powyższym kodzie tego sprawdzenia dokonuje funkcja wybierz_plik(File wybrany_plik). Wczytywać dane można z wielu innych formatów plików oraz źródeł – wystarczy zajrzeć do dokumentacji lub przejrzeć dodatkowe biblioteki. Często wykorzystywany jest format XML.
Linijka 27‑35
Zanim wybierzemy plik, należy zdefiniować funkcję, która będzie obsługiwać ewentualne błędy przy wczytywaniu oraz będzie decydować jak plik zostanie wykorzystany. W powyższym przykładzie, jeśli wystąpi błąd, kończone jest działanie programu. Ścieżkę w postaci tekstu otrzymujemy wywołując wybrany_plik.getAbsolutePath(), natomiast sam plik wczytujemy podobnie jak w pierwszym sposobie, tutaj dostajemy nazwę pliku wywołując wybrany_plik.getName().
Wybierany plik również musi znajdować się w folderze projektu.
Linijka 13‑15
Zanim wykona się kolejne akcje, należy sprawdzić czy zmienna linie nie jest pusta, jeśli jest oznacza to, że plik nie został jeszcze wczytany. Po przypisaniu wartości zmiennej linie nie ma potrzeby, aby funkcja draw() wykonywała się w nieskończoność. Zastosujemy tu omawianą wcześniej metodę noLoop().
Linijka 16
Kolejne linie pliku zostaną wczytane jako osobne elementy tablicy typu String. Załóżmy, że każda linia zawiera dane oddzielone od siebie pewnym charakterystycznym znakiem, np. „:”. By uzyskać dostęp do poszczególnych treści (czyli rozdzielić linię na fragmenty oddzielone dwukropkami) można się posłużyć metodą splitTokens() podając jako parametr ciąg znaków do podziału oraz znak (lub znaki, bo możemy podać ich kilka naraz) podziału.
Linijka 17‑20
Wyświetlona zostanie zawartość tablicy daneLinii, wraz z odpowiadającymi im indeksami.
Linijka 22‑23
Najpierw należy podać nazwę pliku, który zostanie utworzony (jeśli taki plik już istnieje, zostanie nadpisany), natomiast daneLinii to tablica (tablica String[]), w której każdy element to kolejna linia pliku, który zapisujemy.
Podsumowanie
Doskonalenie umiejętności programowania wymaga czegoś więcej niż tylko przyswajania wiedzy teoretycznej. Dokumentacje i poradniki są doskonałym źródłem informacji, jednak prawdziwą biegłość zdobywa się poprzez praktykę – tworzenie własnych projektów. Proces ten bywa wymagający: pojawiają się problemy, które trzeba rozwiązać, oraz błędy, które należy poprawić. Nie zniechęcaj się jednak, bo każdy dzień poświęcony na praktykę czyni cię lepszym programistą. Dobrym początkiem może być przygotowanie przewodnika multimedialnego, wzbogaconego o obrazy, nagrania wideo i ścieżkę dźwiękową. Więcej szczegółów znajdziesz na następnej stronie, w materiale poświęconym tworzeniu przewodnika po największych miastach Polski.
W poniższym notesie zapisuj notatki lub ważne informacje dotyczące tego materiału.



