Programiranje

Animacija v programčkih Java

V tem članku je opisano, kako izvajati animacijo z API-jem za programček Java. Opisuje pogosto uporabljene tehnike in daje preprost primer za ponazoritev vsake tehnike.

Osnovne tehnike animacije

V Javi so možne številne oblike animacije. Vsem je skupno to, da na zaslonu ustvarijo nekakšno gibanje z risanjem zaporednih okvirjev z razmeroma visoko hitrostjo (običajno približno 10–20 krat na sekundo).

Začeli bomo z ustvarjanjem preprostega predloga za izvajanje animacij in ga počasi izdelovali, dokler ne pridemo do dokaj popolnega programčka.

Uporaba niti

Če želite zaslon posodobiti večkrat na sekundo, morate ustvariti novo nit Java, ki vsebuje animacijsko zanko. Animacijska zanka je odgovorna za spremljanje trenutnega okvira in za zahtevanje rednih posodobitev zaslona. Če želite implementirati nit, morate ustvariti podrazred Navoj ali se držite Teče vmesnik.

Pogosta napaka je vstavljanje animacijske zanke v barva () metoda apleta. To bo imelo nenavadne stranske učinke, ker zadrži glavno nit AWT, ki je zadolžena za vso risanje in obdelavo dogodkov.

Kot primer sem napisal majhen programček predloge, imenovan Example1Applet, ki ponazarja splošen oris animacijskega programčka. Example1Applet prikazuje, kako ustvariti nit in poklicati prebarvati () v določenih intervalih. Število sličic na sekundo je določeno s predajo parametra programčka. Tu je primer, kaj bi dali v svoj dokument HTML:

Tu je Primer1Applet.

Opomba:

Ta programček še dejansko ne nariše ničesar na zaslonu. Risanje na zaslon je razloženo kasneje. Upoštevajte tudi, da programček uniči svojo nit animacije vsakič, ko uporabnik zapusti stran (kar povzroči, da programček stop () metoda). To zagotavlja, da programček ne bo zapravil procesorskega časa, medtem ko njegova stran ni vidna.

Ohranjanje konstantne hitrosti sličic

V zgornjem primeru programček preprosto spi določen čas med okvirji. To ima pomanjkljivost, da včasih čakate predolgo. Če želite dobiti 10 sličic na sekundo, ne smete počakati 100 milisekund med sličicami, saj s tem, ko zaženete nit, izgubite nekaj časa.

Naslednji programček, Example2Applet, prikazuje, kako obdržati boljši čas. Preprosto izračuna pravilno zakasnitev med sličicami s sledenjem začetnega časa. Izračuna ocenjeno zahtevano zakasnitev med okvirji glede na trenutni čas.

Tukaj je Example2Applet.

Barvanje vsakega okvirja

Kar ostane, je barvanje vsakega okvirja. V prejšnjih primerih pokličemo prebarvati () za vsak okvir, kar povzroča programčke barva () metoda, ki jo je treba poklicati. Primer3Applet ima barva () metoda, ki na zaslon nariše številko trenutnega okvira.

Tu je Primer3Applet v akciji, ki mu sledi seznam kod.

Opomba:

Če določite, da je hitrost sličic zelo visoka (recimo 100 sličic na sekundo), se teči () metoda bo poklicala prebarvati () 100-krat na sekundo. Vendar to ne bo vedno povzročilo 100 klicev na barva () na sekundo, ker ko boste zahtevo za prebarvanje izdali prehitro, bodo strnjene v posodobitev na enem zaslonu. To je razlog, zakaj sledimo trenutni številki okvirja v teči () metoda namesto v barva () metoda.

Ustvarjanje grafike

Zdaj pa animirajmo nekaj, kar je malo težje narisati. Example4Applet nariše kombinacijo sinusnih valov. Za vsako koordinato x nariše kratko navpično črto. Vse te vrstice skupaj tvorijo preprost graf, ki se spreminja za vsak okvir. Žal boste ugotovili, da ta pristop povzroča veliko utripanja. Vzrok utripanja in nekaj rešitev bomo razložili v naslednjem poglavju.

Tukaj je Example4Applet v akciji, ki mu sledi seznam kod.

Izogibanje pretiranemu utripanju

Utripanje, ki ga vidite v Primer4Applet, ima dva vzroka: barvanje vsakega okvira traja predolgo (zaradi količine izračuna, ki je potrebna med prebarvanjem) in celotno ozadje se pred tem očisti barva () je poklican. Medtem ko se izračunava naslednji okvir, uporabnik vidi ozadje animacije.

Ta kratek čas med čiščenjem ozadja in slikanjem sinusnega vala je videti kot blisk. Na nekaterih platformah, kot je osebni računalnik, je utripanje bolj očitno kot na X Windows. Razlog je v tem, da je grafika X Windows medpomnjena, zaradi česar je bliskavica nekoliko krajša.

Utripanje lahko močno zmanjšate z dvema preprostima trikoma: izvajanje nadgradnja() metoda in z dvojnim medpomnjenjem (včasih znano tudi kot z uporabo povratnega odbojnika).

Preglasitev metode update ()

Ko AWT prejme zahtevo za prebarvanje za programček, pokliče programček nadgradnja() metoda. Privzeto je nadgradnja() metoda počisti ozadje programčka in nato pokliče barva () metoda. S preglasitvijo nadgradnja() metoda za vključitev risarske kode, ki je bila prej v barva () metode, se izognemo, da bi z vsako prebarvanjem počistili celotno površino programčka.

Zdaj, ko ozadje ni več samodejno odstranjeno, moramo to storiti sami v nadgradnja() metoda. Zdaj lahko pred risanjem nove črte posamično izbrišemo vsako navpično črto grafa, tako da utripanje popolnoma odstranimo. Ta učinek je prikazan v programu Example5Applet.

Tu je Primer5Applet v akciji, ki mu sledi seznam kod.

Opomba:

Kadarkoli preglasite nadgradnja() še vedno morate izvesti barva (). To je zato, ker barva () metoda samodejno pokliče sistem za risanje AWT, kadar koli pride do "poškodbe" na območju risanja programčka - na primer, ko se okno, ki zakriva del območja risanja programčka, odstrani z zaslona. Vaš barva () izvedba lahko preprosto pokliče nadgradnja().

Dvojno medpomnjenje

Drug način za zmanjšanje utripanja med sličicami je uporaba dvojnega medpomnjenja. Ta tehnika se uporablja v številnih animacijskih programčkih.

Splošno načelo je, da ustvarite sliko zunaj zaslona, ​​v sliko narišete okvir in nato z enim klicem celotno sliko udarite na zaslon. drawImage (). Prednost je, da se večina risb naredi zunaj zaslona. Končno barvanje slike zunaj zaslona na zaslon je običajno veliko bolj učinkovito kot slikanje okvirja neposredno na zaslon.

Applet sinusnega vala z dvojnim medpomnjenjem je prikazan v Primeru 6Applet. Videli boste, da je animacija precej gladka in pri risanju okvirja ne potrebujete posebnih trikov. Edina pomanjkljivost je, da morate dodeliti sliko zunaj zaslona, ​​ki je velika kot območje risbe. Če je območje risanja zelo veliko, bo to morda zahtevalo precej pomnilnika.

Tukaj je Example6Applet v akciji, ki mu sledi seznam kod.

Opomba:

Ko uporabljate dvojno medpomnjenje, morate preglasiti nadgradnja() , ker ne želite, da se ozadje programčka očisti, preden pobarvate okvir. (Ozadje počistite sami tako, da narišete sliko zunaj zaslona.)

Uporaba slik

Zdaj bomo prepisali paintFrame () metoda z metodo, ki animira nekatere slike. To težavi doda nekaj manjših zapletov. Slike so precej velike in se nalagajo postopoma. Popolnoma narisane slike lahko trajajo dolgo, še posebej, če jih nalagate po počasni povezavi. To je razlog, zakaj drawImage () metoda zavzame četrti argument, objekt ImageObserver. Opazovalec slike je objekt, ki je obveščen, ko prispe več slikovnih podatkov. Za pridobitev slik uporabljamo getImage () metoda.

Premikanje slike po zaslonu

Ta prvi programček za animacijo slik, Example7Applet, uporablja naslednji dve sliki:

world.gif: car.gif:

Za ozadje je uporabljena svetovna slika, na njej pa je dvakrat narisana slika avtomobila, kar ustvarja animacijo dveh avtomobilov, ki dirkata po vsem svetu.

Tukaj je Example7Applet v akciji, ki mu sledi seznam kod.

Prikaz zaporedja slik

Example8Applet prikazuje, kako ustvariti animacijo z uporabo ločenih slik za vsak okvir. Tu je 10 uporabljenih okvirjev:

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

T6.gif:

T7.gif:

T8.gif:

T9.gif:

T10.gif:

Za odpravo utripanja še vedno uporabljamo dvojno medpomnjenje. Razlog je v tem, da je vsaka slika, ki jo upodabljamo, delno prozorna, zato moramo vsak okvir izbrisati, preden narišemo naslednjega. To bi povzročilo utripanje brez dvojnega medpomnjenja.

Tukaj je Example8Applet v akciji, ki mu sledi seznam kod.

Opomba:

Pri prikazu zaporedja slik morate biti previdni, da jih pravilno poravnate. Najlažji način je zagotoviti, da so slike enake velikosti in jih je mogoče risati na istem položaju. V nasprotnem primeru bo moral vaš programček narisati vsak okvir z drugačnim zamikom.

Uporaba MediaTrackerja, da se izognete postopnemu prikazu

Ko program Java naloži sliko, jo lahko prikaže, preden je slika popolnoma naložena. Uporabnik vidi sliko, ki je upodobljena najprej nepopolno, nato pa postopoma vedno bolj in bolj v celoti, ko se slika naloži. Ta inkrementalni zaslon daje uporabniku povratne informacije (izboljšanje zaznane zmogljivosti) in programu omogoča enostavno izvajanje drugih nalog med nalaganjem slike.

Kar zadeva animacijo, je lahko postopni prikaz slik koristen za slike v ozadju, vendar je lahko zelo moteč, kadar se uporablja za animirane slike. Zato je včasih zaželeno, da pred prikazom počakate, da se naloži celotna animacija.

Lahko uporabite Jim Graham MediaTracker razred za sledenje nalaganju slik, kar zakasni prikaz animacije, dokler se celoten sklop slik ne prenese v celoti. Example9Applet prikazuje, kako uporabljati MediaTracker razred za prenos slik za mahajočo Duke animacijo.

Tu je Primer9Applet v akciji, ki mu sledi seznam kod.

Dodajanje zvoka

Zvoku je enostavno dodati animacijo. Lahko uporabite getAudioClip () metoda za pridobitev predmeta AudioClip. Kasneje lahko posnetek predvajate kot neprekinjeno zanko ali kot en zvok. Primer10Applet prikazuje, kako med animacijo predvajati neprekinjen zvok v ozadju in ponavljajoč se zvok.

Tukaj je primer10Applet v akciji, ki mu sledi seznam kod.

Opomba:

Med predvajanjem neprekinjenega zvoka ne pozabite, da ga ustavite, ko uporabnik zapusti stran (tj. To storite v programu stop () metoda).

Še ena opomba:

Neprekinjen zvok je lahko zelo moteč. Dobro je, da uporabniku omogočite, da izklopi zvok, ne da bi zapustil stran. Ko uporabnik klikne na programček, lahko vnesete gumb ali preprosto izklopite zvok.

Nasveti za hitrejše nalaganje slik

Prenos animacije, ki uporablja veliko slik, bo trajal dlje časa. To je predvsem posledica dejstva, da je za vsako slikovno datoteko vzpostavljena nova povezava HTTP, vzpostavitev povezave pa lahko traja tudi nekaj sekund, tudi če je pasovne širine dovolj.

V tem razdelku vam bomo povedali o dveh oblikah slik, s katerimi lahko vaš programček pospeši prenos slik.

Uporaba slikovnega traku

Učinkovitost prenosa lahko izboljšate z uporabo ene same slike, ki vsebuje več okvirjev animacije. S sliko lahko upodobite en sam okvir iz slike clipRect () operater. Spodaj je primer slikovnega traku, ki se uporablja v programčku UnderConstruction.

Applet ustvari učinek vrtanja, tako da ne izbriše prejšnjih okvirjev. Ozadje se očisti le vsake toliko časa.

Tu je UnderConstruction v akciji s povezavo do izvorne kode.

Stiskanje med sličicami s pomočjo Flic

Če res želite izboljšati zmogljivost prenosa animacije, sestavljene iz več okvirjev, morate uporabiti neko obliko stiskanja med sličicami.

Orodja za animacijo

V tem trenutku (januar 1996) je na voljo malo orodij, ki vam bodo pomagala ustvarjati animacije, ki jih poganja Java. Najboljše orodje, ki sem ga našel, je Easy Animator (TEA) (prej znan kot JAM) podjetja DimensionX. Omogoča interaktivno ustvarjanje animacij. Radi bi spodbudili razvijalce, naj napišejo več orodij za ustvarjanje animacij v Javi.

Če imate za prikaz nekaj pripravljenih slik, lahko uporabite programček Animator. Animator ima veliko parametrov, ki vam omogočajo, da določite neprekinjene zvoke, zvoke, značilne za okvir, posamezne časovne okvire in položaje, zagonsko sliko, vrstni red sličic itd.

Oglejte si tudi stran Gamelan Animation, kjer najdete veliko programčkov, ki uporabljajo animacijo.

Zaključek

Upam, da bo ta članek razvijalcem programčkov pomagal napisati več in boljše animacijske programčke. Upam tudi, da bodo kmalu na voljo boljša orodja.

Arthur van Hoff je bil do nedavnega višji kadrovski inženir v podjetju Sun Microsystems in je pri razvoju jezika Java sodeloval od leta 1993. Je avtor prvega prevajalnika Java, ki je v celoti napisan na Javi. Pred kratkim je zapustil Sun, da bi skupaj s Sami Shaio, Kim Polese in Jonathanom Payneom ustanovil novo podjetje. Novo podjetje se bo osredotočilo na izdelavo aplikacij Java. Kathy Walrath je tehnična pisateljica pri Sun Microsystems. Od leta 1993 je del ekipe Java. Trenutno sodeluje z Mary Campione pri vadnici Java: objektno usmerjeno programiranje za internet, vadnici z dodatki za učenje jezika Java, programiranju apletov in programiranju Java GUI . Poleg tega, da je na voljo v spletu, bo letos poleti objavljen tudi Vadnica za Java, ki bo del serije Addison-Wesley Java.

To zgodbo z naslovom "Animacija v apletih Java" je prvotno objavil JavaWorld.

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