Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00321 007928 11008027 na godz. na dobę w sumie
Flash. Akademia matematycznych sztuczek. Wydanie II - książka
Flash. Akademia matematycznych sztuczek. Wydanie II - książka
Autor: , , Liczba stron: 272
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-0170-7 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> inne - programowanie
Porównaj ceny (książka, ebook, audiobook).

Tworzenie zaskakujących efektów graficznych

Jesteś programistą Flasha i szukasz nowych wyzwań? A może zastanawiasz się, czy matematyka, jaką poznałeś w szkole lub na studiach, może okazać się przydatna w projektach prezentacji flashowych? Jeśli chcesz stworzyć we Flashu coś nowego, świetnie się przy tym bawiąc, możesz wykorzystać w tym celu swoją wiedzę matematyczną. Fraktale, ciąg Fibonacciego, geometria trójwymiarowa, rachunek wektorowy -- to wszystko może stać się narzędziem, dzięki któremu uzyskasz zapierające dech w piersiach efekty graficzne.

Książka 'Flash. Akademia matematycznych sztuczek. Wydanie II' to zbiór projektów, których twórcy w ciekawy sposób wykorzystują znane zależności matematyczne. Czytając ją, dowiesz się, jak powstają hipnotyczne efekty wirujących kształtów geometrycznych oraz jak generować fraktalne krajobrazy i figury. Poznasz możliwości wykorzystania translacji wektorowych i macierzowych do konstruowania trójwymiarowych wykresów oraz brył. Nauczysz się także uwzględniać dynamikę w animacjach i symulować jej wpływ na animowane obiekty.

Przekonaj się, że matematyka wcale nie musi być żmudna i męcząca.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Flash. Akademia matematycznych sztuczek. Wydanie II Autorzy: Keith Peters, Manny Tan, Jamie MacDonald T³umaczenie: Piotr Cieœlak ISBN: 978-83-246-0170-7 Tytu³ orygina³u: Flash Math Creativity (Second edition) Format: B5, stron: 272 Tworzenie zaskakuj¹cych efektów graficznych • Jak stworzyæ trójwymiarowe wykresy? • Jak wykorzystaæ wzory matematyczne w programowaniu? • W jaki sposób zastosowaæ geometriê fraktaln¹ do generowania grafiki? Jesteœ programist¹ Flasha i szukasz nowych wyzwañ? A mo¿e zastanawiasz siê, czy matematyka, jak¹ pozna³eœ w szkole lub na studiach, mo¿e okazaæ siê przydatna w projektach prezentacji flashowych? Jeœli chcesz stworzyæ we Flashu coœ nowego, œwietnie siê przy tym bawi¹c, mo¿esz wykorzystaæ w tym celu swoj¹ wiedzê matematyczn¹. Fraktale, ci¹g Fibonacciego, geometria trójwymiarowa, rachunek wektorowy — to wszystko mo¿e staæ siê narzêdziem, dziêki któremu uzyskasz zapieraj¹ce dech w piersiach efekty graficzne. Ksi¹¿ka „Flash. Akademia matematycznych sztuczek. Wydanie II” to zbiór projektów, których twórcy w ciekawy sposób wykorzystuj¹ znane zale¿noœci matematyczne. Czytaj¹c j¹, dowiesz siê, jak powstaj¹ hipnotyczne efekty wiruj¹cych kszta³tów geometrycznych oraz jak generowaæ fraktalne krajobrazy i figury. Poznasz mo¿liwoœci wykorzystania translacji wektorowych i macierzowych do konstruowania trójwymiarowych wykresów oraz bry³. Nauczysz siê tak¿e uwzglêdniaæ dynamikê w animacjach i symulowaæ jej wp³yw na animowane obiekty. • Animowanie kszta³tów dwuwymiarowych • Faluj¹ca siatka • Tworzenie fraktalnych roœlin i krajobrazów • Wykorzystanie rekurencji • Efekty trójwymiarowe Przekonaj siê, ¿e matematyka wcale nie musi byæ ¿mudna i mêcz¹ca Wydawnictwo Helion ul. Koœciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl SpiS treści 1 JAMie MAcDONALD towardsUs (atak piłek) inLine (w jednej Linii) righttoLeft (prawy do Lewego) singrid (faLUjąca siatka) 2 GLeN rHODeS fLowers (kwiaty) traiLs (ścieżki) trees (drzewa) circLes (kółka) 3 DAViD HirMeS Lines (Linie) in and oUt of the grid (zwykła niezwykła siatka) springs (sprężystość) BLoBs (pLamy) 4 LiFArOS aLien message (wiadomość od oBcych) fLag (fLaga) 7 8 14 18 22 25 26 30 34 38 43 44 50 56 62 69 70 74 rainBow fLower (tęczowy kwiat) 78 stem generator (generator rośLin) 82 5 GABrieL MULZer fiBonacci fLower (kwiat fiBonacciego) particLes (cząsteczki) recUrsive pattern (wzór rekUrencyjny) sine co. (sinUs i spółka) 6 pAUL prUDeNce recUrsive (rekUrencja) swooping (Lot trzmieLa) circLing (zawijasy) stiLL (stop-kLatka) 7 Kip pArKer composeUr (kompozytor) paUse (przerwa) poLygon (wieLokąt) sine (sinUsoida) 8 JAreD tArBeLL iterative inspiration (inspiracja w iteracji) Lorenz attractors (atraktory Lorenza) recUrsive inspiration (inspiracja w rekUrencji) recUrsive circLes (rekUrencyjne kółka) 85 86 90 94 98 103 104 108 112 116 121 122 126 130 134 139 140 146 150 154  9 KeitH peterS dot grid (siatka pUnktów) 157 158 fractaL foLia (fraktaLne zarośLa) 162 wire-frame organic (organiczna siatka) hUngry ai (wygłodniała inteLigencja) 166 170 13 JD HOOGe terraforming (kształtowanie terenU) traiLing Lines (śLady) eLastic waves (eLastyczne faLe) phantom shapes (eteryczne kształty) 10 KeN JOKOL 175 14 MANUeL tAN 227 228 232 236 240 243 growing Lines (rosnące Linie) 176 coLor BLend (mieszanie Barw) 244 generative grid (mozaika) 182 spinner (śmigło) coLorsUck (wampir koLorów) 186 fLUid dynamics (faLowanie) 248 252 sqUares (kwadraty) 191 vortex vase (wirUjący pUchar) 256 261 262 270 11 tY LettAU 195 15 BrANDON WiLLiAMS pLotter (pLoter) DrOGOWSKAZY Lines (kreski) orBits (orBity) terra (ziemia) poLarity (opiłki) 12 pAVeL KALUZHNY BaLLs (piłki) rings (pierścienie) 3d text (napis 3d) 196 200 202 208 213 214 220 224  Skąd czerpać inspirację? Trudno jest udzielić jednoznacznej odpo- wiedzi na tak zadane pytanie. Często wpadam na ciekawe pomysły, obserwując rzeczy, które napotykam w moim najbliższym otocze- niu, i wykonując zwykłe, codzienne czynności: oglądając telewizję, filmy czy słuchając muzyki. Pracując we Flashu, często podejmuję próby naśladowania jakiegoś zjawiska lub sceny, którą zaobser- wowałem. Choć rozpoczynając swoje eksperymenty, zazwyczaj wyobrażam sobie pewien konkretny rezultat, do którego staram się dążyć, to w trakcie realizowania owego „głównego wątku” nie- mal zawsze zdarza mi się przypadkiem odkryć nowe, zaskakujące możliwości, które sprawiają, że otrzymuję w efekcie coś, czego zupełnie bym się nie spodziewał. Jamie Macdonald mieszka i pracuje w Londynie. jamie macdonald www.nooflat.nu j i a m e m a c d o n a d t y t u l l r o z d z i a u l  Kilka informacji na początek Każdy z projektów, które za chwilę omówię, będę rozpoczynał od tego sa- mego pliku wyjściowego. Dla wygody, aby uniknąć czterokrotnego powta- rzania tych samych opisów we wstępach do kolejnych eksperymentów, zrobię to tylko raz. Projekty, które przygotowałem, są stosunkowo nieskomplikowane. Opracowanie każdego z nich nie pochłonęło mi więcej jak kilka godzin, lecz uważam, że wyróżnia je elastyczność i spore możliwości: zwykła zmiana kilku parametrów może prowadzić do niemal całkowitego przeobrażenia uzyska- nego efektu. Wspólną cechą wszystkich projektów jest zastosowanie funkcji trygonometrycznych sinus i cosinus do animacji różnych obiektów, zanim więc przejdę do szczegółowego omawiania konkretnych efektów, chciałbym powiedzieć kilka słów o właściwościach tych funkcji. Zarówno sinusoida, jak i cosinusoida są krzywymi okresowymi i w przedziale od 0 do 360 stopni zmieniają swoją wartość w zakresie od 1 do –1 (na przykład sin 90 = 1, zaś sin 270 = –1). Jak łatwo zauważyć, cosinusoidę można potraktować jako szczególny przypadek sinusoidy przesunięty względem niej o pewną wartość. -1 Sinusoida 1 -1 Cosinusoida 1 90 180 270 360 90 180 270 360 Biorąc pod uwagę zakres wartości, jaki przyjmują funkcje sinus i co- sinus, w celu uzyskania oscylacji z przedziału od –10 do 10 wynik otrzy- many dla kolejnych argumentów należy mnożyć przez 10. Jeśli naszym celem byłoby uzyskanie oscylacji z przedziału od 0 do 40, to wartość funkcji trzeba byłoby mnożyć przez 20 i do uzyskanego w ten sposób rezultatu dodawać 20. Warto zauważyć, że ze względu na to, iż funkcje co- sinus i sinus są funkcjami okresowymi, to poza granicami podstawowego przedziału argumentów od (0 do 360 stopni) mają one taki sam przebieg, jak w obrębie tego zakresu. Oznacza to, że wartość funkcji sinus dla kąta wynoszącego 10, 370 czy 730 stopni będzie taka sama. Posługując się funkcjami trygonometrycznymi w programie Flash, na- leży pamiętać, że ich argumentami nie będą stopnie, lecz radiany — nie- co inna jednostka miary. Przed użyciem funkcji trygonometrycznych we Flashu trzeba zatem zadbać o przekształcenie wartości w stopniach na radiany, co zresztą jest stosunkowo proste:  360 stopni = 2*pi radianów 180 stopni = pi radianów 1 stopień = pi/180 radianów W celu przeliczenia stopni na radiany można użyć następującego wzoru: radians = degrees×Math.PI/180 To byłoby na tyle, jeśli chodzi o niezbędną wiedzę matematyczną. Przystąpię teraz do omawiania szablonu projektu, który posłuży jako punkt wyjścia do wszystkich dalszych eksperymentów. Przede wszystkim w pro- jekcie tym powinien znaleźć się klip o nazwie ball, który zawierać będzie czerwone kółko o wymiarach 42×42 piksele, umieszczone dokładnie pośrodku sceny. Klip ten powinien zostać wyeksportowany z biblioteki projektu z identyfikatorem ball. Wszystkie eksperymenty można będzie z powodzeniem zrealizować, używając tylko tego obiektu, jest jednak jeszcze jedna rzecz, którą zdecy- dowałem się umieścić w szablonie, a mianowicie funkcja umożliwiająca dynamiczną zmianę jasności klipu. Funkcję tę zdefiniowałem na głównej listwie czasowej projektu, nadając jej nazwę setBrightness. Opiera się ona na metodzie setTransform i można użyć jej w odniesieniu do dowolnego kolo- rowego obiektu, który narysujesz. Warto zauważyć, ze funkcję tę napisałem w taki sposób, by przyjmowała ona wyłącznie wartości dodatnie. Umieść następujący kod w pierwszej klatce głównej listwy czasowej projektu: function setBrightness(col:Color, brightness  Number):Void { var anum:Number = 100 - brightness; var bnum:Number = 255/100 * brightness; col.setTransform( {ra:anum, ga:anum, ba:anum,  rb:bnum, gb:bnum, bb:bnum, aa:100, ab:0} ); }; Szablon pliku jest gotowy. Podczas realizacji kolejnych projektów wy- starczy uzupełniać go o odpowiedni kod źródłowy, który należy umieścić w pierwszej klatce głównej listwy czasowej. towardsUs (atak piłek) Pierwszy efekt polega na generowaniu serii klipów, które stopniowo zwięk- szają swoje rozmiary, oscylując przy tym względem środka ekranu, by w pewnym momencie sprawić wrażenie przeniknięcia przez ekran monito- ra — wówczas znikają na dobre. Sercem całego projektu są dwie funkcje. Pierwsza z nich obsługuje zdarzenie onEnterFrame i służy do generowania klipów filmowych, zaś druga, o nazwie expand, powoduje ich powiększa- nie. Przypominam, że kod źródłowy projektu należy umieścić w pierwszej klatce głównej listwy czasowej. Oto on: var scaleMax:Number = 800; var fadeOut:Number = 0.93; var frequency:Number = 10; var colMin:Number = 0; var colMax:Number = 40; var colVariance:Number = colMax - colMin; function hRad(Void):Number { return 4 + Math.random(); } j l i a m e m a c d o n a d t o w a r d s U s ( a t a k p i ł e k ) function vRad(Void):Number { return 4 + Math.random(); } function vRadInc(Void):Number { return 0.1; } function hRadInc(Void):Number { return 0.1; } function lrSpeed(Void):Number { return 5 + Math.random() * 40; } function scaleUpSpeed(Void):Number { return 1.02; } function nooCol(Void):Number { return colMin + Math.random() * colVariance; } var depth:Number = 0; onEnterFrame = function () { if (Math.floor(Math.random() * frequency) == 0) { depth++; var noo:MovieClip = _root.attachMovie(“ball”, “ball”+depth, depth); var col:Color = new Color(noo); setBrightness(col, nooCol()); noo._x = -50; noo._y = -50; noo._xscale = noo._yscale = 10; noo.scaleSpeed = scaleUpSpeed(); noo.lrSpeed = lrSpeed(); noo.hRad = hRad(); noo.vRad = vRad(); noo.hRadInc = hRadInc(); noo.vRadInc = vRadInc(); noo.lr = 0; noo.onEnterFrame = _root.expand; } } function expand() { this.lr += this.lrSpeed; this.hRad += this.hRadInc; this.vRad += this.vRadInc; this._x = Stage.width / 2 + this.hRad * Math.sin(this.lr * Math.PI/180); this._y = Stage.height / 2 + this.vRad * Math.cos(this.lr * Math.PI/180); this._yscale = this._xscale *= this.scaleSpeed; this.swapDepths(Math.floor(this._xscale)); if (this._xscale _root.scaleMax) { this._alpha *= _root.fadeOut; if (this._alpha 3) { this.removeMovieClip(); } } } Zauważ, że większą część kodu napisałem w postaci funkcji, gdyż takie rozwiązanie jest moim zdaniem bardziej czytelne: jeśli cały kod podzielony zostanie na niewielkie, logiczne części, łatwiej będzie znaleźć w nim potrzebne fragmenty, zrozumieć jego działanie i zmodyfikować go. Spora liczba funkcji pozwala jednocześnie odwołać się do rozmaitych wartości i skorzystać z nich w razie potrzeby.   Najważniejsze zmienne i funkcje scaleMax — maksymalny rozmiar klipu przed zaniknięciem, fadeout — szybkość zanikania, frequency — częstotliwość tworzenia nowych klipów, colMin — minimalna jasność, colMax — maksymalna jasność, colVariances — zróżnicowanie jasności, lr — wartość definiująca położenie piłki na sinusoidzie lub cosinusoidzie; im szybciej rośnie ta wartość, tym gwałtowniejsze będą oscylacje piłek, hRad — wartość oscylacji względem punktu środkowego w kierunku poziomym, vRad — wartość oscylacji względem punktu środkowego w kierunku pionowym, hRadInc — przyrost oscylacji w kierunku poziomym, vRadInc — przyrost oscylacji w kierunku pionowym, lrSpeed — szybkość oscylacji, scaleUpSpeed — szybkość, z jaką zwiększa się wielkość obiektu, nooCol — jasność poszczególnych klipów, noo — nazwa bieżącego obiektu. Omówię teraz działanie funkcji onEnterFrame oraz expand. Funkcja powiązana ze zdarzeniem onEnterFrame wywoływana jest w każdej klatce klipu, a jej działanie rozpoczyna się od wygenerowania losowej liczby całkowitej z przedziału od zera do wartości zawartej w zmiennej frequency (zadekla- rowanej wcześniej). Jeśli otrzymana liczba będzie miała wartość zero, to przy użyciu metody attachMovie utworzona zostanie nowa kopia klipu ball. W następnym kroku funkcja onEnterFrame powoduje umieszczenie tego klipu w odpowiednim miejscu na scenie i nadaje mu odpowiednią jasność i rozmiar. Ponadto w obrębie tej funkcji wywoływane są kolejne funkcje decydujące o wyglądzie i parametrach utworzonej kopii klipu ball. Na koniec funkcja przekazuje uchwyt zdarzenia onEnterFrame funkcji expand, którą omówię za chwilę. Dzięki takiemu rozwiązaniu za każdym razem, gdy w obrębie funkcji expand nastąpi odwołanie do parametru this._x, będzie ono dotyczyło współrzędnej x tej kopii klipu z piłką, w której to odwołanie nastąpiło. W funkcji expand mają miejsce wszystkie ważniejsze obliczenia, jakie wykonywane są podczas odtwarzania filmu. Przede wszystkim następuje w niej zwiększenie wartości decydujących o charakterze oscylacji — lr, hRad oraz vRad. Jak widać, w wyrażeniach odwołujących się do parametrów _x oraz _y klipu wykorzystane są funkcje trygonometryczne. Wartość tych parametrów obliczana jest na podstawie bieżącej wartości zmiennych hRad i vRad, po- mnożonej przez sinus lub cosinus wyrażenia opierającego się na zmiennej lr. Prócz tego w omawianych wyrażeniach uwzględnione są też współrzędne środka sceny. Jak wspomniałem we wstępie, sinus dowolnego kąta osiąga wartości z przedziału od –1 do 1, a zatem wartość obliczonej w ten sposób współrzędnej x klipu mieści się w granicach wyznaczonych z jednej strony przez wartość parametru stage.width pomniejszoną o zmienną hRad, z drugiej zaś przez wartość parametru stage.width powiększoną o tę samą zmienną. Dzięki właściwościom funkcji sinus położenie klipu w osi poziomej będzie płynnie zmieniać się pomiędzy tymi dwoma granicami. Klip jest następnie proporcjonalnie skalowany na podstawie wartości parametru scaleSpeed, a na koniec — jeśli w wyniku skalowania osiągnięty został zakładany rozmiar maksymalny — stopniowo zmniejszana jest jasność obiektu. Obiekt jest usuwany ze sceny dopiero w chwili, gdy jest niemal przezroczysty, aby zapobiec jego nagłemu zniknięciu z ekranu. 10 towardsUs2 W tej wersji efektu postanowiłem zmienić sposób animacji obiektu tak, by zamiast oscylować względem wspólnego środka, piłki po prostu gwałtownie przybliżały się do oglądającego. Przy okazji przyspieszyłem ich animację, by całość sprawiała lepsze wrażenie i była bardziej dynamiczna. Pozostałe mody- fikacje to już czysto kosmetyczne poprawki. Oto lista zmian, które wprowadzi- łem w znanym Ci już kodzie: var scaleMax:Number = 600; var frequency:Number = 5; var colMax:Number = 90; function hRad(Void):Number { return 0; } function vRad(Void):Number { return 0; } function vRadInc(Void):Number { return 0; } function hRadInc(Void):Number { return 0; } function scaleUpSpeed(Void):Number { return 1.2; } towardsUs3 W tym wariancie oscylacje piłek są stałe, a nie — jak w pierwszej wersji projektu — narastające. Skróciłem też czas, po którym piłki znikają z ekra- nu, otrzymując w ten sposób dynamiczny efekt polegający na wirowaniu gwałtownie przybliżających się obiektów. var fadeOut:Number = 0.7; function hRad(Void):Number { return 40; } function vRad(Void):Number { return 40; } towardsUs4 W tej wersji piłki pojawiają się na ekranie „znikąd”, by zataczając coraz szersze, spiralne kręgi, zniknąć za jego krawędziami. var scaleMax:Number = 400; function hRad(Void):Number { return 0; } function vRad(Void):Number { return 0; } function vRadInc(Void):Number { return 5; } function hRadInc(Void):Number { return 5; } j l i a m e m a c d o n a d t o w a r d s U s ( a t a k p i ł e k ) 11 towardsUs5 W tym wariancie postanowiłem przemieszczać klipy jedynie w kierunku poziomym; nieprzerwany strumień piłek już po chwili zajmuje całą sze- rokość ekranu. var frequency:Number = 2; function vRadInc(Void):Number { return 0; } function hRadInc(Void):Number { return 20; } towardsUs6 Tym razem postanowiłem nieznacznie zmniejszyć dynamikę animacji. Piłki poruszają się bardziej leniwie, przemieszczając się pomiędzy bocz- nymi krawędziami sceny, by wreszcie zniknąć w chwili, gdy nabiorą od- powiednich rozmiarów. function hRadInc(Void):Number { return 5 * Math.random(); } function lrSpeed(Void):Number { return 3 + Math.random() * 3; } function scaleUpSpeed(Void):Number { return 1.05; } towardsUs7 W kolejnej odmianie omawianego efektu postanowiłem ponownie poek- sperymentować z ruchem spiralnym, tym razem jednak — dzięki temu, że zrezygnowałem z wartości losowych — wszystkie kółka podążają w przybliżeniu tym samym torem. var scaleMax:Number = 900; var frequency:Number = 10; var colMax:Number = 20; function vRadInc(Void):Number { return 1.5; } function hRadInc(Void):Number { return 1.3; } function lrSpeed(Void):Number { return 10; } function scaleUpSpeed(Void):Number { return 1.1; } 12 towardsUs8 W tym wariancie kółka bardzo szybko zbliżają się do oglądającego. var colMin:Number = 70; var colMax:Number = 90; function hRad(Void):Number { return 5; } function vRad(Void):Number { return 25; } function vRadInc(Void):Number { return 0; } function hRadInc(Void):Number { return 0; } function lrSpeed(Void):Number { return 40; } towardsUs9 W tym eksperymencie zwiększyłem szybkość poziomych oscylacji klipu w taki sposób, że kółka wydają się pojawiać w trzech wyraźnie określo- nych punktach na ekranie. function hRad(Void):Number { return 300; } function vRad(Void):Number { return 9; } function lrSpeed(Void):Number { return 60; } towardsUs10 Ostatnia odmiana tego projektu różni się od poprzednich zmniejszoną dy- namiką poziomych oscylacji i wytłumieniem szybkości animacji. Dzięki temu piłki poruszają się po łagodniejszej, szerszej spirali. function hRad(Void):Number { return 200; } function vRadInc(Void):Number { return 1; } // szybkość, z jaką rośnie pozioma składowa // oscylacji function hRadInc(Void):Number { return 1; } // szybkość oscylacji function lrSpeed(Void):Number { return 10 + Math.random() * 10; } j l i a m e m a c d o n a d t o w a r d s U s ( a t a k p i ł e k ) Omówiony projekt można modyfikować na wiele różnych sposobów. Interesujące efekty da się uzyskać choćby poprzez zmianę niektórych pa- rametrów: warto wypróbować warianty polegające na oscylacji wyłącznie względem osi x, podjąć próbę uzyskania dynamicznej zmiany szybkości oscylacji w trakcie „życia” pojedynczego klipu, zaprogramować zmianę przezroczystości tak, by odbywała się ona wcześniej, czy spowolnić tem- po skalowania klipów. Prócz tego warto zastąpić funkcje sinus i cosinus innymi funkcjami trygonometrycznymi — na przykład funkcją tangens — by przekonać się, jaki wpływ będzie miała taka zmiana na trajektorie ruchu piłek. 13 inLine (w jednej linii) Efekt ten polega na cyklicznych zmianach wielkości obiektów ułożonych w jednej linii. Zmiany te obliczane są przy użyciu funkcji sinus, a początkowa wielkość każdego obiektu (wynikająca z wartości kąta będącego argumentem funkcji) uzależniona jest od jego odle- głości od wybranego punktu sceny. Cykliczne zmiany wszystkich obiektów w linii tworzą efekt fali — „reakcji łańcuchowej” — przesuwającej się od środka na zewnątrz linii. Podobnie jak poprzednio, cały kod źródłowy powinien zostać umieszczony w pierwszej klatce głównej listwy czasowej (wraz z funkcją setBrightness, o której mówiłem na wstępie): var hsp:Number = 4; var total:Number = 70; var twidth:Number = (total-1)*(hsp); var brmin:Number = 0; var brmax:Number = 40; function inc(val:Number):Number { return 3; } function colinc(val:Number):Number { return 4; } function yMag(val:Number):Number { return 1; } function minScale(val:Number):Number { return 1; } function maxScale(val:Number):Number { return 12; } function startDegree(val:Number) { return 3 * val; } for(var i:Number = 0; i total; i++) { var noo:MovieClip = _root.attachMovie(“ball”, “ball”  + i, i); var offset:Number = Math.abs((total / 2) - i); noo._y = Stage.height / 2; noo._x = (Stage.width - twidth) / 2 + hsp * i; noo.baseY = Stage.height / 2; noo._xscale = noo._yscale = minScale(); noo.inc = inc(offset); noo.colinc = colinc(offset); noo.col = new Color(noo); noo.brmin = brmin; noo.brmax = brmax; noo.degree = noo.coldegree = startDegree(offset); noo.brvariation = noo.brmax - noo.brmin; noo.yMag = yMag(offset); noo.minScale = minScale(offset); noo.maxScale = maxScale(offset); noo.variation = noo.maxScale - noo.minScale; noo.onEnterFrame = oscillate; } 14 function oscillate(Void):Void { this.degree += this.inc; var value:Number = Math.sin(this.degree * Math.PI/180); this._xscale = this._yscale = this.minScale + (this.variation/2)  + (this.variation/2) * value; this.coldegree += this.colinc; var value2:Number = Math.sin(this.coldegree * Math.PI/180); var brightness:Number = this.brmin + (this.brvariation/2) + (this.brvariation/2) * value2; setBrightness(this.col, brightness); this._y = this.baseY + value2 * this.yMag; } Najważniejsze zmienne i funkcje hsp — odstęp pomiędzy obiektami na osi x, total — całkowita liczba obiektów, twidth — całkowita szerokość łańcucha obiektów, brmin — minimalna jasność, brmax — maksymalna jasność, inc — szybkość zmian wielkości, colinc — szybkość zmian jasności, yMag — dynamika oscylacji w pionie, minScale — minimalna wielkość obiektu, maxScale — maksymalna wielkość obiektu, variation — różnica pomiędzy wartościami parametrów minScale i maxScale, brvariation — różnica pomiędzy wartościami parametrów brmin i brmax, startDegree — kąt początkowy dla każdego obiektu, offset — odległość od punktu odniesienia (środka sceny), noo — nazwa bieżącego obiektu, degree i coldegree — liczniki, value — sinus kąta wyrażonego parametrem degree, value2 — sinus kąta wyrażonego parametrem coldegree. Zwróć uwagę, że niektóre z wymienionych funkcji przyjmują argument o nazwie val, który określa odległość każdego obiektu od środka sceny. Ponieważ w przypadku tego projektu argumentem tym jest zawsze zmienna offset, wartości te możesz traktować jako tożsame. W tej wersji projektu niepotrzebna okazała się funkcja onEnterFrame, gdyż parametry poszczególnych klipów definiowane są na samym początku działania programu, a potem animacja niejako „dzieje się sama”. Wystarczy rozmieścić poszczególne klipy przy użyciu pętli i powiązać uchwyt zdarzenia onEnterFrame każdego z nich z funkcją oscillate. W funkcji tej następuje cykliczne zwiększenie wartości dwóch zmiennych — liczników — degree i coldegree. Liczniki te stanowią argumenty funkcji sinus, która wykorzystana została do obliczenia jasności i wielkości poszczególnych obiektów. j i a m e m a c d o n a d i n L n e ( w i l j e d n e j l i n i i ) 15 inLine2 Po wprowadzeniu następujących zmian odstępy pomiędzy obiektami ulegną zmniejszeniu, dzięki czemu łańcuch obiektów będzie sprawiał bar- dziej jednolite, spójne wrażenie. inLine5 Tym razem zmodyfikowałem sposób obliczania wielu różnych wartości, w tym również definicję funkcji startDegree, dzięki czemu poszczególne obiekty są bardziej rozproszone i przestają sprawiać wrażenie jednolitej konstrukcji. var hsp:Number = 3; function inc(val:Number):Number { return 10; } function colinc(val:Number):Number { return 40; } function minScale(val:Number):Number { return 10; } function maxScale(val:Number):Number { return 24; } inLine3 W tym wariancie łańcuch obiektów jest nieco grubszy i bardziej sprężysty; nieco silniej został też zaakcentowany efekt fali. function yMag(val:Number):Number { return 3; } function minScale(val:Number):Number { return 20; } function maxScale(val:Number):Number { return 30; } function startDegree(val:Number) { return 9 * val; } inLine4 W tej wersji skorygowałem sposób obliczania wartości funkcji inc, aby uzyskać bardziej dynamiczny, pulsujący efekt, a jednocześnie zmniejszy- łem „sprężystość” łańcucha. function inc(val:Number):Number { return 3 * val; } function yMag(val:Number):Number { return 0; } function startDegree(val:Number) { return 5 * val; } function inc(val:Number):Number { return 10 * val; } function yMag(val:Number):Number { return 3 * val; } function minScale(val:Number):Number { return 10; } function maxScale(val:Number):Number { return 20; } function startDegree(val:Number) { return 35 * val; } inLine6 W tej wersji, dzięki całkowitej zmianie sposobu obliczania wartości zwra- canej przez funkcje startDegree i yMag (zastosowałem dzielenie za- miast mnożenia), uzyskałem efekt o zupełnie odmiennym charakterze. var hsp:Number = 4; var total:Number = 50; function yMag(val:Number):Number { return 30 / (val / 3); } function startDegree(val:Number) { return 35 / val; } inLine7 I ponownie prosty łańcuch obiektów, tym razem jednak w postaci szybko pulsującej fali. function yMag(val:Number):Number { return 0; } function maxScale(val:Number):Number { return 30 + 10 / (val / 3); } function startDegree(val:Number) { return val; } Podobnie jak w przypadku poprzedniego projektu, wystarczy zmiana wybranych parametrów lub sposobu obliczania wartości zwracanych przez niektóre funkcje, by całkowicie zmienić charakter otrzymanego efektu. Pomijając opisane warianty, projekt ten można przekształcić na szereg rozmaitych sposobów: na przykład przenieść punkt odniesienia służący do obliczania położenia każdego z obiektów ze środka na lewą stronę sceny i uzależnić od niego dynamikę oscylacji obiektów. 16 j i a m e m a c d o n a d i n L n e ( w i l j e d n e j l i n i i ) 1 [2] [3] [4] [5] [6] [7] przeciwprostokątna (c) kąt przyprostokątna przyległa do danego kąta (b) rightToLeft (prawy do lewego) Efekt ten polega na utworzeniu pewnej liczby kółek wirujących wokół punk- tu, który przemieszcza się od prawej do lewej strony ekranu, nieznacznie oscylując przy tym w górę i w dół. Pionowa składowa ruchu tego punktu obliczona zostanie w sposób analogiczny jak w przypadku poprzedniego efektu: na podstawie sinusa parametru, którego wartość będzie cyklicznie zwiększana. W celu uzyskania wrażenia ruchu wirowego trzeba będzie użyć funkcji sinus i cosinus w nieco inny sposób. Otóż dla dowolnego okręgu można wyliczyć współrzędne x oraz y dowolnego punktu leżącego na jego obwodzie, jeśli tylko znany jest promień tego okręgu i kąt, pod jakim punkt ten jest położony względem jego środka. Współrzędne te można obliczyć na podstawie właściwości trójkąta prostokątnego, którego wierzchołki wy- znaczone są przez środek okręgu oraz szukany punkt, znajdujący się na jego obwodzie (patrz rysunek). Przełożone na język Flasha wzory umożliwiające obliczenie współ- rzędnych punktu wyglądają następująco: xposition = radius * Math.cos(degrees*Math.PI/180) yposition = radius * Math.sin(degrees*Math.PI/180) Teraz można już przystąpić do programowania. Oto kod, który należy umieścić w pierwszej klatce głównej listwy czasowej projektu: l i ł a g e w c e z r p a n t ą k o t s o r p y z r p ) a ( a t ą k o g e n a d o d sinus (kąt) = a / c a = sinus (kąt) * c cosinus (kąt) = b / c b = cosinus (kąt) * c W celu znalezienia współrzędnych punktu na obwodzie okręgu można wykorzystać właściwości trójkąta prostokątnego. Dla przykładowego okręgu pokazanego na rysunku wartości współrzędnych x i y punktu wskazanego na obwodzie należy obliczyć w następujący sposób: współrzędna x = cosinus (40) * 100 = 76 współrzędna y = sinus (40) * 100 = 64 var frequency:Number = 30; var colMin:Number = 0; var colMax:Number = 50; var colVariance:Number = colMax - colMin; function leftRightSpeed(Void):Number { return -2; } function maxScale(Void):Number { return 120; } function minScale(Void):Number { return 60; } function leftRightRadius(Void):Number { return 150; } function circlingSpeed(Void):Number { return 5; } function circleStartPoint(Void):Number { return 0; } function upDownRange(Void):Number { return 10; } function yFreqInc(Void):Number { return 12; } 1 function nooCol(val):Number { val *= 30; return colMin + colVariance * 0.5 + (0.5 *  colVariance) * Math.sin(val * Math.PI / 180); } var g:Number = 0; var depth:Number = 0; onEnterFrame = function(Void):Void { g++; if (g frequency) { g = 0; depth++; var noo = attachMovie(“ball”, “ball”  + depth, depth); noo._y = Stage.height / 2; noo.fulcrumX = noo._x = Stage.width + 30; noo.maxScale = maxScale(); noo.minScale = minScale(); var col:Color = new Color(noo); setBrightness(col, nooCol(depth)); noo.variance = noo.maxScale - noo.minScale; noo.acrossRadius = leftRightRadius(); noo.upDownRange = upDownRange(); noo.degree = circleStartPoint(); noo.degreeInc = circlingSpeed(); noo.yFreq = 0; noo.yFreqInc = yFreqInc(); noo.leftRightSpeed = leftRightSpeed(); noo.onEnterFrame = shootMeAcross; } }; function shootMeAcross(Void):Void { this.fulcrumX += this.leftRightSpeed; this.degree += this.degreeInc; this._x = this.fulcrumX+Math.cos(this.degree * Math.PI / 180) * this.acrossRadius; this._xscale = this._yscale = this.minScale+(this.variance * 0.5) + (this.variance * 0.5)  * Math.sin(this.degree * Math.PI / 180); this.yFreq += this.yFreqInc; this._y = Stage.height / 2 + this.upDownRange * Math.sin(this.yFreq * Math.PI / 180); this.swapDepths(Math.floor(this._xscale)); if (this._x -40) { this.removeMovieClip(); } } Najważniejsze zmienne i funkcje frequency — częstotliwość tworzenia nowych obiektów, colMin — minimalna jasność obiektu, colMax — maksymalna jasność obiektu, colVariance — zróżnicowanie jasności, leftRightSpeed — szybkość, z jaką przemieszczają się obiekty w poprzek ekranu, maxScale — maksymalna wielkość obiektu, minScale — minimalna wielkość obiektu, leftRightRadius — promień okręgu, po którym poruszają się obiekty, circlingSpeed — szybkość, z jaką obiekt porusza się po okręgu, circleStartPoint — punkt początkowy, w którym obiekt rozpoczyna ruch po okręgu, upDownRange — zasięg oscylacji w kierunku pionowym, yFreqInc — szybkość oscylacji w kierunku pionowym, nooCol —jasność poszczególnych obiektów; zwiększenie wartości parametru val spowoduje przyspieszenie oscylacji kolorów, noo — nazwa bieżącego obiektu, fulcrumX — punkt, wokół którego obracają się obiekty; zmiana położenia tego punktu powoduje przesunięcie całego wirującego „układu”. Większość obliczeń odbywa się w funkcji shootMeAcross, która powiązana jest z uchwytem zdarzenia onEnterFrame każdego klipu. Działanie tej funkcji rozpoczyna się od przesunięcia punktu, wokół którego orbituje klip, po czym następuje zwiększenie wartości parametru degree, który odpo- wiada za uzyskanie ruchu wirowego. Zwiększana jest również wartość parametru yfreq, od którego uzależnione jest położenie obiektu względem osi y. Współrzędna x obiektu obliczana jest na podstawie cosinusa wartości parametru degree, zaś wielkość tego obiektu — na podstawie sinusa tego samego parametru (zmiana wielkości obiektu zastępuje użycie parametru y i ma imitować efekt jego przybliżania się i oddalania od ekranu, zaś samo kółko — będąc obiektem dwuwymiarowym — zwrócone jest cały czas tą samą stroną do oglądającego). Po wykonaniu tych obliczeń na podstawie parametru yfreq ustalana jest wartość współrzędnej y, która decyduje o sposobie oscylacji obiektu w górę i w dół. Ostatni fragment funkcji shootMeAcross powoduje usunięcie klipu, który znalazł się poza lewą krawędzią ekranu. j l i a m e m a c d o n a d r i g h t T o L e f t ( p r a w y d o l e w e g o ) 1 rightToLeft2 Dzięki dużej zmianie wartości parametru upDownRange w tej wersji efektu zasięg pionowych oscylacji obiektów został znacznie zwiększony. Zmiana ta miała na celu uzyskanie jeszcze lepszego złudzenia trójwymiarowej przestrzeni, w której poruszają się obiekty. rightToLeft4 W tym wariancie zmodyfikowałem sposób skalowania oraz wartość zwracaną przez funkcję upDownRange, by obiekty ułożyły się w bardziej jednolity, niemal płaski łańcuch, poprzerywany tu i ówdzie niewielkimi szczelinami. function leftRightRadius(Void):Number { return 50; } function circlingSpeed(Void):Number { return 10; } function upDownRange(Void):Number { return 70; } function yFreqInc(Void):Number { return 4; } var frequency:Number = 4; function minScale(Void):Number { return 0; } function leftRightRadius(Void):Number { return 30; } function upDownRange(Void):Number { return 20; } function yFreqInc(Void):Number { return 1; } rightToLeft3 W tej wersji zwiększyłem liczbę obiektów, które wydają się teraz płynąć nieprzerwanym strumieniem. Nieznacznie zmodyfikowałem też ścieżkę, po której się poruszają. rightToLeft5 W tym przypadku zmieniłem wartości zwracane przez funkcje upDown- Range oraz yFreqInc, aby wpłynąć na trajektorię ruchu obiektów: tym razem poruszają się one po pętli przypominającej ósemkę. var frequency:Number = 3; function leftRightSpeed(Void):Number { return -3; } function maxScale(Void):Number { return 180; } function leftRightRadius(Void):Number { return 60; } function circlingSpeed(Void):Number { return 8; } var colMax:Number = 100; function maxScale(Void):Number { return 60; } function upDownRange(Void):Number { return 60; } function yFreqInc(Void):Number { return 10; } 20 j l i a m e m a c d o n a d r i g h t T o L e f t ( p r a w y d o l e w e g o ) rightToLeft6 I jeszcze inny wariant pętli. var colMax:Number = 20; function leftRightRadius(Void):Number { return 50; } function upDownRange(Void):Number { return 120; } function yFreqInc(Void):Number { return 5; } rightToLeft8 Nieznaczna modyfikacja kodu źródłowego pozwoliła na ujednolicenie trajektorii ruchu wszystkich obiektów; teraz układają się one w wijącego się węża. var frequency:Number = 2; function leftRightSpeed(Void):Number { return -3; } function maxScale(Void):Number { return 90; } function circlingSpeed(Void):Number { return 3; } function yFreqInc(Void):Number { return 10; } rightToLeft7 W tej wersji znacznie zmniejszyłem wartość zwracaną przez funkcję up- DownRange i poszerzyłem pętlę, po której poruszają się obiekty, by po- prawić głębię i plastyczność animacji. rightToLeft9 W ostatniej wersji efektu postanowiłem dodać trochę elementów loso- wych, które nadają całości nieco chaotyczny wygląd. var frequency:Number = 1; function leftRightSpeed(Void):Number { return -4; } function maxScale(Void):Number { return 40; } function leftRightRadius(Void):Number { return 80; } function circlingSpeed(Void):Number { return 5; } function upDownRange(Void):Number { return 19; } var frequency:Number = 3; function leftRightSpeed(Void):Number { return -2 - Math.random(); } function maxScale(Void):Number { return 120; } function upDownRange(Void):Number { return Math.random() * 50; } Opisany efekt można modyfikować na wiele różnych sposobów — wystarczy jedynie poeksperymentować z wartościami poszczególnych parametrów. Można na przykład zmieniać szybkość „wirowania” i szyb- kość przemieszczania się obiektów w poprzek ekranu, uzyskując w ten sposób rozmaite spirale i pętle. Warto też wypróbować możliwości, jakie daje zmiana kształtu poruszających się obiektów. 21 var row:Number = 0; var column:Number = 0; for (i=0; i total; i++) { var noo:MovieClip = attachMovie(“ball”, “circ” +  i, i); noo._x = bx + column * hsp; noo._y = by + row * vsp; noo.col = new Color(noo); var offset:Number = Math.abs(total / 2 - i); noo.myInc = increment(offset); noo.minScale = minScale(); noo.maxScale = maxScale(); noo.variance = noo.maxScale - noo.minScale; noo.minBrt = minBrt(); noo.maxBrt = maxBrt(); noo.colVariance = noo.maxBrt - noo.minBrt; noo.onEnterFrame = undulate; noo.degree = i * degInc * numberOfOscillations; column++; if (column == across) { column = 0; row++; } } function undulate(Void):Void { this.degree += this.myInc; var sinVal:Number = Math.sin(this.degree *  Math.PI/180); this._xscale = this._yscale = this.minScale +  (this.variance * 0.5) + (this.variance * 0.5)  * sinVal; var brightness:Number = this.minBrt +  (0.5 * this.colVariance) + (0.5 * this.  colVariance) * sinVal; setBrightness(this.col, brightness); sinGrid (falująca siatka) Ostatni efekt polega na cyklicznej zmianie koloru i jasności obiektów-kó- łek, ułożonych w postaci siatki. Stosując zmiany oparte na wartościach funkcji sinus i przypisując różne kąty początkowe sąsiadującym obiektom, w siatce takiej można wywołać efekt przypominający falę. Różnice po- między wartościami kątów dla sąsiadujących obiektów można obliczać w różny sposób, lecz niezależnie od tego, który z nich zostanie użyty, warto poczynić jedno istotne założenie: podzielić cały użyteczny zakres argumentów funkcji sinus — czyli 360 stopni — przez liczbę obiektów w siatce. Przypuśćmy, że siatka składa się z dziesięciu kółek; wówczas należałoby przypisać im następujące kąty początkowe: 36, 72, 108, 144, 180, 216, 252, 288 oraz 324 stopnie. Przy takim założeniu początkowa wartość funkcji sinus dla każdego obiektu będzie nieco inna, lecz różnice pomiędzy tymi wartościami podczas animacji całego układu (gdy sinus dla każdego obiektu będzie wahał się pomiędzy 1 a –1) będą stałe. Takie rozwiązanie stanowi klucz do uzyskania efektu fali, która rozpoczynać się będzie w prawym dolnym rogu siatki i stopniowo, rząd po rzędzie prze- mieszczać się będzie w górę. Jeśli zmodyfikujesz sposób obliczania kątów początkowych tak, by obejmowały połowę użytecznego zakresu argumen- tów funkcji sinus — czyli od 0 do 180 stopni — to zgodnie z intuicją uzy- skany efekt będzie odzwierciedlał jedynie połowę okresu funkcji sinus. Podobnie jak w przypadku poprzednich projektów, cały podany kod należy umieścić w pierwszej klatce głównej listwy czasowej przygotowa- nego wcześniej „szablonu”. var across:Number = 10; var down:Number = 10; var total:Number = across*down; var hsp:Number = 20; var vsp:Number = 20; var degInc:Number = 360 / total; var numberOfOscillations:Number = 1; var bx:Number = (Stage.width - hsp * across) / 2; var by:Number = (Stage.height - vsp * down) / 2; function increment(offset):Number { return 30; } function minScale(Void):Number { return 3; } function maxScale(Void):Number { return 54; } function minBrt(Void):Number { return 0; } function maxBrt(Void):Number { return 50; } 22 j i l a m e m a c d o n a d s i n G r i d ( f a u j ą c a s i a t k a ) l Najważniejsze zmienne i funkcje across — liczba kolumn, down — liczba rzędów, total — całkowita liczba obiektów, hsp — odstępy w poziomie, vsp — odstępy w pionie, degInc — liczba stopni przypadająca na każdy obiekt, obliczona na podstawie całko- witej liczby obiektów potrzebnej do wyświetlenia pełnej fali, numberOfOscillations — jaka część fali ma być jednocześnie wyświetlona na ekranie, bx — początkowe położenie względem osi x, by — początkowe położenie względem osi y, increment — szybkość przemieszczania się fali; do funkcji tej można przekazać ar- gument offset, odzwierciedlający odległość danego obiektu od wybranego punktu odniesienia siatki (początkowo możliwość ta nie jest wykorzystana, lecz zostanie zaim- plementowana w kolejnych wariantach projektu), minScale — minimalna wielkość obiektów, maxScale — maksymalna wielkość obiektów, minBrt — minimalna jasność obiektów, maxBrt — maksymalna jasność obiektów, column i row — bieżąca kolumna i wiersz siatki. Siatka generowana jest przy użyciu zwykłej pętli for, a następnie cyklicznie aktu- alizowana za pomocą funkcji undulate, w której zawarłem większą część wszystkich niezbędnych obliczeń. Funkcja ta jest stosunkowo prosta: jej działanie, podobnie jak w poprzednich projektach, polega na zwiększaniu wartości parametru degree i zmianie wielkości oraz jasności poszczególnych klipów w oparciu o tę wartość. sinGrid02 Ta prosta zmiana umożliwia uzyskanie pulsujących, dynamicznych fal. var numberOfOscillations:Number = 12; sinGrid03 Dalsze zwiększanie wartości parametru numberOfOscillations pozwala zmienić sposób pulsowania: fale rozchodzą się pionowo. var numberOfOscillations:Number = 21; sinGrid04 Zmniejszenie wartości wspomnianego parametru poniżej 1 sprawia, że w siatce pojawia się pojedynczy, poziomy impuls, biegnący od dołu do góry. var numberOfOscillations:Number = 0.5; [2] [3] [4] [5] [6] sinGrid05 Włączenie elementu losowego do sposobu obliczania wartości zwracanej przez funkcję increment sprawia, że efekt rozpoczyna się wprawdzie od pojedynczego impulsu, lecz zaraz potem przeradza się w niekontrolowany chaos. function increment(offset:Number):Number { return 10 * Math.floor(5 * Math.random()); } sinGrid06 Ponownie zmieniłem treść funkcji increment. Tym razem chciałem uzyskać płynną zmiany kierunku rozchodzenia się impulsów, używając zmiennej offset. function increment(offset:Number):Number { return 4 + offset; } 23 sinGrid07 W tym przypadku nadałem siatce kształt pionowego, wydłużonego pro- stokąta. var across:Number = 7; var down:Number = 14; var numberOfOscillations:Number = 100; function increment(offset:Number):Number { return 14 + offset / 20; } sinGrid08 W tej wersji postanowiłem po raz kolejny zmienić kształt siatki — tym razem jest ona bardzo wysoka i wąska. Parametry rozchodzenia się fali pozostały niezmienione. var across:Number = 5; var down:Number = 25; return 60; } function maxBrt(Void):Number { return 100; } sinGrid10 Zmniejszenie odstępów pomiędzy obiektami i jednoczesne powiększenie rozmiarów samych obiektów sprawiło, że przestały one wyglądać jak od- dzielne elementy siatki, lecz raczej jak bardziej złożone struktury, które rytmicznie pulsując, zmieniają zarówno swój kształt, jak i kolor. var hsp:Number = 7; var vsp:Number = 7; var numberOfOscillations:Number = .33; function minScale(Void):Number { return 45; } function maxScale(Void):Number { return 130; } [7] [8] [9] [10] sinGrid09 Postanowiłem przywrócić kwadratowy kształt siatki, tym razem jednak zmieniłem sposób zmiany jasności obiektów. var across:Number = 10; var down:Number = 10; var numberOfOscillations:Number = 3; function minScale(Void):Number { return 15; } function maxScale(Void):Number { Eksperymentując z tym efektem, możesz spróbować na przykład wyko- rzystać wartość parametru offset w taki sposób, by szybkość oscylacji wynikała z odległości poszczególnych obiektów od wybranego punktu od- niesienia: od środka siatki, od któregoś z jej narożników itp. Zmiana warto- ści parametru numberOfOscillations umożliwia uzyskanie rozmaitych odmian falowania i pulsowania. Warto zauważyć, że kierunek rozchodzenia się fali w dowolnym z uzyskanych efektów można odwrócić, odejmując przyrost kąta dla każdego obiektu od 360 (gdyż wartość otrzymana dla kąta 320 stopni będzie przeciwna niż dla kąta wynoszącego 40 stopni). 24
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Flash. Akademia matematycznych sztuczek. Wydanie II
Autor:
, ,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: