Zima, za oknem pada ¶nieg. Nieraz zapewne czytelnicy
widzieli w ró¿nych demkach, czy innych programach efekt padaj±cego
¶niegu zatrzymuj±cego siê na elementach obrazka. Kiedy¶ nie chcia³o
mi siê nic po¿ytecznego stworzyæ, i postanowi³em napisaæ coæ w tym
stylu.
Opiszê pokrótce sposób postêpowania przy tworzeniu wirtualnego ¶niegu:
Najpierw losujemy sobie pozycje x i y na ekranie pixelków, a tak¿e
ich prêdko¶ci. Operujemy na liczbach rzeczywistych (lub jak kto
woli z przecinkiem), aby ruch pixelka by³ p³ynny. Nale¿y równie¿
zadbaæ, aby pixel nie przeskoczy³ o 2 pola w dó³ (tzn. aby prêdko¶æ
nie by³a wiêksza od 0.9) bo wtedy dosz³yby nam dodatkowe warunki
czego raczej nie po¿±damy w naszym programie. Mogliby¶my losowaæ
punkty tylko w X, a Y zawsze ustawiæ na 0. Spowodowa³oby to jednak
nieestetyczny start i mog³oby doj¶æ do zapchania siê w górnej czê¶ci
ekranu przy ilo¶ci punktów ok. 1000. Wiêc musimy losowaæ na ca³ym
ekranie, ale uwaga nie mo¿emy postawiæ pixelka na kolorze, który
bêdzie je zatrzymywa³ (np, gdy kolorem który powoduje zatrzymanie
pixelka jest kolor 15, to nie mo¿emy wylosowaæ wspó³rzêdnych, które
wypadaj± na napisie w kolorze 15, a to dlatego ¿e pixel startuj±c
pozostawi³by po sobie dziurkê, a w rezultacie zamazanie napisu),
w tym celu przy losowaniu sprawdzamy sobie kolor.
Mamy ju¿ przygotowane tablice, mo¿emy zacz±æ ruch punktów. W pêtli
dla wszystkich pixelków po kolei sprawdzamy najpierw czy mo¿emy
poruszyæ siê jeszcze w dó³, czyli czy punkt pod nami jest w kolorze
innym ni¿ kolor zatrzymuj±cy. Je¿eli mo¿emy siê poruszyæ to kasujemy
pixel na starej pozycji i dodajemy szybko¶æ do aktualnej wspó³rzêdnej
Y. Po czym sprawdzamy czy nie wyskoczyli¶my poza ekran, je¿eli tak
to losujemy now± warto¶æ X punktu i do Y wpisujemy 0 (czyli zaczynamy
od góry) i na zakoñczenie rysujemy pixel w nowym miejscu kolorem
zatrzymuj±cym.
Wróæmy teraz do pierwszego rozga³êzienia. Czyli do momentu, w którym
sprawdzali¶my czy pod nami jest kolor zatrzymuj±cy. Je¶eli jest,
to nale¿y sprawdziæ czy nasz punkt mo¿e obsun±æ siê w prawo lub
w lewo (po stoku). Sprawdzamy czy mo¿emy siê obsun±æ w prawo, a
potem w lewo. Je¿eli nie mo¿emy siê obni¿yæ w ¿adn± ze stron, to
spoczywamy spokojnie na miejscu, w którym obecnie siê znajdujemy
i losujemy now± szybko¶æ oraz X i zaczynamy od nowa. Je¿eli mo¿emy
siê obsun±æ w lewo lub w prawo to kasujemy punkt na starej pozycji
zmieniamy X (w zale¿no¶ci od tego w któr± stronê siê obsuwamy) i
dodajemy znów szybko¶æ do Y, sprawdzamy czy nie wyl±dowali¶my poza
ekranem i stawiamy punkt w nowym miejscu. I cykl siê zamyka w kó³eczko.
To mniej wiêcej ca³a filozofia ¶niegu. Teraz jak to wygl±da w praktyce
(a raczej w Turbo Pascalu):
Program mo¿na na wiele sposobów ulepszyæ. Przyk³adowo mo¿na jako
t³o wstawiæ jaki¶ krajobraz (np. plik graficzny GIF) na którego
tle bêdzie pada³ ¶nieg. Innym pomys³em jest tzw. lepko¶æ, czyli
przyczepno¶æ do powierzchni podczas lotu), czy budowanie siê skarp
i pó¼niejsze ich obrywanie siê, itd. ...
Kod ¼ród³owy do artyku³u:
Efekt ¶niegu (1,49 KB)