Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Zátiší u potoka

Petr se vydal na ryby, aby si užil ticha a pohody. A my si užijeme trochy matematiky.

Už jste někdy seděli u vody, dívali se na vodu a přemýšleli, co dělá vodu vodou, proč se obraz na vodě tak vlní a jak tento působivý efekt napodobit?

Nejdříve si představme hladinu vody jako rovnou plochu. Každému je jasné, že v této chvíli se chová jako zrcadlo, kdy vidíme obraz pozadí přesně stejně, pouze "vzhůru nohama". Představme si, že hladina se začne vlnit vlnami rovnoběžnými s naším horizontem. Pomyslné paprsky pohledu, vycházející z našeho oka, se začnou modulovat funkcí sinus kolem původní střední polohy, stejně jako se moduluje povrch hladiny. Navíc s rostoucí vzdáleností jsou vlny na pohled čím dál menší.

Vše, co tedy potřebujeme k simulaci vodní hladiny, je vykreslování obrazu pozadí po linkách s tím, že linky jsou vychylovány sinusovou funkcí, jejíž perioda se s rostoucí vzdáleností zkracuje a rozkmit zmenšuje.

Založte si nový program s názvem Hladina. Vymažte prázdné políčko průhlednou barvou, tím zajistíte zviditelnění grafické plochy.

Budeme potřebovat obrázek pozadí břehu řeky. Můžete použít obrázek z příkladu, je ke stažení spolu s ostatní grafikou a zvuky na konci lekce. Vložte ho do progamu, může se jmenovat pozadí. Obrázek by měl mít šířku 20 kroků a výšku 8 kroků. Dále budeme potřebovat zvuky přírody. Opět můžete použít ty ukázkové které si stáhnete. A nakonec obrázek kačera a kachny, kteří budou plavat po hladině, též ke stažení.

Obrázky a zvuky uložte do pole Společných proměnných. Přípravte seznam náhodných zvuků. Bude mít pouze jednu položku - náhodný zvuk. Dále připravte datové proměnné pro program. Prvek ukazatel fáze animace hladiny bude sloužit k animaci vlnění hladiny. Prvek vzdálenost linky od břehu je pomocná proměnná používaná při animaci hladiny pod kačerem a kachnou. Prvek souřadnice Y břehu je konstanta vypočtená na začátku programu a představuje souřadnici Y, od které se zobrazí obrázek pozadí. Prvek modulace linky je pomocná pracovní proměnná představující odchylku kreslené linky od lineárního zrcadlového obrazu. Prvek vykreslovaná linka je ukazatel souřadnice linky během vykreslování linek hladiny.

Kromě uvedených proměnných si připravte ještě proměnné pro kreslení kačera a kachny. Prvky souřadnice X kačera a souřadnice Y kačera představují souřadnice obrázku kačera v okně. Příznak kačer je v pohybu indikuje, že kačer je viditelný a pluje po hladině. Příznak kačer směr doprava udává, zda kačer pluje zleva doprava nebo obráceně. Prvek současný obrázek kačera je obrázek kačera buď v původním tvaru (zleva doprava) nebo zrcadlově obrácený (zprava doleva). Obdobné proměnné jsou pro kachnu.

Na začátku programu si připravíme skupinu inicializace programu. Obsah vidíte na obrázku níže. Petříka vypneme, nebudeme ho používat. Uložíme náhodné zvuky do seznamu náhodných zvuků. Pro ten účel nastavíme počáteční index seznamu na 0 a automatickou inkrementaci na 1. Po naplnění seznamu navrátíme automatickou inkrementaci na 0. Připravíme souřadnici Y břehu jako výšku plochy sníženou o výšku obrázku.

Dále v inicializaci spustíme přehrávání opakovaných zvuků zvukové kulisy scény (šumění vody, zpěv ptáků). U zvuků se musíme zastavit podrobněji. Chceme, aby zvuky zněly pestře a náhodně. Proto nestačí abychom si připravili jednu dlouhou nahrávku - neměli bychom ji dostatečně dlouhou a velmi brzy bychom narazili na opakování, kdy se nahrávka už stává nudnou. Pestrost proto musíme zajistit opakováním více zvuků najednou s tak rozdílnými délkami, aby se nahrávky opakovaně nesetkávaly.

Kromě toho, že budeme přehrávat různé nahrávky, můžeme využít ještě jeden trik, díky kterému nemusíme mít nahrávek tolik. Budeme přehrávat některé nahrávky vícekrát najednou, ale různou rychlostí, čímž můžeme zabránit pocitu opakování i u jediné nahrávky. Navíc přidáme rozdílné nastavení stereobáze, takže zvuky budou přicházet z různých směrů. Tím se výrazně zvýší prostorovost zvuku a zvuková kulisa se stává mnohem bohatší. To je základní přednost stereofonního zvuku - posluchači je jedno zda některý zvuk přichází zleva a jiný zprava, hlavní předností stereofonie je to, že zvuky se rozloží do širokého prostoru, což působí jednak menší pocit únavy sluchu a jednak pocit pestrosti.

Příkazy pro práci se zvukem pracují se zvukem tak, že si udržují seznam přehrávaných zvuků a jakmile přijde příkaz pro manipulaci se zvukem (například příkaz pro přehrávání), projde se seznam přehrávaných zvuků a pokud je tento zvuk již přehráván, bude se manipulovat s tímto zvukem (například se upraví hlasitost přehrávání). Proto pokud chceme přehrávat jeden zvuk vícekrát, musíme použít prvek rozlišovací kód (0 až 65535). Je to interní číselná proměnná používaná jako doplňkové kritérium při vyhledávání zvuku v seznamu přehrávaných zvuků. Bude-li rozlišovací kód před jedním příkazem nastaven na jinou hodnotu než před jiným příkazem, bude se zvuk považovat za jiný zvuk a díky tomu může být spuštěno jeho nové přehrávání.

Posledním příkazem v inicializaci programu je příkaz pro vykreslení obrázku pozadí od souřadnice Y břehu.

Budeme pokračovat hlavní smyčkou programu. Použijte cyklus podmíněné opakování příkazů. Do podmínky dejte test přerušení cyklu stiskem klávesy Esc a na konec cyklu příkaz pro čekání. Jak bude smyčka v závěru vypadat vidíte na následujícím obrázku. Program teď můžete na zkoušku spustit - měli byste vidět v horní části plochy obrázek pozadí a mělo by být slyšet přehrávání opakovaných zvuků pozadí scény.

Obsluhu smyčky začneme vykreslováním animované hladiny vody. Připravte si do smyčky cyklus opakování příkazů s počtem. Cyklus bude sloužit ke kreslení jednotlivých linek hladiny vody. Před cyklem vynulujte proměnnou vzdálenost linky od břehu, ta bude ukazatelem souřadnice linky během vykreslování. Za cyklem zvyšte ukazatel fáze animace hladiny o 0.4, což je rychlost, jak rychle se budou pohybovat vlny na vodě.

Do počtu opakování cyklu vložte souřadnici Y břehu vynásobenou číslem 32. Jak si jistě vzpomínáte, jednotkový krok v souřadném systému Petra představuje šířku 1 políčka. Každé políčko (předmět) má rozměr 32 x 32 grafických bodů. Proto vynásobením souřadnice Y břehu číslem 32 získáme počet grafických linek hladiny, kterou chceme kreslit.

Na konci cyklu zvyšte ukazatel vzdálenost linky od břehu o konstantu 1/32 (naleznete ji v číselných konstantách Petra), což je vzdálenost jednoho grafického bodu v souřadném systému Petra. Tím posuneme ukazatel kreslené linky na souřadnici další linky.

Na začátku cyklu vypočteme proměnnou modulace linky, což je, dá se říct, centrální výpočetní operace celého programu. Jedná se o sinusovou odchylku linky od lineárního zrcadlového obrazu, tedy výchylka vlny tak jak ji vidíme při pozorování vodní hladiny.

Funkce bude modulovaná sinusovou funkcí (jak by se dalo u vln na hladině očekávat). Vynásobením koeficientem 0.1 uvedeme rozkmit vln do "rozumných" mezí. Argument funkce sinus bude záviset jednak na fázi animace - tím se zajistí pohyb vln v čase - a jednak na vzdálenosti od břehu - tím se zajistí zvlnění hladiny od břehu směrem k nám. Ukazatel fáze animace hladiny můžeme jednoduše přičíst k funkci závislosti na vzdálenosti od břehu.

Pokud bychom dosadili přímo proměnnou vzdálenost linky od břehu, vlnila by se hladina lineárně od břehu. Všechny vlnky by byly stejně široké. My ale potřebujeme, aby nejvzdálenější vlnky byly nejmenší a směrem k nám se zvětšovaly. Této závislosti nejlépe odpovídá převrácená hodnota vzdálenosti linky od břehu. Abychom zabránili dělení nulou (a protože u břehu by byly vlnky až příliš malé) ke vzdálenosti linky přičteme číslo 1 (inkrementací). Do čitatele zlomku uvedeme číslo 200, které udává šířku vlnek. Ještě doladíme rozložení vlnek - vlnky jsou u břehu malé a blízko nás příliš velké. Proto vzdálenost linky od břehu ještě odmocníme, tím zmenšíme přírustky velkých čísel a vlnky se tak stanou rovnoměrnější. Ve výsledku tedy mocníme vzdálenost linky číslem -0.5.

Nyní vykreslíme linku hladiny vody. Souřadnici Y linky vypočteme odečtením vzdálenosti linky od břehu od souřadnice Y břehu. Navíc odečteme šířku 1 grafického bodu, protože první linka musí začínat přesně pod spodním okrajem obrázku pozadí. Výška výřezu je 1 grafický bod, tedy číslo 1/32. Pokud bychom jako souřadnici výřezu Y dosadili přímo proměnnou vzdálenost linky od břehu, vzniklo by nám lineární zrcadlo (tj, pozadí by se zobrazilo vzhůru nohama). Ke vzdálenosti linky od břehu přičteme modulaci linky a tím zajistíme rozmítání linek vlnami a tedy animaci vln hladiny. Protože potřebujeme, aby se rozkmit vln zvětšoval od břehu směrem k nám, modulaci linky ještě vynásobíme vzdáleností linky od břehu.

Program můžete vyzkoušet, uvidíte vlnící se vodní hladinu.

Cyklus kreslení hladiny na chvíli opustíme a budeme se věnovat animaci kačera a kachny. Na začátek hlavní smyčky přidejte podmínku pohyb kačera. Podle přepínače kačer je v pohybu se rozliší dva případy - buď je kačer v pohybu a je třeba jej animovat nebo je mimo obrazovku a může být znovu přivolán na scénu.

Je-li kačer v pohybu, zajistí se jeho pohyb změnou souřadnice X v závislosti na tom, kterým směrem se pohybuje. Pohybuje-li se směrem doprava, jeho X souřadnice se zvýší o 0.05. Pokud souřadnice X přesáhne hodnotu 21 (stačilo by i 20), kačer se dostal mimo obrazovku a vypne se příznak pohybu. Od této chvíle je neaktivní a může být znovu vyvolán. Obdobně se zajistí obsluha pro směr zprava doleva s tím rozdílem, že od souřadnice X se odečítá 0.05 a kontroluje se spodní hranice -5 pro ukončení animace (obrázek je 4 široký, 1 je rezerva).

Není-li kačer v pohybu, může se zahájit jeho nová animace. Animace se spustí s pravděpodobností 1% (tj. náhodné číslo je menší než 0.01). Při zahájení pohybu se nejdříve nastaví příznak, že kačer je v pohybu. Dále se náhodně určí (s 50% pravděpodobností), zda se bude pohybovat zleva doprava nebo obráceně. Souřadnice Y bude náhodná v rozmezí 4.5 až 5.5. Obrázek kačera má výšku 1.5, při souřadnici 5.5 bude tedy jeho horní okraj na souřadnici 7.0, což je horní okraj hladiny. Pokud bychom kačera nechali zobrazovat výše, museli bychom překreslovat i obrázek pozadí, jinak ho bude kačer přemazávat.

Podle příznaku směru pohybu určíme výchozí souřadnici X kačera - buď -5 (vlevo) nebo 21 (vpravo). Zároveň připravíme současný obrázek kačera. Pro směr doprava je to původní obrázek beze změny, pro směr doleva je to obrázek zrcadlově obrácený.

Nyní do hlavní smyčky, ihned za cyklus pro vykreslení jedné fáze hladiny, doplňte obsluhu pro vykreslení kačera. Je-li kačer v pohybu, zobrazí se současný obrázek kačera na aktuálních souřadnicích X a Y. Program můžete zkusit - měli byste vidět náhodně se objevujícího kačera, jak plave po hladině. Zatím bez odrazu na vodní hladině. Obdobně obslužte i kachnu, s tím rozdílem, že její souřadnice Y bude v rozmezí 3 až 4.

Vrátíme se do smyčky vykreslení jedné fáze hladiny. Doplňte za příkaz pro vykreslení jedné linky hladiny podmínku, která vykreslí kačera v případě, že kačer je v pohybu (tj. zobrazen). Nejdříve si připravíme souřadnici linky v obrázku kačera - od vzdálenosti linky od břehu odečteme vzdálenost obrázku kačera od břehu. Namísto dvojité negace jen zaměníme prvky, takže odečteme souřadnici Y kačera mínus souřadnici Y břehu. K výsledku přičteme vypočtenou modulaci linky, čímž zajistíme vlnění hladiny, a malou korekci 0.5, která zajistí, že se obraz kačera zobrazí kousek výše (aby se s kačerem mírně překrýval).

Nyní můžeme zobrazit linku odrazu kačera. Ověříme, zda je vypočtená linka v obrázku platná

  • tj. zda je souřadnice nezáporná. Zda leží nad horním
okrajem obrázku testovat nemusíme, protože to ověří kreslicí funkce. Je-li souřadnice Y nad horním okrajem, kreslení se neprovede. Zatímco je-li pod dolním okrajem (tj. záporná), omezí se na hodnotu 0 a v takovém případě by se vykreslila linka 0, proto dolní hranici testovat musíme.

Program můžete opět vyzkoušet. Pod kačerem by se měl objevit jeho vlnící se odraz ve vodě. Obdobně obslužte i kreslení kachny. Kreslení kachny musí probíhat vždy později než kreslení kačera, protože její Y souřadnice je níže, tedy jakoby blíže k nám.

Zbývá poslední úkon - náhodné přehrávání zvuků. Obsluhu umístěte do hlavní smyčky, před obsluhu čekání. Nový náhodný zvuk se přehraje s 2% pravděpodobností, tj. je-li náhodné číslo menší než 0.02. Nastavením indexu náhodného zvuku na náhodné číslo se náhodně vybere některý ze zvuků a spustí se jeho přehrátí s náhodným vyvážením stereobáze v rozsahu -1 až +1. Tím je program hotov.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 263x (1.99 MB)
Aplikace je včetně zdrojových kódů v jazyce Petr Lite (jsou obsaženy v EXE souboru, který lze v programu přímo otevřít)

 

Všechny články v sekci
2D grafika
Článek pro vás napsal Panda38
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Programátor C++, WinAPI, ASM.
Aktivity