Jeffrey Cross
Jeffrey Cross

Kódové pole: Swat (arraylist) cílů

Poslední Codebox ukázal, jak používat webovou kameru pro nahrazení vaší myši kouzelnou hůlkou. V tomto příkladu přesunutí hůlky do kruhové oblasti obrazovky způsobilo, že se vyzařující paprsky změnily na náhodné barvy. Tento článek staví na tomto příkladu a ukazuje, jak vytvořit sofistikovanější interakce. Namísto jediného stacionárního cíle tento náčrt představuje řadu letících cílů. Dotknutí se cíle (slovo “klobouk”) změní to na jiné slovo (v tomto případě “králík”), jak ukázaný tady: t

Skica ukazuje, jak vytvořit a spravovat seznam interaktivních objektů. Ať už píšete hry, částicové systémy nebo magickou show řízenou Arduinem (OK, tak jsem naklonila ruku - to je téma budoucího příspěvku), toto jsou nástroje, které budete používat znovu a znovu jako vy. jít dále s Processing.

Nastavte náčrt

Nejdříve první - pojďme načrtnout a spustit skicu. Pro tento projekt budete potřebovat dva soubory: magic_words.pde a Target.pde. Nejprve zapálte Zpracování a vložte následující kód pro magic_words.pde do hlavního okna.

Můžete buď zvýraznit první řádek, posunout celou cestu dolů a pak pomocí Ctrl-c zkopírovat kód (pevný), nebo můžete kliknout na tento odkaz (magic_words.pde), stisknutím klávesy Ctrl + a vybrat celý text, a poté pomocí Ctrl + c jej zkopírujte (jednodušší). Po zkopírování kódu přejděte zpět na Zpracování a vložte jej do hlavního okna. Pak použijte "File -> Save" z menu (nebo jen Ctrl + s) a uložte soubor s názvem "magic_words" (Zpracování automaticky přidá ".pde").

Zde je Target.pde, druhý soubor, který potřebujete:

Zkopírujte kód do vyrovnávací paměti pro vkládání pomocí jakékoli metody, kterou dáváte přednost (tj. Zvýrazněte ji nebo připojte přímo k souboru). Tentokrát budete muset vytvořit nový kartu, což je způsob, jakým vám zpracování umožňuje spravovat náčrtky s více soubory. (Toto je něco jako vytvoření nové karty v okně prohlížeče).

Chcete-li vytvořit kartu, klepněte na pravou šipku v pravém horním rohu okna Zpracování.Zpracování vás požádá o nový název souboru - zadejte „Cíl“. Jakmile zadáte název souboru, zobrazí se nová karta, do které můžete kód vložit. Následující schéma by vám mělo poskytnout potřebné kroky:

Poslední věc, kterou musíme udělat, je vytvořit pěkné písmo pro cíl. (Písma jsou popsána v Kapitole 6 Začínáme se zpracováním). Proč se ptáš? Po vybalení z krabice má zpracování jen jednoduchý povel text() Zobrazí se text, ale nemůžete říct, kolik místa zabírají na obrazovce (což bude důležité, protože za minutu uvidíme). Navíc jsou to prostě staré písmo Arial, takže nejsou příliš zajímavé.

Chcete-li to obejít, můžete pomocí nabídky Nástroje vytvořit nový soubor písma pro náčrt. Po importu souboru pomocí loadFont () budete moci hrát s typografií. (W00t!). V každém případě je proces vytváření písma přímočarý. Nejprve klikněte na „Nástroje -> Vytvořit písmo…“ z panelu nabídek, který zobrazí následující obrazovku:

Jediné, co musíte udělat, je vybrat požadované písmo (vybral jsem možnost „Baskerville-Bold“; chcete-li použít jiné písmo, budete muset změnit název souboru písma v magic_words.pde). Všimněte si, že název souboru v dolní části okna se mění při výběru různých možností - jedná se o název souboru, který budete muset v náčrtu použít; Zpracování automaticky přidá „.vlw“ na konec.

Po načtení dvou souborů a instalaci písma spusťte náčrt. (Stejně jako u většiny projektů v této sérii, budete také potřebovat webovou kameru.) Pomocí hůlky (nebo jiného vhodného ukazatele) z posledního kódového pole byste měli být schopni plnit různé cíle.

Následující dvě části popisují, jak skica pracuje. První část popisuje kód v souboru Target.pde, který slouží k vytvoření objektu Target, hlavního stavebního bloku skriptu. Druhá část popisuje, jak soubor magic_words.pde používá a ArrayList ke správě více cílových objektů.

Cílový objekt

Kapitola 9 Začínáme s zpracováním zavádí objekty a objektově orientované programování (OOP). Stručně řečeno, objekt je stavebním blokem používaným k vytvoření sofistikovanějších programů. Objekty obsahují dva základní prvky: pole, což jsou proměnné, které určují aktuální stav objektu a metody, což jsou jen funkce, které dělají objekt něco. Klíčovou součástí síly OOP je, že vám pomůže přemýšlet o vašem kódu fyzickým způsobem tím, že vás bude povzbuzovat k přemýšlení, pokud jde o jednodušší komponenty.

Chcete-li použít objekty, nejprve vytvořte třída (nebo několik tříd - můžete použít mnoho různých objektů), což je jako šablona, ​​která popisuje vše, co objekt dokáže. Jakmile definujete třídu, použijte Nový příkaz k vytvoření objektů, které můžete použít ve svých náčrtcích. Toto rozlišení může být trochu matoucí, takže si to takhle promyslete. Pokud jste pečení dortu, měli byste začít s receptem. Je to jako třída - máte popis, ale samotný dort. Chcete-li si dort - nebo objekt - musíte následovat recept, než budete mít co jíst. Vytváření nových objektů je úkolem zpracování Nový Příkaz - vytvoří novou proměnnou objektu voláním speciální metody nazvané konstruktor. Konstruktor inicializuje proměnné objektu a obecně ho připraví na akci; Jediný rozdíl mezi ním a jinou metodou je, že má stejný název jako třída samotná.

OK, dost přezkoumání. Promluvme si o kódu. Jak bylo uvedeno výše, třída Target je stavební blok. Jeho pole zahrnují:

  • Aktuální pozice, reprezentovaná proměnnými X a y
  • Rychlost a směr, reprezentovaný proměnnými dx a dy. To jsou jen náhodně zvolené hodnoty.
  • Šířka a výška vyjádřená proměnnými w a h
  • Velikost písma (více o této bitové části)
  • Příznak označující, zda se hůlka dotýká cíle (vlajka je programovací termín pro libovolnou proměnnou, která slouží k reprezentaci specifického stavu na nebo vypnuto)
  • Aktuální text cíle (tj. „Hat“ nebo „Rabbit“)

Po povinné Cílová() konstruktoru (je to pouze úloha nastavit hodnoty befofe a po textu pro cíl), metody zahrnují:

  • krok(), který dělá cíl pohybovat se po jevišti. To funguje přidáním dx a dy na X a y proměnných.
  • malovat(), který kreslí cíl na jevišti na (X, y) pozice
  • detectCollision (), která určuje, zda hůlka kolidovala s cílem
  • setBox (), který aktualizuje proměnné šířky a výšky cíle na základě toho, zda se ho dotkla hůlka
  • přepnout (), které mění cílové slovo. (tj. pokud aktuální slovo "Hat", pak přepnout dělá to „králík“ a naopak)
  • na pódiu(), který vrací příznak označující, zda cíl letěl mimo viditelnou plochu obrazovky

První dvě metody jsou velmi jednoduché, ale zbývající metody, které se používají k detekci kolizí, si zaslouží trochu větší pozornost. Pokud si vzpomenete z počátečního Codeboxu, detekce kolizí je název pro všechny způsoby, kterými se můžete rozhodnout, že se na obrazovce protínají dvě věci. V původním příkladu hůlky jsme měli kruhový cíl, takže jsme použili jednoduchý vzorec vzdálenosti, abychom určili, zda jsou souřadnice hůlky uvnitř poloměru cíle. V tomto příkladu používáme obdélníkový cíl. Aby se věci trochu složitější, cíl změní velikost, když se ho dotkne, takže potřebujeme některé podpůrné metody, abychom se ujistili, že všechny proměnné jsou v souladu s aktuálním stavem cíle. Následující diagram ukazuje různé kusy, které jsou ve hře:

Pomocí tohoto diagramu je snadné napsat kód detectCollision ():

// Určuje konkrétní souřadnici x, y je v poli boolean detectCollision (float cx, float cy) {boolean retVal = false; if ((cx> x) && (cx <(x + w)) && (cy> (y-h)) && (cy <y)) {retVal = true; } vrátit retVal; }

Konečně na pódiu() určuje, zda je cíl stále ve viditelné fázi. Po vylétnutí je recyklován tím, že je umístí na nové místo novou rychlostí a směrem. Je příjemné poznamenat, že navzdory větší složitosti je většina tohoto kódu téměř totožná s příkladem 5-17: Hranice obdélníku v části Začínáme se zpracováním.

Arraylist cílů

Nyní, když jsme prošli třídou Target, podívejme se, jak ji používat. Jak bylo zmíněno na začátku, hlavním cílem tohoto příkladu bylo ukázat, jak můžete dynamicky spravovat více objektů. Zatímco standardní pole (popsaná v Kapitole 10 Začínáme se zpracováním) jsou skvělá pro mnoho věcí, nejsou příliš dynamická, protože jakmile určíte, kolik prvků mají, navždy zůstáváte v kontaktu s nimi.

Předpokládejme například, že byste chtěli mít spoustu cílů, ale místo toho, abyste je recyklovali, jako byste to udělali tady, prostě jste je chtěli smazat. Ve standardním poli nelze odstranit prvky. Pokud jste začali s 5, máte vždy 5, bez ohledu na to, co. Pokud tedy chcete něco „smazat“, musíte mít nějaké nemotorné řešení. Nebo, na opačné straně, předpokládejme, že jste měli program, kde jste obvykle měli několik položek, které byste mohli spravovat, ale v některých případech můžete mít mnoho tisíc. Při použití standardního pole budete muset vytvořit prostor pro tisíce pokaždé, když budete plýtvat pamětí a pomaleji.

Zpracování ArrayList je cesta kolem těchto omezení. Namísto jednoduchého datového typu, jako je float nebo int, je ArrayList třídou stavebních bloků pro správu dalších objektů. Má metody pro přidávání nových položek, odstraňování existujících položek, zjištění, kolik položek je v seznamu, a tak dále. Kromě toho, že je to opravdu užitečný nástroj, práce s ArrayList vás seznámí s technikami, které budete používat v jiných, sofistikovanějších třídách, jako je například HashMaps (něco, co prozkoumáme v budoucích příspěvcích). Tak se přesuňte na magic_words.pde a podívejme se na kód.

Vytvoření ArrayListu je poměrně jednoduché a provádí se v tomto řádku; všimněte si, že nemusíme deklarovat velikost:

Cíle ArrayList; // ArrayList je dynamický způsob, jak spravovat pole

Jakmile je deklarován, můžeme do ArrayListu přidat nové objekty, které provádíme s přidat() metoda. Zde je fragment kódu v založit() metoda, která přidává počáteční cíle:

goals = new ArrayList (); // Vytvořit nový seznam pro (int i = 0; i <N; i ++) {target.add (nový cíl ("klobouk", "králík")); }

Tento úryvek má několik zajímavých bodů. Nejprve demonstruje syntaxi pro volání metody, která je object_variable.metoda třídy (seznam argumentů). Za druhé, ukazuje, jak můžete použít objekt jako argument pro ArrayList. Všimněte si, jak používáme Nový příkaz v seznamu argumentů - který vytvoří novou proměnnou objektového cíle a předá ji do seznamu. Nakonec úryvek ukazuje, jak to všechno můžeme udělat uvnitř smyčky. Mohli bychom přidat 10, 100 nebo 10 000 objektů - velikost seznamu je zcela dynamická.

Tento další úryvek, který se objeví v kreslit() metodu, ukazuje, jak můžeme použít dostat() metodu vytáhnout položku z ArrayList:

pro (int i = 0; i <target.size (); i ++) {Target t = (Cíl) target.get (i); // Vybere i'th cíl z pole t.paint (); // Malování // Kontrola kolizí, pokud (t.detectCollision (wandX, wandY)) {if (! T.inTarget) {t.toggle (); t.inTarget = true; }} else {t.inTarget = false; } t.step (); // Přechod na obrazovku // Pokud se aktuální cíl přesunul ze scény, odstraňte jej ze seznamu a vytvořte nový cíl, pokud (! T.onStage ()) {target.remove (i); goals.add (nový cíl ("klobouk", "králík")); }}

Nejdůležitější linií je zde Target t = (Target) target.get (i);. Děje se zde několik věcí. Prvním z nich je vytvoření nové cílové proměnné nazvané t. Tentokrát však nepoužíváme Nový příkaz. Proč se ptáš? Je to proto, že objekt, ke kterému se snažíme přistupovat, již existuje - byl vytvořen dříve v založit() metoda. Jediné, co tady děláme, je jeho získání. Za druhé, máme tento druh podivné syntaxe (Cílová). To je způsob, jakým říkáme Zpracování, jaký typ proměnné je to, že očekáváme, že bude načtena. Toto se nazývá „casting“ a vyžaduje trochu více vysvětlení.

Pokud si vzpomenete, ArrayList je obecný nástroj - mohli bychom jej použít s cílovou proměnnou, třídou Jitterbug popsanou v kapitole 10 Začínáme se zpracováním nebo jakoukoli jinou třídní proměnnou, kterou bychom mohli vytvořit v budoucnu. Zpracování (a jazyk Java, který je základním jazykem, na kterém je založen) se však nemůže zabývat obecným objektem. Vyžaduje to, abychom při každé deklaraci dali každé proměnné přesný typ. Přidání (Cílová) na přední straně dostat() příkaz je to, co to dělá - my říkáme Zpracování „Hej, stahujeme objekt„ Cíl “. odlévání v jiných zdrojích programování.

Konečně máme goals.get (i) část linky. To je jen říkat "táhnout." i„Th položka z cílů ArrayList.

Jakmile proměnnou skutečně načteme t, můžeme zavolat číst jeho proměnné, zavolat jeho metody a obecně to učinit. V tomto příkladu nejprve zavoláme malovat() metodu nakreslení cíle na obrazovce. Dále zkontrolujeme, zda se hůlka dotýká (jak si vzpomenete z posledního Codeboxu, pozice hůlky je reprezentována proměnnými wandX a WandY). Pokud dojde ke kolizi, nejprve zkontrolujeme, zda je hůlka již uvnitř cíle. (Jinými slovy, hůlka mohla kolidovat s objektem na dřívější iteraci založit() a stále se nacházíte v cílovém poli.) Pokud tomu tak není (to znamená, že zasáhne cílový box poprvé), pak text přepneme a nastavíme inTarget vlajka. Pokud je hůlka již v cíli, pak jednoduše nastavíme příznak cíle na hodnotu false, což zabrání tomu, aby se cíl v každém iteraci kreslit(). Další příkaz, t.step (), jednoduše zvyšuje cíl X a y pozice. Konečně poslední -li zkontroluje, zda cíl není na pódiu viditelný. Pokud tomu tak není (tj. Putovalo mimo viditelnou oblast obrazovky), cíl se z ArrayList odstraní pomocí odstranit() metoda; nový cíl je pak přidán na nějakém náhodném novém místě.

Páni! To je spousta abstraktních věcí, ale stojí za to pochopit, protože tyto techniky budete používat znovu a znovu. Ať už používáte ArrayList, HashMap nebo nějakou jinou obecnou datovou strukturu, porozumění těmto základním krokům - vytvoření nového objektu, jeho uložení do obecné datové struktury a jeho získání - je nezbytné pro vytváření sofistikovanějších programů.

V příštím Codeboxu si uděláme pauzu od webové kamery a prozkoumáme, jak získat sofistikovanější vstup od uživatelů, kteří používají opravdu skvělou knihovnu nazvanou controlP5. A fraktály. Uděláme to taky.

Další: Zobrazit všechny sloupce Codebox

Podíl

Zanechat Komentář