Stránka sa načítava, prosím čakajte…
© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 24. 4. 2024.
Dátum: 6. 8. 2020, pred štyrmi rokmi, aktualizované: 4. 9. 2021, pred tromi rokmi
Cieľom tohto miniatúrneho projektu je vytvoriť jednoduchú animáciu rýchlo sa pohybujúcich bubliniek, ktoré reagujú na vzájomné zrážky. Ich pohyb bude pripomínať molekulárne „hmýrenie“ známe ako Brownov pohyb.
~
import knižnica.Farba; import knižnica.GRobot; import static java.lang.Math.*; import static knižnica.Svet.*; public class BrownovaBublinka extends GRobot { // Predvolený konštruktor. public BrownovaBublinka() { // Voláme rozšírený konštruktor s náhodne generovanými hodnotami // pre rýchlosť (3 – 6) a veľkosť (4 – 8) bublinky a s hodnotou // null pre farbu, čo tiež znamená náhodnú hodnotu (pozri nižšie): this( náhodnéReálneČíslo(3, 6), náhodnéReálneČíslo(4, 8), null); } // Rozšírený konštruktor. public BrownovaBublinka(double rýchlosť, double veľkosť, Farba farba) { // Rýchlosť a veľkosť sú nastavené podľa zadaných hodnôt parametrov: rýchlosť(rýchlosť, false); // (druhý parameter false zabraňuje // aktivácii bublinky na tomto mieste – ešte sa nesmie pohnúť, // lebo by sa zle inicializovala – pozri ďalšie nastavenia nižšie) veľkosť(veľkosť); // Ak je hodnota farby rovná null, tak sa vygeneruje náhodná farba, // inak sa nastaví farba podľa zadanej hodnoty parametra: if (null == farba) náhodnáFarba(); else farba(farba); // Ďalšie nastavenia: // • ohraničenie bublinky (na pohyb len v rámci plátna – pozor, // toto treba urobiť pred zmenou polohy bublinky, lebo by sa // ohraničenie nastavilo nesprávne), // • zdvihnutie pera (aby bublinka nekreslila čiaru pri pohybe), // • nastavenie náhodnej polohy a náhodného smeru bublinky. ohranič(); zdvihniPero(); náhodnáPoloha(); náhodnýSmer(); // Aktivácia bublinky bez spustenia globálneho časovača: aktivuj(false); } // Reakcia na stlačenie tlačidla myši (ľubovoľného). @Override public void stlačenieTlačidlaMyši() { if (myšV()) { // Táto reakcia je v podstate takou malou zábavkou. Keď sa // deteguje kliknutie na bublinku, tak nasledujúce dva príkazy // spôsobia, že bublinka akoby „odskočila“ od myši (otočí sa // smerom k myši a urobí „čelom vzad“ = jej ďalší pohyb bude // smerovať od myši). otočNaMyš(); vpravo(180); // (Ale trafiť sa na bublinku je značný problém 🙂. Bolo by // treba ich zväčšiť a spomaliť čas 😉) } } // Reakcia kreslenia = v podstate určenie vlastného tvaru robota, ktorý // je v tomto prípade krúžkom. @Override public void kresliTvar() { krúžok(); } }
~
import knižnica.GRobot; import knižnica.Zoznam; import static java.lang.Math.*; import static knižnica.Svet.*; public class HlavnáTrieda extends GRobot { // Zoznam všetkých bubliniek: private final Zoznam<BrownovaBublinka> bublinky = new Zoznam<BrownovaBublinka>(); // Súkromný konštruktor (v podstate „štartuje“ aplikáciu; v kooperácii // s hlavnou metódou (main) nižšie): private HlavnáTrieda() { super(500, 400); // (veľkosť plátna) // Pridanie 250 bubliniek: for (int i = 0; i < 250; ++i) bublinky.pridaj(new BrownovaBublinka()); // Skrytie hlavného robota (aby „neprekážal“): skry(); // Spustenie časovača (a tým rozbehnutie animácie): spustiČasovač(); } // Reakcia na časovač. @Override public void tik() { // Prejdeme všetky bublinky od prvej po predposlednú: for (int i = 0; i < bublinky.dĺžka() - 1; ++i) { BrownovaBublinka bb1 = bublinky.daj(i); // A porovnáme ich so všetkými od i plus prvej po poslednú: for (int j = i + 1; j < bublinky.dĺžka(); ++j) { BrownovaBublinka bb2 = bublinky.daj(j); // Keď zistíme kolíziu, nasimulujeme ich odrazenie: if (bb1.koliduje(bb2)) { // (iba zmeníme smer; obidve bublinky sa postupne otočia // čelom k sebe a spravia „čelom vzad“) bb1.otočNa(bb2); bb1.vpravo(180); bb2.otočNa(bb1); bb2.vpravo(180); } } } } // Hlavná metóda. public static void main(String[] args) { // (iba zabezpečíme automatické ukladanie konfigurácie okna, vypnutie // automatického prekresľovania pred inicializáciou (s pomocou // súkromného konštruktora) a jeho opätovné zapnutie po inicializácii) použiKonfiguráciu("HlavnáTrieda.cfg"); nekresli(); new HlavnáTrieda(); kresli(); } }