[Android] Prędkość światła. Symulacja prędkości warpowej.


      Kod zaprezentowany w tym wpisie nie jest mój, ale właśnie ten kod postanowiłem przeanalizować i pokrótce wprowadzić was dzięki niemu w świat języka programowania jakim jest Processing. Języka wybitnie prostego, strasznie ułatwiającego naukę programowania głównie przez tworzenie wizualnych efektów oraz grafiki. Sam język rozwijany jest od 2001 roku, pierwotnie zakłada tworzenie aplikacji na PC, ale do tej pory rozwinął się do roli biblioteki JavaScript, Phytona oraz Androida. No to teraz pokażę wam co możemy z tego stworzyć. 



     Aby cokolwiek zacząć robić trzeba pobrać kompilator Processing oraz wtyczkę Processing for Android.

Proceccing >> https://processing.org/download/
Processing for Android >> http://android.processing.org/install.html


Całość jest banalnie prosta i nie powinna sprawić wam problemów. Wtyczka praktycznie instaluje się w całości sama. 



1. Struktura programu i kodowanie gwiazd.



   Gdy naszym oczom ukaże się upragnione okno kompilatora możemy zacząć kodować. Zaczynami od napisania dwóch najważniejszych funkcji w których cały program się odbywa.

void setup() - techniczne funkcje programu
void draw() - odpowiada za rysowanie i określanie co wyświetlamy 





Teraz zostawimy to na chwile i otworzymy nową kartę.





Nazwiemy ją Star. To będzie karta z klasą opisującą nasze małe gwiazdki.
Tworzymy w niej nową klasę.





Dodajemy w naszej klasie zmienne opisujące koordynaty naszych gwiazd. 






Teraz zbudujemy obiekt Star(), w której przypiszemy zmiennym losowe wartości, a w zasadzie zrobi to za nas wbudowana funkcja random(). 





Zmienne będą miały przypisywane losowe wartości od minus wielkości szerokości podzielonej przez 2 do wielkości szerokości podzielonej przez 2 (x) oraz minus wielkości wysokości podzielonej przez 2 do wielkości wysokości podzielonej przez 2 (y). Zmienna Z, która będzie naszym trzecim wymiarem, będzie miała przypisane losowe wartości wielkości szerokości podzielonej przez 2.   Czemu takie wartości zapytacie? Domyślnie program zaczynałby tworzyć gwiazdy z lewego górnego rogu, my chcemy żeby gwiazdy były tworzone z środka aplikacji(co zakodujemy później w funkcji Draw()), ale nadal chcemy żeby były tworzone regularnie, więc będą się tworzyły w całym zakresie od minus tych wartości do pełnych tych wartości. 

W takich chwilach Processing naprawdę błyszczy. Nie potrzeba nam importowania bibliotek ani kilku linijek kodu tylko po to aby przypisać zmiennej losową wartość. Wystarczy tylko słowo random, oraz zakres w nawiasie (-width/2, width/2). Dzięki temu możemy się skupić na strukturze programu.



    Teraz na chwilę przełączamy się na pierwszy plik, pierwszą kartę. 
Zadeklarujemy w niej teraz tablice naszych gwiazd, o nazwie stars oraz sam obszar roboczy aplikacji. 

tablica>> Star[] stars = new Star[800];





Teraz obszar roboczy:

Normalnie, dla aplikacji PC, deklarowali byśmy obszar funkcją size(); i w niej określali rozmiar okienka naszej aplikacji, np 400px na 400px.  size(400,400); ale z racji tego że to android i rozmiar każdego urządzenia się różni, użyjemy wbudowanej funkcji fullScreen(), która pobierze rozmiar urządzenia za nas i odpali aplikacje z rozmiarem pełnego ekranu. 





Wypełnimy teraz wcześniej utworzoną tablice stars, gwiazdami. Użyjemy do tego pętli for.


  for (int i = 0; i < stars.length; i++) {
    stars[i] = new Star();
  }
}

Tablica na całej długości wypełni się nowymi obiektami Star();


Taką samą pętlę utworzymy teraz w funkcji Draw(), z tą różnicą że tym razem dla każdej utworzonej gwiazdy będzie ona wywoływać nieistniejące jeszcze funkcje update() oraz show(). 

Ustaliliśmy również kolor tła funkcją background(), na 0-czyli czarny.

Oraz sprawiliśmy że środek aplikacji będzie na środku, zamiast lewego górnego rogu poleceniem 

  translate(width/2, height/2);







Teraz zajmiemy się stworzeniem tych dwóch funkcji.
Przechodzimy do drugiej karty i w niej deklarujemy te funkcje jako funkcje void. Czyli funkcje która nie zwraca żadnych danych. Tzw. "pustą".





 W funkcji show(), opiszemy jak nasz obiekt Star, będzie wyglądał. Mamy do tego gotowe narzędzia.

fill(255) - wypełni obiekt kolorem białym

noStroke() - sprawi że obiekt nie będzie miał obramowania
ellipse() - sprawi że obiekt będzie elipsą o losowych koordynatach x, y i promieniu 8px




Program w aktualnej formie wyświetli nam w losowych miejsach gwiazdy na czarnym tle. 





2. Kodowanie ruchu gwiazd.


Potrzebne nam będą do tego dwie zmienne- sx oraz sy.

  float sx = map(x / z, 0, 1, 0, width/2);

    float sy = map(y / z, 0, 1, 0, height/2);


Zmienne mają przypisane zmapowane wartości x podzielonego przez z oraz y podzielonego przez z. 

Przypisujemy te wartości do naszych gwiazd: 
 ellipse(sx,sy,8,8);




W funkcji update(), będziemy teraz odejmować 10 od wartości naszej głębi Z, to sprawi, że gwiazdy zaczną się poruszać. 

z=z-10;

Zostaje jeszcze bardzo ważna kwestia. Co jeśli wartość Z dotrze do zera? Wartość trzeciego wymiaru nie może być ujemna, program się wtedy wysypie. Jest do tego proste rozwiązanie. 

Jeśli wartość Z<1, zresetujemy nasze koordynaty. 

 if (z < 1) {
      z = width/2;
      x = random(-width/2, width/2);
      y = random(-height/2, height/2);

    }


Gwiazdy już się poruszają, ale wygląda to strasznie sztucznie. Dobrym rozwiązaniem jest zakodowanie gwiazd w taki sposób, że gdy będą daleko-będą małe, zbliżając się do nas-będą się powiększać. Nadal to realizmu.  


Wystarczy do tego jedna dodatkowa zmienna "r". Mapująca zmienną "z" w taki sposób, że przy końcu wielkości width jej rozmiar to 0, a gdy się do nas przybliża, tym samym, gdy wartość width dociera do zera, jej rozmiar się zwiększa do 16.  

float r = map(z, 0, width/2, 16, 0);







W zasadzie mamy już gotową symulacje prędkości warpowej.


3. Kontrolowanie prędkości.

Możemy jeszcze dodać dwa fajne i proste efekty do naszej symulacji- ogony gwiazd, oraz kontrolowanie prędkości dotykiem.


Dla prędkości wystarczy zrobić globalną funkcje speed, zmapować ją w funkcji Draw() w taki sposób, aby przyjmowała wartość współrzędnych naszego dotknięcia i odjąć ją od wartości zmiennej Z w funkcji update()




W ten sposób jeśli dotkniemy ekranu z lewej strony, gwiazdy będą leciały wolniej, analogicznie, z prawej-szybciej.


Hexslav

Wpis jest analizą kodu w napisanego przez Daniel Shiffman podczas Coding Challenge w serwisie YT.

https://www.youtube.com/watch?v=17WoOqgXsRM 




Komentarze

Popularne posty z tego bloga

Przejmowanie kontroli nad Androidem. ParrotOS/armitage.

Zamek centralny w polonezie za cenę przesyłki.

Czy naprawa poloneza szarą taśmą to dobry pomysł? Problem z autem w Boże Narodzenie 200km od domu.