Programavimas

Animacija „Java“ programėlėse

Šiame straipsnyje aprašoma, kaip įdiegti animaciją naudojant „Java“ programėlės API. Joje aprašomos dažniausiai naudojamos technikos ir pateikiamas paprastas kiekvienos technikos pavyzdys.

Pagrindinės animacijos technikos

„Java“ programoje yra daugybė animacijos formų. Visiems jiems būdinga tai, kad jie sukuria tam tikrą judesį ekrane, piešdami vienas po kito einančius kadrus gana dideliu greičiu (paprastai apie 10–20 kartų per sekundę).

Pirmiausia sukursime paprastą šablono programėlę animacijoms kurti ir lėtai ją tobulinsime, kol pasieksime gana pilną programėlę.

Naudojant siūlą

Norėdami atnaujinti ekraną kelis kartus per sekundę, turite sukurti naują „Java“ giją, kurioje yra animacijos kilpa. Animacijos ciklas yra atsakingas už dabartinio kadro stebėjimą ir periodiškų ekrano atnaujinimų prašymą. Norėdami įdiegti giją, turite sukurti poklasį Siūlas arba laikytis Bėgama sąsaja.

Dažna klaida yra animacijos ciklo įdėjimas į dažyti() programėlės metodas. Tai padarius, bus keistas šalutinis poveikis, nes jis palaiko pagrindinį AWT siūlą, kuris yra atsakingas už visus piešinius ir įvykių tvarkymą.

Kaip pavyzdį parašiau mažą šablono programėlę, pavadintą „Example1Applet“, kuri iliustruoja bendrą animacijos programėlės kontūrą. 1 pavyzdys „Applet“ parodo, kaip sukurti giją ir iškviesti perdažyti () metodas fiksuotais intervalais. Kadrų skaičius per sekundę nurodomas perduodant programėlės parametrą. Štai pavyzdys, ką įdėtumėte į savo HTML dokumentą:

Štai pavyzdys1Applet.

Pastaba:

Ši programėlė iš tikrųjų dar nieko nepiešia ekrane. Piešimas prie ekrano paaiškinamas vėliau. Taip pat atkreipkite dėmesį, kad programėlė sunaikina savo animacijos giją, kai tik vartotojas palieka puslapį (dėl kurio atsiranda programėlė sustabdyti() metodas). Tai užtikrina, kad programėlė nepraleis procesoriaus laiko, kol jos puslapis nebus matomas.

Nuolatinis kadrų dažnis

Ankstesniame pavyzdyje programėlė tiesiog miega tam tikrą laiką tarp kadrų. Tai turi trūkumą, kurio kartais lauki per ilgai. Norėdami gauti 10 kadrų per sekundę, neturėtumėte laukti 100 milisekundžių tarp kadrų, nes prarandate laiko tiesiog paleisdami giją.

Šis programėlė „Example2Applet“ parodo, kaip praleisti geresnį laiką. Jis tiesiog apskaičiuoja teisingą vėlavimą tarp kadrų, stebėdamas pradžios laiką. Jis apskaičiuoja numatomą reikalingą vėlavimą tarp kadrų pagal dabartinį laiką.

Čia yra „Example2Applet“.

Kiekvieno rėmo dažymas

Lieka nupiešti kiekvieną rėmą. Ankstesniuose pavyzdžiuose mes skambiname perdažyti () kiekvienam kadrui, dėl kurio atsiranda programėlė dažyti() metodas turi būti vadinamas. „Example3Applet“ turi dažyti() metodas, kuris pritraukia dabartinio kadro skaičių į ekraną.

Čia yra 3 pavyzdžio „Applet“ veiksmas, po kurio pateikiamas kodų sąrašas.

Pastaba:

Jei nurodysite, kad kadrų dažnis yra labai didelis (tarkime, 100 kadrų per sekundę), paleisti () metodas skambins perdažyti () 100 kartų per sekundę. Tačiau ne visada tai bus 100 skambučių dažyti() per sekundę, nes kai per greitai pateiksite perdažymo užklausą, jie bus sutraukti į vieno ekrano atnaujinimą. Štai kodėl mes stebime dabartinį kadro numerį paleisti () metodas, o ne dažyti() metodas.

Grafikos generavimas

Dabar animuokime tai, ką nupiešti yra šiek tiek sunkiau. „Example4Applet“ piešia sinusinių bangų derinį. Kiekvienai x koordinatei ji nubrėžia trumpą vertikalią liniją. Visos šios eilutės kartu sudaro paprastą grafiką, kuris keičiasi kiekvienam kadrui. Deja, pastebėsite, kad šis požiūris sukelia daug mirksėjimo. Mirksėjimo priežastis ir kai kurias priemones paaiškinsime kitame skyriuje.

Čia yra veiksmo „4 pavyzdys“, po kurio pateikiamas kodų sąrašas.

Venkite pernelyg didelio mirksėjimo

Mirksėjimas, kurį matote pavyzdyje 4Applet, turi dvi priežastis: kiekvieno kadro dažymas užtrunka per ilgai (dėl per daug dažyti reikalingo skaičiavimo kiekio), o prieš tai išvalomas visas fonas. dažyti() vadinamas. Kol skaičiuojamas kitas kadras, vartotojas mato animacijos foną.

Šis trumpas laikas tarp fono išvalymo ir sinusinės bangos tapymo yra matomas kaip blykstė. Kai kuriose platformose, tokiose kaip asmeninis kompiuteris, mirksėjimas yra akivaizdesnis nei „X Windows“. Priežastis ta, kad „X Windows“ grafika yra buferinė, todėl blykstė yra šiek tiek trumpesnė.

Galite labai sumažinti mirksėjimą naudodami du paprastus triukus: atnaujinti () metodas ir naudojant dvigubą buferį (kartais žinomą kaip naudojant atbulinį buferį).

Naujinimo () metodo nepaisymas

Kai AWT gauna perdažymo užklausą dėl programėlės, jis iškviečia programėles atnaujinti () metodas. Pagal numatytuosius nustatymus atnaujinti () metodas išvalo programėlės foną ir paskambina dažyti() metodas. Nepaisydamas atnaujinti () metodas įtraukti piešimo kodą, kuris anksčiau buvo dažyti() metodo, vengiame, kad kaskart perdažant būtų išvalyta visa programėlės sritis.

Dabar, kai fonas nebėra išvalomas automatiškai, turime tai padaryti patys atnaujinti () metodas. Dabar, prieš nubrėždami naują liniją, galime ištrinti kiekvieną vertikalią grafiko liniją, visiškai pašalindami mirksėjimą. Šis efektas parodytas 5Applet pavyzdyje.

Štai veiksmas „5Applet“, po kurio pateikiamas kodų sąrašas.

Pastaba:

Kai nepaisysite atnaujinti () metodą, vis tiek turite įgyvendinti dažyti(). Taip yra todėl, kad dažyti() metodą AWT piešimo sistema iškviečia tiesiogiai, kai „sugadinama“ programėlės piešimo sritis - pavyzdžiui, kai iš ekrano pašalinamas langas, užstojantis dalį programėlės piešimo srities. Tavo dažyti() įgyvendinimas gali tiesiog paskambinti atnaujinti ().

Dvigubas buferis

Kitas būdas sumažinti mirksėjimą tarp kadrų yra dvigubo buferio naudojimas. Ši technika naudojama daugelyje animacijos programėlių.

Bendras principas yra tas, kad sukuriate vaizdą ne ekrane, piešiate rėmelį į vaizdą ir tada vienu skambučiu paskleidžiate visą vaizdą į ekraną. drawImage (). Privalumas yra tas, kad didžioji dalis piešimo daroma ne ekrane. Galutinis ekrano atvaizdo dažymas ekrane paprastai yra daug efektyvesnis nei rėmelio dažymas tiesiai į ekraną.

Sinusinės bangos programėlė su dvigubu buferiu parodyta 6Applet pavyzdyje. Pamatysite, kad animacija yra gana sklandi ir jums nereikia jokių specialių triukų piešiant rėmelį. Vienintelis trūkumas yra tas, kad turite priskirti ne ekrano vaizdą, kuris yra toks pat didelis kaip piešimo plotas. Jei piešimo plotas yra labai didelis, tai gali pareikalauti gana daug atminties.

Čia yra pavyzdys „6Applet“, po kurio pateikiamas kodų sąrašas.

Pastaba:

Kai naudojate dvigubą buferį, turite nepaisyti atnaujinti () metodą, nes prieš dažant rėmą nenorite, kad apleto fonas būtų išvalytas. (Jūs pats išvalote foną, piešdami prie ekrano atvaizdo.)

Naudojant vaizdus

Dabar mes perrašysime paintFrame () metodas su metodu, kuris animuoja kai kuriuos vaizdus. Tai prideda keletą nedidelių problemos komplikacijų. Vaizdai yra gana dideli ir jie kraunami palaipsniui. Gali praeiti daug laiko, kol vaizdai bus visiškai nupiešti, ypač kai juos įkeliate per lėtą ryšį. Tai yra priežastis, kodėl drawImage () metodas užima ketvirtą argumentą - „ImageObserver“ objektą. Vaizdo stebėtojas yra objektas, apie kurį pranešama, kai gaunama daugiau vaizdo duomenų. Norėdami gauti vaizdus, ​​kuriuos naudojame „getImage“ () metodas.

Vaizdo perkėlimas per ekraną

Šioje pirmojoje vaizdus animuojančioje programėlėje „Example7Applet“ naudojami šie du vaizdai:

world.gif: car.gif:

Pasaulio vaizdas naudojamas kaip fonas, o automobilio vaizdas du kartus piešiamas ant jo, sukuriant dviejų visame pasaulyje lenktyniaujančių automobilių animaciją.

Čia yra pavyzdys „7Applet“, po kurio pateikiamas kodų sąrašas.

Vaizdų sekos rodymas

8 pavyzdys „Applet“ parodo, kaip sukurti animaciją naudojant atskirus kiekvieno kadro vaizdus. Štai 10 naudojamų rėmelių:

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

T6.gif:

T7.gif:

T8.gif:

T9.gif:

T10.gif:

Mes vis dar naudojame dvigubą buferį, kad pašalintume mirksėjimą. Priežastis ta, kad kiekvienas atvaizduojamas vaizdas yra iš dalies skaidrus, todėl prieš piešdami kitą, turime ištrinti kiekvieną kadrą. Tai sukeltų mirksėjimą be dvigubo buferio.

Štai veiksmas „8Applet“, po kurio pateikiamas kodų sąrašas.

Pastaba:

Rodydami vaizdų sekas, turite būti atsargūs, kad tinkamai sulygiuotumėte vaizdus. Lengviausias būdas yra įsitikinti, kad visi vaizdai yra vienodo dydžio ir gali būti piešiami toje pačioje vietoje. Jei taip nėra, jūsų programėlė turės kiekvieną rėmelį piešti skirtingu poslinkiu.

„MediaTracker“ naudojimas siekiant išvengti laipsniško rodymo

Kai „Java“ programa įkelia vaizdą, ji gali jį atvaizduoti, kol vaizdas dar nėra visiškai įkeltas. Vartotojas mato, kad vaizdas atvaizduojamas pirmiausia neišsamus, o po to palaipsniui visiškiau, kai vaizdas įkeliamas. Šis laipsniškas ekranas suteikia vartotojui grįžtamąjį ryšį (pagerina suvokiamą našumą) ir leidžia programai lengvai atlikti kitas užduotis, kol vaizdas kraunamas.

Kai kalbama apie animaciją, laipsniškas vaizdo rodymas gali būti naudingas fono paveikslėliams, tačiau jis gali labai blaškyti, kai naudojamas animuotiems vaizdams. Todėl prieš rodant, kartais pageidautina palaukti, kol bus įkelta visa animacija.

Galite naudoti Jim Graham's „MediaTracker“ klasę stebėti vaizdų atsisiuntimą, atidedant animacijos rodymą, kol visas vaizdų rinkinys bus visiškai atsisiųstas. 9 pavyzdys „Applet“ parodo, kaip naudoti „MediaTracker“ klasę atsisiųsti vaizdus banguojančiai kunigaikščio animacijai.

Štai veiksmas „9Applet“, po kurio pateikiamas kodų sąrašas.

Pridedamas garsas

Lengva pridėti garsą prie animacijos. Galite naudoti „getAudioClip“ () būdas gauti „AudioClip“ objektą. Vėliau klipą galite groti kaip nepertraukiamą kilpą arba kaip vieną garsą. „10Applet“ pavyzdys rodo, kaip animacijos metu galima groti nenutrūkstamą foninį ir pasikartojantį garsą.

Čia yra „10Applet“ veiksmas, po kurio pateikiamas kodų sąrašas.

Pastaba:

Leisdami nepertraukiamą garsą, turite nepamiršti jį sustabdyti, kai vartotojas palieka puslapį (t. Y. Atlikite tai savo programėlėje) sustabdyti() metodas).

Kita pastaba:

Nuolatinis garsas gali būti labai erzinantis. Patartina suteikti vartotojui galimybę išjungti garsą neišeinant iš puslapio. Galite pateikti mygtuką arba tiesiog išjungti garsą, kai vartotojas spustelėja programėlę.

Patarimai, kaip greičiau įkelti vaizdus

Animaciją, naudojančią daug vaizdų, atsisiųsti reikės daug laiko. Tai daugiausia lemia tai, kad kiekvienam vaizdo failui sukuriamas naujas HTTP ryšys, o ryšys gali užtrukti kelias sekundes, net jei yra daug pralaidumo.

Šiame skyriuje mes jums pasakysime apie du vaizdo formatus, kuriuos jūsų programėlė gali naudoti norėdami greičiau atsisiųsti vaizdus.

Vaizdo juostos naudojimas

Galite pagerinti atsisiuntimo našumą naudodami vieną vaizdą, kuriame yra keli animacijos rėmai. Galite atvaizduoti vieną kadrą iš vaizdo naudodami „clipRect“ () operatorius. Žemiau pateikiamas vaizdo juostos, naudojamos „UnderConstruction“ programėlėje, pavyzdys.

Appletas sukuria gręžimo efektą neištrindamas ankstesnių rėmelių. Fonas išvalomas tik taip dažnai.

Štai „UnderConstruction“ veikia su nuoroda į jos šaltinio kodą.

Tarp kadrų suspaudimas naudojant „Flic“

Jei tikrai norite pagerinti animacijos, susidedančios iš kelių kadrų, atsisiuntimo našumą, turite naudoti tam tikrą tarp kadrų glaudinimo formą.

Animacijos įrankiai

Šiuo metu (1996 m. Sausio mėn.) Yra keletas įrankių, kurie padės kurti „Java“ valdomas animacijas. Geriausias įrankis, kurį galėjau rasti, yra „DimensionX“ sukurtas „The Easy Animator“ (TEA) (anksčiau žinomas kaip JAM). Tai leidžia interaktyviai kurti animacijas. Mes norėtume paraginti kūrėjus parašyti daugiau įrankių animacijoms kurti „Java“.

Jei turite kelis paruoštus vaizdus, ​​kuriuos galite rodyti, galite naudoti „Animator“ programėlę. „Animator“ turi daug parametrų, leidžiančių nurodyti nenutrūkstamus garsus, specifinius kadrų garsus, individualų kadro laiką ir pozicijas, paleidimo vaizdą, kadrų tvarkymą ir pan.

Taip pat turėtumėte apsilankyti „Gamelan Animation“ puslapyje ir rasti daug programėlių, naudojančių animaciją.

Išvada

Tikiuosi, kad šis straipsnis padės programėlių kūrėjams parašyti daugiau ir geresnių animacijos programėlių. Taip pat tikiuosi, kad netrukus atsiras geresnių priemonių.

Arthuras van Hoffas dar neseniai buvo „Sun Microsystems“ vyresnysis personalo inžinierius ir nuo 1993 m. Dalyvavo kuriant „Java“ kalbą. Jis yra pirmojo „Java“ kompiliatoriaus, parašyto tik „Java“, autorius. Neseniai jis paliko „Sun“ ir sudarė naują įmonę kartu su Sami Shaio, Kim Polese ir Jonathanu Payne'u. Naujoji įmonė sutelks dėmesį į „Java“ programų kūrimą. Kathy Walrath yra „Sun Microsystems“ technikos rašytoja. Ji yra „Java“ komandos dalis nuo 1993 m. Šiuo metu ji dirba su Mary Campione „The Java Tutorial: Object-Oriented Programming for Internet“, programėlių patobulinta mokymo programa, skirta mokytis „Java“ kalbos, programėlių programavimas ir „Java GUI“ programavimas. . Be to, kad „Java“ mokymo programa bus prieinama internete, šią vasarą taip pat bus paskelbta kaip „Addison-Wesley Java“ serijos dalis.

Šią istoriją „Animacija„ Java “programėlėse“ iš pradžių paskelbė „JavaWorld“.

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