Programovanie

Animácia v appletoch Java

Tento článok popisuje, ako implementovať animáciu pomocou rozhrania API appletu Java. Opisuje bežne používané techniky a poskytuje jednoduchý príklad na ilustráciu každej techniky.

Základné animačné techniky

V Jave je možných veľa foriem animácie. Všetky majú spoločné to, že vytvárajú určitý druh pohybu na obrazovke kreslením po sebe nasledujúcich snímok pri relatívne vysokej rýchlosti (zvyčajne asi 10 - 20-krát za sekundu).

Začneme tým, že vytvoríme jednoduchý applet šablón na vytváranie animácií, a pomaly ho vypracujeme, kým sa nedostaneme k celkom úplnému appletu.

Pomocou nite

Ak chcete aktualizovať obrazovku niekoľkokrát za sekundu, musíte vytvoriť nové vlákno Java, ktoré obsahuje slučku animácie. Animačná slučka je zodpovedná za sledovanie aktuálneho rámca a za vyžiadanie pravidelných aktualizácií obrazovky. Ak chcete implementovať vlákno, musíte vytvoriť podtriedu Závit alebo dodržiavať Spustiteľné rozhranie.

Častou chybou je vloženie slučky animácie do súboru farba () metóda appletu. Ak to urobíte, bude to mať zvláštne vedľajšie účinky, pretože držíte hlavné vlákno AWT, ktoré má na starosti všetko kreslenie a spracovanie udalostí.

Ako príklad som napísal malý applet šablóny s názvom Example1Applet, ktorý ilustruje všeobecný obrys animačného appletu. Example1Applet ukazuje, ako vytvoriť vlákno a zavolať súbor premaľovať () metóda v stanovených intervaloch. Počet snímok za sekundu je určený zadaním parametra appletu. Tu je príklad toho, čo by ste vložili do svojho dokumentu HTML:

Tu je príklad 1Applet.

Poznámka:

Tento applet v skutočnosti zatiaľ na obrazovku nič nekreslí. Kreslenie na obrazovku je vysvetlené neskôr. Pamätajte tiež, že applet ničí svoje vlákno animácie vždy, keď používateľ opustí stránku (čo má za následok aplet stop () volaná metóda). To zaisťuje, že applet nebude strácať čas CPU, kým jeho stránka nebude viditeľná.

Udržiavanie stálej snímkovej frekvencie

Vo vyššie uvedenom príklade applet jednoducho spí po stanovenú dobu medzi snímkami. To má nevýhodu, že niekedy čakáte príliš dlho. Ak chcete získať 10 snímok za sekundu, nemali by ste medzi snímkami čakať 100 milisekúnd, pretože stratením času pri spustení vlákna strácate čas.

Nasledujúci applet, Example2Applet, ukazuje, ako si udržať lepší čas. Jednoducho počíta správne oneskorenie medzi snímkami tak, že sleduje začiatočný čas. Vypočíta odhadované požadované oneskorenie medzi snímkami na základe aktuálneho času.

Tu je Example2Applet.

Maľovanie každého rámu

Zostáva iba vymaľovať každý rám. V predchádzajúcich príkladoch voláme premaľovať () pre každý rám, čo spôsobí applet farba () metóda, ktorá sa má volať. Aplikácia Example3Applet má a farba () metóda, ktorá vykreslí číslo aktuálneho rámca na obrazovku.

Tu je Príklad3Applet v akcii, za ktorým nasleduje zoznam kódov.

Poznámka:

Ak nastavíte frekvenciu snímok na veľmi vysokú (napríklad 100 snímok za sekundu), hodnota run () metóda zavolá premaľovať () 100-krát za sekundu. Nie vždy to však bude mať za následok 100 volaní na číslo farba () za sekundu, pretože keď zadáte žiadosť o prekreslenie príliš rýchlo, zhrnú sa do aktualizácie na jednu obrazovku. Preto sledujeme číslo aktuálneho rámca v run () metóda skôr ako v farba () metóda.

Generovanie grafiky

Teraz poďme animovať niečo, čo je trochu ťažšie nakresliť. Aplikácia Example4Applet kreslí kombináciu sínusových vĺn. Pre každú súradnicu x nakreslí krátku zvislú čiaru. Všetky tieto riadky spolu tvoria jednoduchý graf, ktorý sa mení pre každý rámec. Bohužiaľ zistíte, že tento prístup spôsobuje veľa zábleskov. V nasledujúcej časti vysvetlíme príčinu blikania a niektoré nápravné opatrenia.

Tu je Príklad4Applet v akcii, za ktorým nasleduje zoznam kódov.

Zabráňte nadmernému blikaniu

Blikanie, ktoré vidíte v Príklade 4Applet, má dve príčiny: vymaľovanie každého rámčeka trvá príliš dlho (kvôli množstvu výpočtu, ktoré je potrebné počas prefarbenia) a celé pozadie sa pred tým vymaže farba () sa volá. Zatiaľ čo prebieha výpočet nasledujúcej snímky, používateľ vidí pozadie animácie.

Tento krátky čas medzi vyčistením pozadia a maľbou sínusovej vlny sa považuje za záblesk. Na niektorých platformách, ako napríklad PC, je blikanie zreteľnejšie než v systéme X Windows. Dôvod je ten, že grafika X Windows je vyrovnávacia pamäť, čo robí blesk o niečo kratším.

Blikanie môžete výrazne znížiť pomocou dvoch jednoduchých trikov: implementácie aktualizácia () metóda a použitie dvojitého ukladania do vyrovnávacej pamäte (niekedy známe ako pomocou backbufferu).

Prepísanie metódy update ()

Keď AWT dostane žiadosť o prefarbenie appletu, zavolá na applet aktualizácia () metóda. V predvolenom nastavení je aktualizácia () metóda vymaže pozadie appletu a potom zavolá farba () metóda. Zrušením aktualizácia () metóda na zahrnutie výkresového kódu, ktorý býval v farba () metódou sa vyhneme tomu, aby sme pri každom prefarbení vyčistili celú oblasť appletu.

Teraz, keď už pozadie nie je automaticky vyčistené, musíme to urobiť sami v aktualizácia () metóda. Teraz môžeme pred nakreslením novej čiary jednotlivo vymazať každú zvislú čiaru grafu a úplne tak eliminovať blikanie. Tento efekt je uvedený v príklade 5Applet.

Tu je Príklad5Applet v akcii, za ktorým nasleduje zoznam kódov.

Poznámka:

Kedykoľvek prepíšete aktualizácia () metódu, stále musíte implementovať farba (). Je to preto, lebo farba () Táto metóda je volaná priamo výkresovým systémom AWT vždy, keď dôjde k „poškodeniu“ kresliacej oblasti appletu - napríklad keď je z obrazovky odstránené okno zakrývajúce časť kresliacej oblasti appletu. Váš farba () implementácia môže jednoducho zavolať aktualizácia ().

Dvojité ukladanie do vyrovnávacej pamäte

Ďalším spôsobom, ako obmedziť blikanie medzi snímkami, je použitie dvojitého ukladania do vyrovnávacej pamäte. Táto technika sa používa v mnohých animačných appletoch.

Všeobecnou zásadou je, že vytvoríte obraz mimo obrazovku, do obrázka nakreslíte rám a potom jedným obrázkom vložíte celý obrázok na obrazovku. drawImage (). Výhodou je, že väčšina kresby sa vykonáva mimo obrazovku. Konečné vymaľovanie obrazu mimo obrazovky na obrazovku je zvyčajne oveľa efektívnejšie ako maľovanie rámu priamo na obrazovku.

Applet sínusovej vlny s dvojitým ukladaním do vyrovnávacej pamäte je uvedený v príklade 6Applet. Uvidíte, že animácia je dosť plynulá a pri kreslení rámu nepotrebujete žiadne špeciálne triky. Jedinou nevýhodou je, že musíte prideliť obrázok mimo obrazovku, ktorý je taký veľký ako kresliaca plocha. Ak je oblasť kreslenia veľmi veľká, môže to vyžadovať pomerne veľa pamäte.

Tu je Príklad6Applet v akcii, za ktorým nasleduje zoznam kódov.

Poznámka:

Ak používate dvojité ukladanie do vyrovnávacej pamäte, musíte prepísať aktualizácia () metóda, pretože nechcete, aby sa pozadie appletu vyčistilo pred maľovaním rámu. (Pozadie si vyčistíte sami tak, že nakreslíte obrázok mimo obrazovku.)

Používanie obrázkov

Teraz prepíšeme paintFrame () metóda s metódou, ktorá animuje niektoré obrázky. To pridáva k problému menšie komplikácie. Obrázky sú pomerne veľké a načítavajú sa postupne. Úplné nakreslenie obrázkov môže trvať dlho, najmä keď ich načítate cez pomalé pripojenie. To je dôvod, prečo drawImage () metóda berie štvrtý argument, objekt ImageObserver. Pozorovateľ obrázkov je objekt, ktorý je informovaný, keď dorazí viac obrazových údajov. Na získanie obrázkov používame getImage () metóda.

Presúvanie obrázka po obrazovke

Tento prvý applet na animáciu obrázkov, Example7Applet, používa nasledujúce dva obrázky:

world.gif: car.gif:

Ako pozadie sa použije svetový obraz a na ňom sa dvakrát nakreslí obraz automobilu, čím sa vytvorí animácia dvoch automobilov, ktoré pretekajú po celom svete.

Tu je Príklad7Applet v akcii, za ktorým nasleduje zoznam kódov.

Zobrazenie sekvencie obrázkov

Example8Applet ukazuje, ako vytvoriť animáciu pomocou samostatných obrázkov pre každú snímku. Tu je použitých 10 rámcov:

T1.gif: T2.gif: T3.gif: T4.gif: T5.gif:

T6.gif:

T7.gif:

T8.gif:

T9.gif:

T10.gif:

Na odstránenie blikania stále používame dvojité ukladanie do vyrovnávacej pamäte. Dôvod je ten, že každý obrázok, ktorý vykresľujeme, je čiastočne priehľadný, a preto je potrebné pred nakreslením ďalšieho obrázka vymazať každý snímok. To by spôsobilo blikanie bez dvojitého ukladania do vyrovnávacej pamäte.

Tu je Príklad8Applet v akcii, za ktorým nasleduje zoznam kódov.

Poznámka:

Pri zobrazovaní sekvencií obrázkov musíte byť opatrní, aby ste obrázky správne zarovnali. Najjednoduchším spôsobom je zabezpečiť, aby všetky obrázky mali rovnakú veľkosť a aby sa dali kresliť v rovnakej polohe. Ak to tak nie je, bude musieť váš applet nakresliť každý rámec s iným posunom.

Používanie aplikácie MediaTracker na zabránenie prírastkového zobrazenia

Keď program Java načíta obrázok, môže ho zobraziť skôr, ako sa obrázok úplne načíta. Užívateľ vidí obraz, ktorý sa vykresľuje, najskôr neúplne a potom po načítaní obrazu postupne a čoraz dokonalejšie. Tento prírastkový displej poskytuje používateľovi spätnú väzbu (zlepšuje vnímaný výkon) a umožňuje programu ľahko vykonávať ďalšie úlohy počas načítania obrázka.

Pokiaľ ide o animáciu, pre obrázky na pozadí môže byť užitočné inkrementálne zobrazovanie obrázkov, ktoré však môžu byť pri používaní animovaných obrázkov veľmi rušivé. Preto je niekedy žiaduce pred zobrazením načítať celú animáciu.

Môžete použiť Jima Grahama MediaTracker triedy na sledovanie sťahovania obrázkov, čím sa animácia oneskorí, kým sa celá sada obrázkov úplne nestiahne. Example9Applet ukazuje, ako sa používa MediaTracker triedy na stiahnutie obrázkov pre vlnu Dukeovej animácie.

Tu je Príklad9Applet v akcii, za ktorým nasleduje zoznam kódov.

Pridáva sa zvuk

Je ľahké pridať zvuk do animácie. Môžete použiť getAudioClip () metóda na získanie objektu AudioClip. Neskôr môžete klip prehrať buď ako súvislú slučku, alebo ako jeden zvuk. Example10Applet ukazuje, ako počas animácie prehrať súvislý zvuk na pozadí i opakujúci sa zvuk.

Tu je Príklad10Applet v akcii, za ktorým nasleduje zoznam kódov.

Poznámka:

Pri prehrávaní nepretržitého zvuku musíte nezabudnúť zastaviť ho, keď používateľ opustí stránku (t. J. Urobte to v applete stop () metóda).

Ďalšia poznámka:

Nepretržitý zvuk môže byť veľmi nepríjemný. Je dobré poskytnúť používateľovi spôsob, ako vypnúť zvuk bez opustenia stránky. Môžete poskytnúť tlačidlo alebo jednoducho vypnúť zvuk, keď používateľ klikne na applet.

Tipy na rýchlejšie načítanie obrázkov

Stiahnutie animácie, ktorá obsahuje veľa obrázkov, bude trvať dlho. Je to hlavne kvôli skutočnosti, že pre každý obrazový súbor sa vytvára nové pripojenie HTTP a vytvorenie spojenia môže trvať niekoľko sekúnd, aj keď existuje veľká šírka pásma.

V tejto časti si povieme o dvoch formátoch obrázkov, ktoré môže váš applet použiť na zrýchlenie sťahovania obrázkov.

Pomocou obrazového pásu

Výkon sťahovania môžete vylepšiť použitím jedného obrázka, ktorý obsahuje niekoľko rámcov animácie. Jeden obrázok môžete z obrázka vykresliť pomocou znaku clipRect () operátor. Nižšie je uvedený príklad obrazového pásu, ktorý sa používa v applete UnderConstruction.

Applet vytvára efekt vŕtania nevymazaním predchádzajúcich snímok. Pozadie sa čistí len tak často.

Tu je UnderConstruction v akcii s odkazom na jeho zdrojový kód.

Medzisnímková kompresia pomocou Flic

Ak chcete skutočne zlepšiť výkonnosť sťahovania animácie pozostávajúcej z viacerých snímok, musíte použiť určitú formu kompresie medzi snímkami.

Animačné nástroje

V tejto chvíli (január 1996) je k dispozícii niekoľko nástrojov, ktoré vám pomôžu vytvoriť animácie založené na prostredí Java. Najlepší nástroj, ktorý som mohol nájsť, je The Easy Animator (TEA) spoločnosti DimensionX (predtým známy ako JAM). Umožňuje vám interaktívne vytvárať animácie. Radi by sme vyzvali vývojárov, aby napísali viac nástrojov na vytváranie animácií v prostredí Java.

Ak máte na zobrazenie niekoľko pripravených obrázkov, môžete použiť applet Animátor. Animator má veľa parametrov, ktoré vám umožňujú určiť nepretržité zvuky, zvuky špecifické pre jednotlivé snímky, načasovanie a polohu jednotlivých snímok, úvodný obrázok, usporiadanie snímok atď.

Mali by ste sa tiež pozrieť na stránku Animácie Gamelan a nájsť veľa appletov, ktoré používajú animáciu.

Záver

Dúfam, že tento článok pomôže vývojárom appletov písať viac a lepšie animačné applety. Dúfam tiež, že čoskoro budú k dispozícii lepšie nástroje.

Arthur van Hoff bol donedávna vedúcim personálnym inžinierom v spoločnosti Sun Microsystems a vývoju jazyka Java sa venuje od roku 1993. Je autorom prvého kompilátora Java napísaného výlučne v jazyku Java. Nedávno opustil spoločnosť Sun a založil novú spoločnosť spolu so Sami Shaio, Kim Polese a Jonathan Payne. Nová spoločnosť sa zameria na budovanie Java aplikácií. Kathy Walrath je odborná spisovateľka v spoločnosti Sun Microsystems. Členom tímu Java je od roku 1993. V súčasnosti spolupracuje s Mary Campione na dokumente The Java Tutorial: Object-Oriented Programming for the Internet, applet-enhanced tutorial for learn the Java language, applet programming, and Java GUI programming. . Okrem toho, že bude online výučba, Java tutoriál bude vydaný aj toto leto ako súčasť Addison-Wesley Java Series.

Tento príbeh „Animácia v appletoch Java“ pôvodne publikoval server JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found