VSˇB – Technicka´ univerzita Ostrava Fakulta elektrotechniky a informatiky Katedra informatiky
Vektorovy´ anima´tor Vector animator
2009
Bc. Karel Sˇuta
Zada´nı´ Te´ma: Vektorovy´ anima´tor
Za´sady pro vypracova´nı´: Cı´lem pra´ce je vytvorˇit analy´zu na´stroje pro jednoduche´ vytva´rˇenı´ animacı´, ktere´ budou vyuzˇity pro vy´ukove´ u´cˇely. Soucˇa´stı´ pra´ce bude take´ prototypova´ aplikace takove´hoto anima´toru. Anima´tor by meˇl spojit vy´hody Microsoft PowerPointu (snadne´ vytva´rˇenı´ jednoduchy´ch animacı´) a naprˇ´ıklad programu Stickman 5. Anima´tor by meˇl splnˇovat tyto za´kladnı´ rysy: • Vytva´rˇenı´ za´kladnı´ch graficky´ch obrazcu˚ (cˇa´ra, cˇtverec, kruh, text) a jejich kombinacı´. • Prˇida´va´nı´ prˇedefinovany´ch animacı´ nebo jejich kombinacı´ jako jsou posun, zveˇtsˇenı´, zmizenı´ a dalsˇ´ı. Animace by meˇli jı´t prˇida´vat k jednotlivy´m objektu˚m, ke skupina´m objektu˚ nebo pouze k objektu˚m uvnitrˇ skupiny. • Mozˇnost editace cˇasove´ osy a vza´jemna´ na´vaznost jednotlivy´ch animacı´, jak sekvencˇnı´ tak paralelnı´. • Mozˇnost prˇichytit a propojit jednotlive´ objekty mezi sebou. Toto propojenı´ pak musı´ by´t zachova´no i v pru˚beˇhu animace.
Vedoucı´: Ing. David Jezˇek
Obor: 2612T025 Informatika a vy´pocˇetnı´ technika
Akademicky´ rok: 2008/2009
Prohlasˇuji, zˇe jsem tuto diplomovou pra´ci vypracoval samostatneˇ. Uvedl jsem vsˇechny litera´rnı´ prameny a publikace, ze ktery´ch jsem cˇerpal.
V Ostraveˇ 5. kveˇtna 2009
.............................
Abstrakt Tato pra´ce se zaby´va´ analy´zou a na´vrhem jednoduche´ho animacˇnı´ho programu. Tento program by meˇl slouzˇit pro u´cˇely vy´uky. V analyticke´ cˇa´sti te´to pra´ce jsou analyzova´ny vhodne´ vlastnosti tohoto programu, potencia´l pro pozˇitı´ na´vrhovy´ch vzoru˚ prˇi jeho na´vrhu a implementaci a da´le analy´za mozˇnostı´ vyuzˇitı´ knihoven a na´stroju˚ pro usnadneˇnı´ implementace. V na´vrhove´ cˇa´sti te´to pra´ce jsou navrzˇeny a podrobneˇ rozepsa´ny trˇ´ıdnı´ a stavove´ diagramy pro vsˇechny trˇ´ıdy tohoto programu. Da´le se tato pra´ce veˇnuje potencia´lnı´m mozˇnostem rozsˇ´ırˇenı´ nebo modifikace navrzˇene´ aplikace. V za´veˇru pra´ce je uvedeno zhodnocenı´ potencia´lu aplikace a jejı´ mozˇnosti. Klı´cˇova´ slova: LATEX, diplomova´ pra´ce, analy´za, na´vrhovy´ vzor, trˇ´ıdnı´ diagram, sekvencˇnı´ diagram, animace, Java
Abstract This work deals with analysis and design of simply animation application. This application should serve to education purposes. In analysis part of this work are analysed desirable features of this application, potencial for using of design patterns for design part of this work and for implementation and analysis of possibility for using libraries and tools for simplification of implementation. In design part of this work are designed and closely described class diagrams and state diagrams for all classes of this program. Next part of this work deals with possibilities of upgrading or modification of this application. In conclusion of this work is evaluated potential of this application and its possibilities. Keywords: LATEX, master thesis, analysis, design pattern, class diagram, sequential diagram, animation, Java
1
Obsah 1
´ vod U
3
2
Analy´za vlastnostı´ animacˇnı´ho programu 2.1 Analy´za vlastnostı´ animacı´ v programu Microsoft PowerPoint . . . . . . . 2.2 Analy´za vlastnostı´ animacı´ v programu Stickman 5 . . . . . . . . . . . . . 2.3 Analy´za vlastnostı´ vytva´rˇene´ho vektorove´ho anima´toru . . . . . . . . . .
4 4 5 6
3
Analy´za mozˇnostı´ pouzˇitı´ na´vrhovy´ch vzoru˚
7
4
Analy´za mozˇnostı´ pouzˇitı´ knihoven a pomocny´ch na´stroju˚
8
5
Na´vrh aplikace - trˇı´dnı´ diagramy 5.1 Trˇ´ıdnı´ diagram balı´ku˚ a jejich struktury . . . . . . . . . . . . . . . . 5.2 Balı´k dialog.dlgMain . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Balı´k dialog.dlgMain.state . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Balı´ky dialog.dlgMain.action a dialog.dlgMain.action.mouseAction 5.5 Balı´k dialog.dlgMain.action.dlgAction . . . . . . . . . . . . . . . . . 5.6 Balı´k dialog.animation . . . . . . . . . . . . . . . . . . . . . . . . . . 5.7 Balı´k dialog.listener . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.8 Balı´k dialog.object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.9 Trˇ´ıdnı´ diagram balı´ku˚ rules . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
9 9 9 10 13 15 17 19 20 23
Na´vrh aplikace - sekvencˇnı´ diagramy za´kladnı´ch funkcı´ 6.1 Sekvencˇnı´ diagram pouzˇitı´ na´vrhove´ho vzoru Factory . 6.2 Sekvencˇnı´ diagram pouzˇitı´ na´vrhove´ho vzoru State . . 6.3 Sekvencˇnı´ diagram klonova´nı´ registru˚ kreslı´cı´ho pla´tna 6.4 Sekvencˇnı´ diagram klonovacı´ metody . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
25 25 25 25 28
. . . . . . .
29 29 29 30 30 30 31 31
6
7
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
Potencia´lnı´ mozˇnosti rozsˇı´rˇenı´ aplikace 7.1 Prˇida´nı´ zobrazovane´ komponenty . . . . . . . . . . . . . . . . . . 7.2 Prˇida´nı´ za´kladnı´ho kreslene´ho objektu . . . . . . . . . . . . . . . . 7.3 Prˇida´nı´ nove´ho typu animace . . . . . . . . . . . . . . . . . . . . . 7.4 Prˇida´nı´ nove´ho stavu aplikace . . . . . . . . . . . . . . . . . . . . . 7.5 Prˇida´nı´ nove´ho posluchacˇe . . . . . . . . . . . . . . . . . . . . . . ´ prava algoritmu pro vy´pocˇet transformacı´ nava´zany´ch objektu˚ 7.6 U 7.7 Modifikace a prˇida´va´nı´ atributu˚ kresleny´ch objektu˚ . . . . . . . .
. . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
8
Pru˚beˇh animace
32
9
Za´veˇr
34
10 Literatura
35
2
Seznam obra´zku˚ 1 2 3 4 5 6 7 8 9 10 11 12 13
Trˇ´ıdnı´ diagram balı´ku˚ . . . . . . . . . . . . . . . . . . . . . . . . . . Balı´k dialog.dlgMain . . . . . . . . . . . . . . . . . . . . . . . . . . . Balı´k dialog.dlgMain.state . . . . . . . . . . . . . . . . . . . . . . . . Balı´ky dialog.dlgMain.action a dialog.dlgMain.action.mouseAction Balı´k dialog.dlgMain.action.dlgAction . . . . . . . . . . . . . . . . . Balı´k dialog.animation . . . . . . . . . . . . . . . . . . . . . . . . . . Balı´k dialog.listener . . . . . . . . . . . . . . . . . . . . . . . . . . . . Balı´k dialog.object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Balı´k rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Metoda notifyChange . . . . . . . . . . . . . . . . . . . . . . . . . . Metoda execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Metoda cloneCanvas . . . . . . . . . . . . . . . . . . . . . . . . . . . Metoda getNewInstance . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
10 11 12 14 16 18 20 21 24 26 26 27 28
3
1
´ vod U
Tato diplomova´ pra´ce se zaby´va´ analy´zou a na´vrhem animacˇnı´ho programu pro vytva´rˇenı´ jednoduchy´ch animacı´. Soucˇa´stı´ pra´ce je take´ vytvorˇenı´ prototypove´ho animacˇnı´ho programu. V prvnı´ cˇa´sti pra´ce jsou analyzova´ny vlastnosti animacˇnı´ho programu. Nejdrˇ´ıve jsou analyzova´ny vlastnosti podobny´ch animacˇnı´ch programu˚ pro vytvorˇenı´ prˇedstavy o vhodny´ch vlastnostech a rˇesˇenı´ mozˇny´ch proble´mu˚. Dalsˇ´ı cˇa´st se zaby´va´ analy´zou vhodny´ch na´vrhovy´ch vzoru˚ pro pouzˇitı´ v animacˇnı´m programu. K teˇmto na´vrhovy´m vzoru˚m je take´ analyzova´no jejich vyuzˇitı´ ve strukturˇe aplikace. Da´le je analyzova´no mozˇne´ vyuzˇitı´ knihoven a pomocny´ch na´stroju˚ pro zjednodusˇenı´ a zrychlenı´ implementace a vlastnı´ho fungova´nı´ programu. K teˇmto knihovna´m a na´stroju˚m jsou uvedeny vlastnosti a mozˇnost jejich vyuzˇitı´. Dalsˇ´ı cˇa´st pra´ce se zaby´va´ na´vrhem aplikace a to konkre´tneˇ trˇ´ıdnı´mi diagramy. Nejdrˇ´ıve je uveden prˇehled a nava´za´nı´ jednotlivy´ch balı´ku˚ obsahujı´cı´ch konkre´tnı´ trˇ´ıdy. Da´le je podrobneˇ rozepsa´n a vysveˇtlen obsah kazˇde´ho balı´ku vcˇetneˇ jejich za´vislostı´ a vyuzˇitı´ externı´ch knihoven. Dalsˇ´ı cˇa´st ze zaby´va´ na´vrhem sekvencˇnı´ch diagramu˚ metod a funkcı´ aplikace. Jsou zde uvedeny diagramy hlavnı´ch metod a diagramy metod na´vrhovy´ch vzoru˚. Da´le je uveden seznam mozˇny´ch rozsˇ´ırˇenı´ aplikace nebo jejı´ modifikace vcˇetneˇ prˇesne´ho soupisu upravovany´ch mı´st a mı´st pro prˇida´nı´ metod nebo trˇ´ıd programu. Na konci je uveden detailnı´ pru˚beˇh programu a vola´nı´ metod prˇi animaci. Je zde konkre´tneˇ rozepsa´no vola´nı´ metod a na´vaznosti objektu˚ v pru˚beˇhu animace vcˇetneˇ vysveˇtlenı´ funkcı´ a du˚vodu˚ implementace pouzˇity´ch postupu˚.
4
2
Analy´za vlastnostı´ animacˇnı´ho programu
V tomto animacˇnı´m programu jsem se rozhodl spojit vy´hody vytva´rˇenı´ jednoduchy´ch animacı´ v Microsoft PowerPointu a vlastnostı´ programu Stickman 5. Do sve´ho programu jsem zahrnul kladne´ vlastnosti teˇchto programu˚ potrˇebne´ pro vektorovy´ anima´tor.
2.1
Analy´za vlastnostı´ animacı´ v programu Microsoft PowerPoint
Animace v programu Microsoft PowerPoint slouzˇ´ı jako podpu˚rny´ na´stroj pro vytva´rˇenı´ prezentacı´. Animace lze prova´deˇt s obra´zky nebo prˇedprˇipraveny´mi objekty jako textove´ objekty nebo jednoduche´ u´tvary jako obde´lnı´k, cˇa´ra, elipsa a u´tvary vznikle´ kombinacı´ prˇedchozı´ch. Tyto objekty lze na´sledneˇ upravit zmeˇnou meˇrˇ´ıtka, rotacı´ nebo posunem. ´ prava meˇrˇ´ıtka a posunu se prova´dı´ pouze po urcˇity´ch krocı´ch. U Animace se zde deˇlı´ na vstupnı´ animace obsahujı´cı´ animace vytva´rˇejı´cı´ dany´ objekt, vy´stupnı´ animace odstranˇujı´cı´ dany´ objekt, animace zmeˇny objektu umozˇnˇujı´cı´ naprˇ´ıklad zmeˇnu meˇrˇ´ıtka a animace pohybu upravujı´cı´ polohu objektu. Tyto animace lze prˇirˇadit k objektu a nebo skupineˇ objektu˚. Parametry animacı´ lze nastavit podle prˇa´nı´ uzˇivatele. Animace lze take´ cˇasovat - prˇirˇazovat zpozˇdeˇnı´ vzhledem k zacˇa´tku animace nebo prova´zat animace tak, aby zacˇ´ınaly soucˇasneˇ prˇ´ıpadneˇ aby animace zacˇala po ukoncˇenı´ prˇedchozı´ animace. Bohuzˇel prova´za´nı´ animacı´ funguje pouze vzhledem k prˇedchozı´ animaci. V prˇ´ıpadeˇ dvou komplexnı´ch animacı´ probı´hajı´cı´ch paralelneˇ se zde musı´ zbyle´ animace nastavit po kazˇde´ u´praveˇ cˇasova´nı´ jednotlive´ animace. Da´le objekty nelze na sebe nava´zat, takzˇe animace skupiny objektu˚ se realizuje stejneˇ jako animace jednotlivy´ch objektu˚ zvla´sˇt’. Zhodnocenı´ vlastnostı´: • Klady: – Jednoduche´ vytva´rˇenı´ objektu˚ pomocı´ prˇeddefinovany´ch objektu˚ a jejich kombinacı´. – Jednoducha´ manipulace s objekty pomocı´ upravovacı´ch bodu˚ objektu. – Krokova´nı´ prˇi u´praveˇ objektu zajisˇt’uje relativnı´ prˇesnost u´prav. – Jednoduche´ vytva´rˇenı´ velke´ho pocˇtu prˇeddefinovany´ch animacı´. – Animaci lze prˇideˇlit k objektu nebo skupineˇ objektu. – Animace je mozˇno cˇasovat a nava´zat. – Prˇehledna´ cˇasova´ osa animacı´. • Za´pory: – Nenı´ mozˇno nava´zat objekty tak, aby stav a pozice objektu byly upravova´ny vzhledem k modifikaci nava´zane´ho objektu. – Animace lze cˇasoveˇ nava´zat pouze k prˇedchozı´ animaci.
5
– Animace skupiny objektu˚ nebere v u´vahu jejich vza´jemne´ ovlivneˇnı´. – U animacı´ zmeˇny meˇrˇ´ıtka a rotace nelze nastavit referencˇnı´ bod, ten se musı´ simulovat paralelnı´m pohybem objektu. – Rozsah animace rotace a zmeˇny meˇrˇ´ıtka se da´ nastavit pouze pomocı´ procent, nelze nastavit pomocı´ rotace objektu.
2.2
Analy´za vlastnostı´ animacı´ v programu Stickman 5
Tento program slouzˇ´ı pro vytva´rˇenı´ plnohodnotny´ch animacı´. Je zameˇrˇeny´ na vytva´rˇenı´ animovany´ch obra´zku˚ pomocı´ bitmapove´ grafiky. Jednotlive´ objekty zde mohou by´t vza´jemneˇ propojeny. Propojenı´ v tomto programu je zajisˇt’ova´no pomocı´ tzv. kostry, kazˇdy´ bitmapovy´ objekt obsahuje body, ktere´ mohou by´t propojeny u´secˇkami pevne´ de´lky. Body sousednı´ch objektu˚ jsou u prova´zany´ch objektu˚ spojeny. Prˇi zmeˇneˇ polohy bodu dojde k u´praveˇ nava´zany´ch bodu˚ objektu tak, aby u´secˇka spojujı´cı´ tyto body meˇla porˇa´d stejnou de´lku. Animace se v tomto programu vytva´rˇ´ı pomocı´ modifikace objektu˚ a prˇirˇazova´nı´ celkove´ho stavu vsˇech objektu˚ na cˇasovou osu. Cˇasova´ osa je stupnˇova´na pomocı´ obra´zku˚, kdy pocˇet obra´zku˚ mezi jednotlivy´mi stavy urcˇuje rychlost te´ cˇa´sti animace. Modifikace a animace objektu˚ bere v u´vahu jejich vza´jemnou pozici, takzˇe naprˇ. prˇi rotaci nava´zany´ch objektu˚ se jejich vza´jemny´ sklon a umı´steˇnı´ nemeˇnı´. Zhodnocenı´ vlastnostı´ [6]: • Klady: – Existence kostry a propojenı´ objektu˚ umozˇnˇujı´cı´ jejich ovlivnˇova´nı´ modifikacı´ propojene´ho objektu. – Animace je tvorˇena´ pomocı´ zmeˇny pozice bodu˚ jednotlivy´ch objektu˚. – Jednoducha´ a prˇesna´ tvorba animacı´ pomocı´ mysˇi. – Jednoducha´ kombinace vı´ce animacı´. – Na´zorna´ cˇasova´ osa s prˇehledem stavu objektu˚ v krajnı´ch bodech jednotlivy´ch animacı´. • Za´pory: – Absence prˇeddefinovany´ch vektorovy´ch objektu˚. – Problematicka´ zmeˇna vza´jemne´ho cˇasova´nı´ jednotlivy´ch animacı´. – Slozˇiteˇjsˇ´ı tvorba novy´ch vektorovy´ch objektu˚.
6
2.3
Analy´za vlastnostı´ vytva´rˇene´ho vektorove´ho anima´toru
Vlastnosti vytva´rˇene´ho anima´toru vycha´zı´ ze za´kladnı´ funkcˇnosti animacı´ v programu Microsoft PowerPoint, prˇicˇemzˇ za´porne´ vlastnosti jsou eliminova´ny rˇesˇenı´m inspirovany´m funkcemi programu Stickman 5 a prˇ´ıpadneˇ vlastnı´m rˇesˇenı´m. Objekty jsou tvorˇeny pomocı´ za´kladnı´ch u´tvaru˚ jako prˇ´ımka, kruzˇnice a cˇtverec a jejich prˇ´ıpadny´ch kombinacı´ch. Tyto objekty je da´le mozˇno upravovat zmeˇnou meˇrˇ´ıtka, rotacı´ nebo posunem. Program umozˇnˇuje nava´za´nı´ objektu˚ na sebe pomocı´ prˇichycenı´ v bodech definujı´cı´ch dany´ objekt. Jednotlive´ objekty nebo celou animaci je mozˇno ulozˇit ve forma´tu XML. Animace se tvorˇ´ı pomocı´ mysˇi nebo prˇ´ıpadneˇ pomocı´ mysˇi a stisknute´ kla´vesy. Animace lze prˇirˇadit k objektu˚m nebo skupina´m objektu˚. Prˇi tvorbeˇ animace rotace nebo zmeˇny meˇrˇ´ıtka je nutno urcˇit referencˇnı´ bod, ke ktere´mu bude vztazˇena animace objektu nebo skupiny objektu˚. Animace lze nava´zat k jake´koliv jine´ animaci tak, zˇe zacˇne prˇi zacˇa´tku nava´zane´ animace nebo na jejı´m konci. Je mozˇne´ take´ definovat zpozˇdeˇnı´ animace i pokud je nava´za´na. Zhodnocenı´ vlastnostı´: • Klady: – Mozˇnost prova´za´nı´ jednotlivy´ch objektu˚. – Jednoduche´ vytva´rˇenı´ a modifikace objektu˚. – Jednoduche´ a prˇesne´ vytva´rˇenı´ animacı´ pomocı´ mysˇi. – Cˇasova´ na´vaznost animacı´ k libovolne´ jine´ animaci, nastavenı´ zpozˇdeˇnı´ animace. – Prˇideˇlenı´ animacı´ k jednotlivy´m objektu˚m nebo skupina´m objektu˚. – Mozˇnost nastavenı´ referencˇnı´ho bodu animace. – Mozˇnost ulozˇenı´ objektu nebo cele´ animace ve forma´tu XML. • Za´pory: – Nastavova´nı´ parametru˚ objektu˚ a animacı´ pomocı´ mysˇi nemusı´ by´t u´plneˇ prˇesne´.
7
3
Analy´za mozˇnostı´ pouzˇitı´ na´vrhovy´ch vzoru˚
Jeden ze za´kladnı´ch pozˇadavku˚ na tento anima´tor je jednoduchost rozsˇ´ırˇenı´ a prˇida´va´nı´ nove´ funkcionality. Proto jsem se rozhodl vyuzˇ´ıt neˇktere´ na´vrhove´ vzory zprˇehlednˇujı´cı´ a zjednodusˇujı´cı´ pra´ci anima´toru. Pouzˇite´ na´vrhove´ vzory: • Na´vrhovy´ vzor Command Tento na´vrhovy´ vzor jsem vyuzˇil pro oddeˇlenı´ zpracova´nı´ uda´lostı´ generovany´mi komponentami anima´toru od jejich vlastnı´ho zobrazenı´. Kazˇda´ uda´lost komponenty je zpracova´na vlastnı´ trˇ´ıdou s definovany´m rozhranı´m. Prˇi vzniku uda´losti dojde k vytvorˇenı´ prˇ´ıslusˇne´ trˇ´ıdy a metoda zachyta´vajı´cı´ uda´losti komponent zavola´ metodu vytvorˇene´ trˇ´ıdy zpracova´vajı´cı´ dany´ pozˇadavek. • Na´vrhovy´ vzor Factory Tento na´vrhovy´ vzor jsem vyuzˇil v kombinaci s na´vrhovy´m vzorem Command. Cı´lem tohoto na´vrhove´ho vzoru je zjednodusˇit a zprˇehlednit vytva´rˇenı´ instancı´ trˇ´ıd podle informacı´ zı´skany´ch v pru˚beˇhu programu. V tomto prˇ´ıpadeˇ tento na´vrhovy´ vzor slouzˇ´ı pro generova´nı´ trˇ´ıd zpracova´vajı´cı´ uda´losti komponent. Prˇi vzniku uda´losti metoda zachyta´vajı´cı´ uda´losti komponent zı´ska´ instanci tova´rnı´ trˇ´ıdy. Tato tova´rnı´ trˇ´ıda pote´ prˇeda´ prˇ´ıslusˇnou trˇ´ıdu zpracova´vajı´cı´ pozˇadavek komponenty podle zadany´ch parametru˚. • Na´vrhovy´ vzor State Tento na´vrhovy´ vzor jsem vyuzˇil pro jednoznacˇnou identifikaci stavu anima´toru, pro jednoduchou a prˇehlednou spra´vu zobrazovany´ch komponent a pro zmeˇnu jejich chova´nı´ v za´vislosti na vykonane´ akci. Chova´nı´ a stav zobrazovany´ch komponent je definova´n do samostatny´ch stavovy´ch trˇ´ıd kde kazˇda´ trˇ´ıda obsahuje informace o stavu a chova´nı´ vsˇech komponent pro danou situaci a implementuje dane´ rozhranı´. Tyto trˇ´ıdy jsou spravova´ny pomocı´ centra´lnı´ trˇ´ıdy obsahujı´cı´ odkaz na aktua´lneˇ pouzˇitou stavovou trˇ´ıdu a metody pro prˇepı´na´nı´ aktua´lnı´ch stavovy´ch trˇ´ıd. Po prˇepnutı´ na jinou stavovou trˇ´ıdu dojde k zavola´nı´ metody, ktera´ inicializuje a nastavı´ zobrazovane´ komponenty podle zvolene´ stavove´ trˇ´ıdy. • Na´vrhovy´ vzor Composite Tento na´vrhovy´ vzor jsem vyuzˇil pro skla´da´nı´ kresleny´ch objektu˚ do veˇtsˇ´ıch celku˚. Anima´tor ma´ prˇeddefinovane´ pouze za´kladnı´ kreslene´ objekty jako prˇ´ımka, kruzˇnice atd. Dı´ky tomuto na´vrhove´mu vzoru je mozˇno vytva´rˇet hierarchicky strukturovane´ objekty, ktere´ majı´ stejne´ vlastnosti. S teˇmito strukturovany´mi objekty je mozˇno zacha´zet stejneˇ jako se za´kladnı´mi objekty. Vsˇechny pouzˇite´ na´vrhove´ vzory jsou detailneˇ rozvinuty a konkre´tneˇ pouzˇity v cˇa´sti na´vrhu anima´toru u prˇ´ıslusˇny´ch cˇa´stı´ programu.
8
4
Analy´za mozˇnostı´ pouzˇitı´ knihoven a pomocny´ch na´stroju˚
Prˇi vytva´rˇenı´ anima´toru jsem pouzˇil neˇkolik knihoven a na´stroju˚ pro zjednodusˇenı´ a zprˇehledneˇnı´ na´vrhu a implementace. Zde je uveden pouze obecny´ popis funkce teˇchto na´stroju˚, podrobnosti a konkre´tnı´ pouzˇitı´ budou uvedeny v cˇa´sti na´vrhu. • Jigloo verze 4.2.0 [3] Tento na´stroj jsem pouzˇil na vytvorˇenı´ vizua´lnı´ch komponent anima´toru a na u´pravu jeho vzhledu. Jeho hlavnı´ vy´hodou je jednoducha´ graficka´ manipulace s komponentami a jejich konfigurace. • Java 2D [2] Jedna´ se o API umozˇnˇujı´cı´ jednodusˇsˇ´ı a variabilneˇjsˇ´ı vykreslova´nı´ objektu˚ na obrazovku. Pouzˇil jsem ho pro zobrazova´nı´ kresleny´ch objektu˚. Toto API podporuje funkce jako pru˚hlednost kreslene´ho objektu, vylepsˇenı´ obrazu a podobneˇ. Umozˇnˇuje take´ prˇ´ımou pra´ci s objekty implementujı´cı´mi rozhranı´ Shape jako naprˇ´ıklad vykreslenı´, obarvenı´. • XStream [5] Jedna´ se o knihovnu umozˇnˇujı´cı´ jednoduchou serializaci jake´hokoliv objektu˚ do XML a zpeˇt. Tato knihovna je schopna pracovat i s referencemi na objekty, takzˇe objekt vytvorˇeny´ pomocı´ te´to knihovny z XML obsahuje stejne´ instance a reference jake´ byly ulozˇeny. Tuto knihovnu pouzˇ´ıva´m pro ukla´da´nı´ vytvorˇeny´ch objektu˚ nebo animacı´. • Timing Framework [1] Jedna´ se o knihovnu umozˇnˇujı´cı´ vytva´rˇet a rˇ´ıdit animace. Tato knihovna obsahuje cˇa´st zodpoveˇdnou za rˇ´ızenı´ animace jako jejı´ de´lku, zpozˇdeˇnı´ od spusˇteˇnı´ animace, pocˇet opakova´nı´ a podobneˇ. Tuto cˇa´st jsem vyuzˇil k rˇ´ızenı´ vlastnı´ch animacı´. Da´le knihovna obsahuje cˇa´st zodpoveˇdnou za rˇ´ızenı´ chova´nı´ v pru˚beˇhu animace jako reakce na zacˇa´tek animace, reakce prˇi jednotlivy´ch vola´nı´ch metod trˇ´ıdy v pru˚beˇhu animace a dalsˇ´ı. Tuto cˇa´st jsem nahradil vlastnı´m zpracova´nı´m implementujı´cı´m rozhranı´ te´to cˇa´sti. • Fat Jar [4] Jedna´ se o plugin do na´stroje Eclipse umozˇnˇujı´cı´ vytva´rˇenı´ spustitelny´ch souboru˚ typu .jar. Tento na´stroj jsem vyuzˇil pro vytvorˇenı´ spustitelne´ho souboru obsahujı´cı´ celou aplikaci anima´toru. Pra´ce s tı´mto souborem je jednodusˇsˇ´ı a rychlejsˇ´ı nezˇ spousˇteˇnı´ aplikace jiny´m zpu˚sobem.
9
5 5.1
Na´vrh aplikace - trˇ´ıdnı´ diagramy Trˇ´ıdnı´ diagram balı´ku˚ a jejich struktury
Aplikace je rozdeˇlena´ do neˇkolika balı´ku˚ podle funkcı´ jednotlivy´ch trˇ´ıd. V balı´ku rules jsou obsazˇeny trˇ´ıdy obsluhujı´cı´ staticke´ pozˇadavky aplikace jako nacˇ´ıta´nı´ a ukla´da´nı´ objektu˚, transformace objektu˚ a rˇ´ızenı´ jejich nava´za´nı´. V balı´ku dialog je obsazˇena hlavnı´ funkcionalita aplikace. Skla´da´ se z balı´ku dialog.animation obsahujı´cı´ objekt animace a jejı´ho chova´nı´, z balı´ku dialog.listener obsahujı´cı´ho posluchacˇe uda´lostı´, z balı´ku dialog.object obsahujı´cı´ho kreslene´ objekty a z balı´ku dialog.dlgMain. Balı´k dialog.dlgMain obsahuje zobrazovane´ komponenty aplikace. Obsahuje balı´k dialog.dlgMain.state obsluhujı´cı´ stavy komponent pomocı´ na´vrhove´ho vzoru State a balı´k dialog.dlgMain.action obsluhujı´cı´ akce jednotlivy´ch komponent a uda´lostı´ pomocı´ na´vrhove´ho vzoru Action.
5.2
Balı´k dialog.dlgMain
Balı´k dialog.dlgMain obsahuje dveˇ trˇ´ıdy, ktere´ obsahujı´ zobrazovane´ komponenty aplikace. Trˇ´ıda MainDialog je hlavnı´ trˇ´ıdou urcˇenou ke spusˇteˇnı´ a obsahuje vsˇechny viditelne´ komponenty aplikace. Obsahuje take´ inicializaci teˇchto komponent a jejich vykreslenı´. Da´le obsahuje posluchacˇe registrujı´cı´ uda´losti vznikle´ na kreslı´cı´m pla´tneˇ a prˇeda´vajı´cı´ tyto uda´losti prˇ´ıslusˇny´m metoda´m. Da´le obsahuje obsluhu uda´lostı´, ktere´ mohou vzniknout u komponent generujı´cı´ch uda´losti. Tyto uda´losti obsluhuje trˇ´ıda notifyChange, ktera´ je vola´na prˇi jake´koliv uda´losti. V te´to metodeˇ pote´ dojde k zı´ska´nı´ akce odpovı´dajı´cı´ prvku, ktery´ vytvorˇil uda´lost, a samotne´ uda´losti. Tato akce je pote´ provedena. Trˇ´ıda AnimableCanvas slouzˇ´ı k vykreslenı´ a obsluze kreslı´cı´ho pla´tna. Tato trˇ´ıda obsahuje vsˇechny objekty vykreslovane´ na tomto pla´tneˇ vcˇetneˇ animacı´ a metody pro ´ daje o objektech jsou ulozˇeny v kolekcı´ch. Kolekce shapeRegister objejich obsluhu. U sahuje vsˇechny vykreslovane´ objekty. Kolekce pointRegister obsahuje vsˇechny kontrolnı´ body vykreslovany´ch objektu˚. Kolekce animationRegister obsahuje vsˇechny animace objektu˚. Kolekce choosedPoints obsahuje body, ktere´ byly vybra´ny prˇi tvorbeˇ nove´ho objektu. Kolekce clonedCanvas obsahuje stavy objektu˚ na kreslı´cı´m pla´tneˇ, ktere´ jsou prˇi u´praveˇ objektu˚ ukla´da´ny a tı´m tvorˇ´ı tzv. historii. Dı´ky te´to kolekci mu˚zˇeme vracet minule´ stavy objektu˚. Tato trˇ´ıda da´le obsahuje metody pro vra´cenı´ jednotlivy´ch kolekcı´, pro prˇida´va´nı´ novy´ch objektu˚ a jejı´ch maza´nı´. Da´le obsahuje metody pro procha´zenı´ historiı´ stavu objektu˚ a jejich ukla´da´nı´. Da´le obsahuje metodu pro vykreslenı´ obsahu na kreslı´cı´ pla´tno.
10
Obra´zek 1: Trˇ´ıdnı´ diagram balı´ku˚
5.3
Balı´k dialog.dlgMain.state
Balı´k dialog.dlgMain.state obsahuje trˇ´ıdy implementujı´cı´ na´vrhovy´ vzor State. Tyto trˇ´ıdy rˇ´ıdı´ stav zobrazovany´ch komponent. Balı´k dialog.dlgMain.state.dlgState obsahuje konkre´tnı´ nastavenı´ zobrazovany´ch komponent pro jednotlive´ situace. Trˇ´ıda IState slouzˇ´ı jako rozhranı´ pro pra´ci s objekty nastavujı´cı´mi stav komponent. Obsahuje metodu init, ktera´ slouzˇ´ı k inicializaci stavu vsˇech komponent, u ktery´ch jsou implementova´ny stavy. Trˇ´ıda AbstractState slouzˇ´ı jako abstraktnı´ trˇ´ıda pro implementaci trˇ´ıd stavu˚. Obsahuje odkaz na hlavnı´ dialog pro zprˇ´ıstupneˇnı´ zobrazovany´ch komponent. Da´le obsahuje abstraktnı´ iniciacˇnı´ metody pro kazˇdou komponentu, u ktere´ je implementova´no rˇ´ızenı´ stavu. Trˇ´ıda StateHolder slouzˇ´ı pro rˇ´ızenı´ zmeˇny stavu a pro zapamatova´nı´ aktua´lnı´ho stavu. Obsahuje instance vsˇech stavu˚ a metody pro jejich nastavenı´ a testova´nı´ nastavene´ho stavu. Prˇi nastavenı´ stavu docha´zı´ soucˇasneˇ i k jeho inicializaci. Trˇ´ıda StateCreatingAnimation obsahuje nastavenı´ stavu˚ pro komponenty pro prˇ´ıpad prˇida´va´nı´ nove´ animace. V tomto prˇ´ıpadeˇ jsou prˇ´ıstupne´ pouze komponenty nastavujı´cı´ parametry animace jako jejı´ de´lka, zpozˇdeˇnı´ a podobneˇ. Trˇ´ıda StateCreatingShape obsahuje nastavenı´ stavu˚ pro komponenty pro prˇ´ıpad vytva´rˇenı´ novy´ch objektu˚ na kreslı´cı´ pla´tno. V tomto prˇ´ıpadeˇ jsou prˇ´ıstupne´ pouze komponenty pro pra´ci s historiı´.
11
Obra´zek 2: Balı´k dialog.dlgMain
12
Obra´zek 3: Balı´k dialog.dlgMain.state
13
Trˇ´ıda StateModifyShape obsahuje nastavenı´ stavu˚ pro komponenty pro prˇ´ıpad za´kladnı´ho zobrazenı´. V tomto stavu jsou prˇ´ıstupne´ komponenty pro vytvorˇenı´ nove´ho objektu, komponenty historie, komponenty pro spusˇteˇnı´ animace. Trˇ´ıda StateSelected obsahuje nastavenı´ stavu˚ pro komponenty pro prˇ´ıpad oznacˇenı´ objektu. V tomto prˇ´ıpadeˇ jsou dostupne´ komponenty pro maza´nı´ objektu, sloucˇenı´ objektu˚, vytvorˇenı´ animace oznacˇeny´ch objektu˚ a historie.
5.4
Balı´ky dialog.dlgMain.action a dialog.dlgMain.action.mouseAction
Balı´k dialog.dlgMain.action obsahuje trˇ´ıdy implementujı´cı´ na´vrhovy´ vzor Command. Tyto trˇ´ıdy rˇ´ıdı´ vy´beˇr a provedenı´ akcı´ podle typu uda´losti, ktera´ vznikla a podle komponenty, ktera´ vytvorˇila tuto uda´lost. Obsahuje balı´ky dialog.dlgMain.action.mouseAction, ktery´ obsahuje trˇ´ıdy obsluhujı´cı´ uda´losti mysˇi, a dialog.dlgMain.action.dlgAction, ktery´ obsahuje trˇ´ıdy obsluhujı´cı´ uda´losti komponent. Trˇ´ıda IAction slouzˇ´ı jako rozhranı´ pro pra´ci s objekty implementujı´cı´mi akce komponent. Obsahuje metodu execute, ktera´ slouzˇ´ı k spusˇteˇnı´ definovane´ akce. Trˇ´ıda AbstractAction slouzˇ´ı jako abstraktnı´ trˇ´ıda pro implementaci trˇ´ıd akcı´. Obsahuje odkaz na hlavnı´ dialog pro zprˇ´ıstupneˇnı´ prˇ´ıpadny´ch objektu˚ zapojeny´ch do akce. Da´le obsahuje abstraktnı´ metodu execute pro vynucenı´ implementace te´to metody deˇdı´cı´mi trˇ´ıdami. Trˇ´ıda AbstractActionFactory slouzˇ´ı jako abstraktnı´ tova´rnı´ trˇ´ıda. Obsahuje odkaz na hlavnı´ dialog pro zprˇ´ıstupneˇnı´ objektu˚, podle ktery´ch dojde k vy´beˇru pozˇadovane´ho objektu akce. Da´le obsahuje abstraktnı´ metodu getAction pro vynucenı´ implementace te´to metody deˇdı´cı´mi trˇ´ıdami. Da´le obsahuje statickou metodu getInstance vracejı´cı´ novou instanci tova´rnı´ trˇ´ıdy. Trˇ´ıda ActionFactory je tova´rnı´ trˇ´ıda a slouzˇ´ı k zı´ska´nı´ instancı´ trˇ´ıd akcı´. Obsahuje instance vsˇech trˇ´ıd akcı´. Pomocı´ metody getAction trˇ´ıda vracı´ instanci trˇ´ıdy akcı´ podle prˇedane´ho parametru. Trˇ´ıda ActionMouseAnimate obsahuje akci ta´hnutı´ mysˇ´ı pro vytvorˇenı´ animace. Tato akce se vykona´ pouze ve stavu vytva´rˇenı´ animace. Trˇ´ıda ActionMouseConnected obsahuje akci kliku tlacˇ´ıtka mysˇi pro vytvorˇenı´ spojenı´ mezi body. Tato akce se vykona´ ve stavu modifikace objektu˚ v prˇ´ıpadeˇ zma´cˇknute´ kla´vesy Alt.
14
Obra´zek 4: Balı´ky dialog.dlgMain.action a dialog.dlgMain.action.mouseAction
15
Trˇ´ıda ActionMouseCreate obsahuje akci ta´hnutı´ mysˇ´ı pro vytvorˇenı´ nove´ho objektu. Tato akce se vykona´ ve stavu vytva´rˇenı´ novy´ch objektu˚. Trˇ´ıda ActionMouseDragg obsahuje akci ta´hnutı´ mysˇ´ı pro modifikaci nakreslene´ho objektu rotacı´ nebo posunem. Tato akce se vykona´ ve stavu modifikace objektu˚. Trˇ´ıda ActionMouseDraggScale obsahuje akci ta´hnutı´ mysˇ´ı pro modifikaci nakreslene´ho objektu zmeˇnou meˇrˇ´ıtka. Tato akce se vykona´ ve stavu modifikace objektu˚. Trˇ´ıda ActionMousePressed obsahuje akci stisknutı´ tlacˇ´ıtka mysˇi. Tato akce se vykona´ ve stavu modifikace objektu˚. V te´to akci se rozhoduje, zda se ma´ stisknutı´m mysˇi oznacˇit neˇjaky´ objekt. Trˇ´ıda ActionMouseSelect obsahuje akci uvolneˇnı´ tlacˇ´ıtka mysˇi. Tato akce se vykona´ ve stavu modifikace objektu˚. V te´to akci oznacˇ´ı objekty, ktere´ kolidujı´ s prostorem mezi bodem stisknutı´ tlacˇ´ıtka mysˇi a jejı´m uvolneˇnı´m. Trˇ´ıda ActionMouseTranslate obsahuje akci kliku mysˇi bez tazˇenı´. Tato akce se vykona´ ve stavu modifikace objektu˚ pokud je neˇjaky´ objekt oznacˇen. Prˇi te´to akci se rˇesˇ´ı, zda dojde k oznacˇenı´ jine´ho objektu, ktery´ obsahuje bod kliku mysˇi nebo oznacˇenı´ rˇ´ıdı´cı´ho bodu vybrane´ho objektu nebo odznacˇenı´ vsˇech objektu˚.
5.5
Balı´k dialog.dlgMain.action.dlgAction
Balı´k dialog.dlgMain.action byl popsa´n v prˇedchozı´ cˇa´sti, zde je uveden pro zna´zorneˇnı´ vazeb. Balı´k dialog.dlgMain.action.dlgAction, obsahuje trˇ´ıdy obsluhujı´cı´ uda´losti komponent. Trˇ´ıda ActionBack obsahuje akci tlacˇ´ıtka Back. Tato akce provede vra´cenı´ stavu kreslı´cı´ho pla´tna do prˇedchozı´ho ulozˇene´ho stavu. Akci je mozˇno vykonat pouze pokud je ulozˇen alesponˇ 1 stav kreslı´cı´ho pla´tna. Trˇ´ıda ActionDeleteAnimation obsahuje akci tlacˇ´ıtka Delete animation. Tato akce provede vymaza´nı´ oznacˇene´ animace z listu animacı´. Akci je mozˇno vykonat pouze pokud list animacı´ obsahuje alesponˇ 1 animaci. Trˇ´ıda ActionDeleteShape obsahuje akci tlacˇ´ıtka Delete shape. Tato akce provede vymaza´nı´ oznacˇene´ animace z listu animacı´. Akci je mozˇno vykonat pouze pokud je na kreslı´cı´m pla´tneˇ oznacˇen objekt. Trˇ´ıda ActionDrawReady obsahuje akci comboboxu pro vy´beˇr kresleny´ch objektu˚. Tato akce nastavı´ stav a vlastnosti aplikace do stavu vytva´rˇenı´ novy´ch objektu˚.
16
Obra´zek 5: Balı´k dialog.dlgMain.action.dlgAction
17
Trˇ´ıda ActionForward obsahuje akci tlacˇ´ıtka Forward. Tato akce provede zmeˇnu stavu kreslı´cı´ho pla´tna do na´sledujı´cı´ho ulozˇene´ho stavu. Akci je mozˇno vykonat pouze po stisknutı´ tlacˇ´ıtka Back, pokud nedosˇlo k dalsˇ´ı ukla´dane´ akci. Trˇ´ıda ActionLoadAnimation obsahuje akci polozˇky menu Load animation. Tato akce vyvola´ dialog pro otevı´ra´nı´ souboru˚. Po otevrˇenı´ souboru s ulozˇenou animacı´ dojde k jejı´mu zobrazenı´ na kreslı´cı´ pla´tno. Trˇ´ıda ActionLoadShape obsahuje akci polozˇky menu Load shape. Tato akce vyvola´ dialog pro otevı´ra´nı´ souboru˚. Po otevrˇenı´ souboru s ulozˇenou objektem dojde k jejı´mu nacˇtenı´ a zobrazenı´ na kreslı´cı´ pla´tno. Trˇ´ıda ActionMergeShape obsahuje akci tlacˇ´ıtka Merge shape. Tato akce provede sloucˇenı´ vı´ce objektu˚ do jednoho slozˇene´ho objektu. Akci je mozˇno vykonat pouze pokud je na kreslı´cı´m pla´tneˇ oznacˇeno vı´ce objektu˚. Trˇ´ıda ActionRunAnimate obsahuje akci tlacˇ´ıtka Run animation. Tato akce provede spusˇteˇnı´ animacı´ na kreslı´cı´m pla´tneˇ. Akci je mozˇno vykonat pouze pokud je vytvorˇena alesponˇ 1 animace. Trˇ´ıda ActionSaveAnimation obsahuje akci polozˇky menu Save animation. Tato akce vyvola´ dialog pro ukla´da´nı´ souboru˚. Do souboru se pote´ ulozˇ´ı vsˇechny u´daje o kreslı´cı´m pla´tnu a jeho objektech. Trˇ´ıda ActionSaveShape obsahuje akci polozˇky menu Save shape. Tato akce vyvola´ dialog pro ukla´da´nı´ souboru˚. Do souboru se pote´ ulozˇ´ı vsˇechny u´daje o aktua´lneˇ vybrany´ch objektech. Trˇ´ıda ActionSetAnimate obsahuje akci tlacˇ´ıtka Create animation. Tato akce provede zmeˇnu stavu kreslı´cı´ho pla´tna a komponent do stavu pro vytva´rˇenı´ animacı´. Akci je mozˇno vykonat pouze pokud je na kreslı´cı´m pla´tneˇ oznacˇen objekt.
5.6
Balı´k dialog.animation
Balı´k dialog.animation obsahuje trˇ´ıdy a balı´ky obsluhujı´cı´ objekty animacı´, jejich parametry a chova´nı´. Obsahuje balı´k dialog.animation.timer, ktery´ obsahuje trˇ´ıdy obsluhujı´cı´ uda´losti generovane´ anima´torem obsluhujı´cı´m danou animaci. Trˇ´ıda Animation obsahuje vsˇechny parametry animace a vlastnı´ instanci animacˇnı´ho objektu. Da´le obsahuje odkazy na nava´zane´ animace, ktere´ se majı´ spustit za´rovenˇ s touto animacı´ nebo azˇ po nı´. Obsahuje metody pro vytva´rˇenı´ konkre´tnı´ch instancı´ animacı´ pro jednotlive´ druhy animace, metodu pro vytvorˇenı´ nove´ instance animace se stejny´mi odkazy a pomocne´ metody pro vra´cenı´ parametru˚ animace.
18
Obra´zek 6: Balı´k dialog.animation
19
Trˇ´ıda AbstractTimer je abstraktnı´ metoda vsˇech cˇasovacˇu˚. Tato metoda implementuje neˇkterou funkcionalitu rozhranı´ TimingTargetAdapter. Dı´ky tomu je mozˇno pouzˇ´ıt trˇ´ıdy cˇasovacˇu˚ pro obsluhu uda´lostı´ anima´toru. Da´le vynucuje implementaci metod pro vytvorˇenı´ nove´ instance a pro vra´cenı´ jme´na cˇasovacˇe. V te´to trˇ´ıdeˇ jsou da´le implementova´ny metody pro obsluhu uda´lostı´ zacˇa´tku a konce animace. V teˇchto metoda´ch docha´zı´ ke spousˇteˇnı´ nava´zany´ch animacı´. Trˇ´ıda EraseTimer je cˇasovacˇ implementujı´cı´ cˇasova´nı´ animace zmizenı´ objektu. Ke zmizenı´ objektu dojde na zacˇa´tku animace. Trˇ´ıda RotateTimer je cˇasovacˇ implementujı´cı´ cˇasova´nı´ animace rotace objektu. Rotace mezi jednotlivy´mi uda´lostmi animace se vypocˇ´ıta´ tı´m, zˇe se nejdrˇ´ıve vypocˇte celkovy´ u´hel rotace objektu a zjistı´ se pomeˇr doby ubeˇhle´ od prˇedchozı´ uda´losti k celkove´ dobeˇ beˇhu animace. Z teˇchto u´daju˚ se zjistı´ u´hel, ktery´m ma´ rotovat animovany´ objekt prˇi te´to uda´losti. Trˇ´ıda ScaleTimer je cˇasovacˇ implementujı´cı´ cˇasova´nı´ animace zmeˇny meˇrˇ´ıtka objektu. Prˇi vy´pocˇtu zmeˇny meˇrˇ´ıtka je nutno nejdrˇ´ıve vypocˇ´ıtat pomocny´ bod, podle ktere´ho dojde k vy´pocˇtu zmeˇny meˇrˇ´ıtka. Tento pomocny´ bod se nacha´zı´ na spojnici bodu, ve ktere´m zacˇ´ına´ zmeˇna meˇrˇ´ıtka a bodu, ve ktere´m koncˇ´ı zmeˇna meˇrˇ´ıtka. Trˇ´ıda TranslateTimer je cˇasovacˇ implementujı´cı´ cˇasova´nı´ animace posunu objektu. Velikost posunu mezi jednotlivy´mi uda´lostmi animace je u´meˇrna´ dobeˇ prodlevy mezi jednotlivy´mi uda´lostmi animace. Trˇ´ıda Animator je trˇ´ıda z externı´ knihovny org.jdesktop.animation.timing a implementuje funkcionalitu animace. Mezi tuto funkcionalitu patrˇ´ı prˇedevsˇ´ım periodicke´ generova´nı´ uda´lostı´ prˇi spusˇteˇnı´ animace a prˇeda´va´nı´ zpracova´nı´ uda´losti prˇedem nastavene´ instanci cˇasovacˇe. Da´le obsahuje pomocne´ parametry nastavenı´ animace jako dobu beˇhu animace, zpozˇdeˇnı´ od spusˇteˇnı´ animace, pocˇet opakova´nı´ animace a jine´. Tyto parametry pote´ ovlivnˇujı´ dobu a periodu generova´nı´ uda´lostı´ a parametr prˇedany´ pro zpracova´nı´ uda´losti. Trˇ´ıda TimingTargetAdapter je trˇ´ıda z externı´ knihovny org.jdesktop.animation.timing a implementuje adapte´r pro rozhranı´ cˇasovacˇe obsluhujı´cı´ho prˇerusˇenı´ generovane´ objektem trˇ´ıdy Animator. Adapte´r obsahuje metody begin, vola´na prˇi uda´losti zacˇa´tku animace, end, vola´na prˇi ukoncˇenı´ animace, repeat, vola´na prˇi opakova´nı´ animace, a timingEvent, vola´na periodicky prˇi beˇhu animace a zpracova´va´ uda´lost beˇhu animace.
5.7
Balı´k dialog.listener
Balı´k dialog.listener obsahuje trˇ´ıdy implementujı´cı´ posluchacˇe uda´lostı´ mysˇi.
20
Obra´zek 7: Balı´k dialog.listener Trˇ´ıda ClickListener obsahuje posluchacˇe uda´lostı´ kliku mysˇi. Uchova´va´ v sobeˇ informace o bodu, kde bylo stisknuto tlacˇ´ıtko mysˇi, a bodu, kde bylo uvolneˇno tlacˇ´ıtko mysˇi. Da´le obsahuje odkaz na hlavnı´ dialog a informace o okolnostech uda´losti ve formeˇ modifika´toru. Trˇ´ıda obsahuje metody pro zpracova´va´nı´ uda´lostı´ deˇdeˇne´ z trˇ´ıdy MouseAdapter. Da´le obsahuje metodu pro zı´ska´nı´ prˇ´ıslusˇne´ akce podle zpracovane´ uda´losti pomocı´ trˇ´ıdy ActionFactory a jejı´ spusˇteˇnı´. Trˇ´ıda MotionListener obsahuje posluchacˇe uda´lostı´ pohybu mysˇi. Uchova´va´ v sobeˇ informace o bodu, ktery´ ukla´da´ pozici tazˇenı´ mysˇi, a bodu, ktery´ ukla´da´ prˇedchozı´ pozici tazˇenı´ mysˇi. Da´le obsahuje odkaz na hlavnı´ dialog. Trˇ´ıda obsahuje metody pro zpracova´va´nı´ uda´lostı´ deˇdeˇne´ z trˇ´ıdy MouseMotionAdapter. Da´le obsahuje metodu pro zı´ska´nı´ prˇ´ıslusˇne´ akce podle zpracovane´ uda´losti pomocı´ trˇ´ıdy ActionFactory a jejı´ spusˇteˇnı´.
5.8
Balı´k dialog.object
Balı´k dialog.object obsahuje trˇ´ıdy implementujı´cı´ jednotlive´ typy objektu˚ kresleny´ch na kreslı´cı´ pla´tno. Jsou zde implementova´ny take´ pomocne´ struktury jako rozhranı´ nebo trˇ´ıda reprezentujı´cı´ jednotlive´ rˇ´ıdı´cı´ body.
21
Obra´zek 8: Balı´k dialog.object
22
Trˇ´ıda IShape je rozhranı´ pro vsˇechny trˇ´ıdy kresleny´ch objektu˚. Definuje jejich vsˇechny spolecˇne´ verˇejneˇ prˇ´ıstupne´ metody. Mezi neˇ patrˇ´ı metoda na vykreslenı´ objektu na pla´tno, metoda na vytvorˇenı´ nove´ instance objektu, metody pro vy´pocˇet pru˚niku˚ a protı´na´nı´ objektu s objektem parametru, a pomocne´ metody pro zı´ska´va´nı´ ulozˇeny´ch promeˇnny´ch. Trˇ´ıda AbstractShape je abstraktnı´ metoda implementujı´cı´ standardnı´ implementaci neˇktery´ch metod rozhranı´ IShape. Obsahuje kolekci bodu˚ a kolekci objektu˚ tvorˇ´ıcı´ch dany´ objekt spolecˇneˇ s obecny´mi parametry objektu˚. Implementuje standardnı´ metodu vykreslenı´ objektu, standardnı´ metodu pro zjisˇteˇnı´ pru˚niku objektu s objektem parametru a pomocne´ metody. Trˇ´ıda CompositeShape implementuje funkce kreslene´ho objektu, ktery´ je slozˇen z neˇkolika jiny´ch objektu˚. Obsahuje specia´lnı´ metodu pro prˇida´va´nı´ novy´ch objektu˚ do tohoto objektu. Da´le obsahuje pomocne´ parametry a metody pro uchova´nı´ informace na´zvu typu objektu a pocˇtu nutny´ch rˇ´ıdı´cı´ch bodu˚ pro vytvorˇenı´ objektu. Trˇ´ıda CubicCurve implementuje funkce kreslene´ho objektu kubicke´ krˇivky. Trˇ´ıda prˇedefinuje metodu pro vykreslenı´ objektu a metody pro zjisˇteˇnı´ pru˚niku. Da´le obsahuje pomocne´ parametry a metody pro uchova´nı´ informace na´zvu typu objektu a pocˇtu nutny´ch rˇ´ıdı´cı´ch bodu˚ pro vytvorˇenı´ objektu. Trˇ´ıda Ellipse implementuje funkce kreslene´ho objektu elipsy. Vyuzˇ´ıva´ implementace standardnı´ch funkcı´ trˇ´ıdy AbstractShape. Trˇ´ıda Line implementuje funkce kreslene´ho objektu u´secˇky. Trˇ´ıda prˇedefinuje metodu pro vykreslenı´ objektu a metody pro zjisˇteˇnı´ pru˚niku. Da´le obsahuje pomocne´ parametry a metody pro uchova´nı´ informace na´zvu typu objektu a pocˇtu nutny´ch rˇ´ıdı´cı´ch bodu˚ pro vytvorˇenı´ objektu. Trˇ´ıda Rectangle implementuje funkce kreslene´ho objektu obde´lnı´ku. Vyuzˇ´ıva´ implementace standardnı´ch funkcı´ trˇ´ıdy AbstractShape. Trˇ´ıda WrittenText implementuje funkce kreslene´ho objektu textu. Je postavena na implementaci trˇ´ıdy obde´lnı´ku s urcˇity´mi u´pravami. Prˇi vykreslova´nı´ objektu dojde k vykreslenı´ textu ulozˇene´ho jako parametr mı´sto u´secˇek. Trˇ´ıda ShapePoint implementuje funkce objektu rˇ´ıdı´cı´ho bodu. Tento objekt uchova´va´ informace o umı´steˇnı´ rˇ´ıdı´cı´ho bodu a jeho vlastnostech. Mezi vlastnosti patrˇ´ı informace, zda je oznacˇen objekt obsahujı´cı´ tento bod, zda je oznacˇen tento bod a kolekce bodu˚, ktere´ jsou propojeny s tı´mto bodem. Da´le obsahuje metodu pro vykreslenı´ bodu v prˇ´ıpadeˇ, zˇe je vybra´n objekt obsahujı´cı´ tento bod. Da´le obsahuje metodu pro vra´cenı´ nove´ instance tohoto objektu, metodu pro zjisˇteˇnı´, zda se tento bod protı´na´ s objektem prˇedany´m parametrem, a pomocne´ metody pro vra´cenı´ parametru˚.
23
5.9
Trˇ´ıdnı´ diagram balı´ku˚ rules
Balı´k rules obsahuje trˇ´ıdy implementujı´cı´ sluzˇby a podpu˚rne´ cˇinnosti aplikace jako jsou transformace objektu˚ nebo ukla´da´nı´ a nacˇ´ıta´nı´ objektu˚ do souboru. Prˇ´ıstup k teˇmto sluzˇba´m je implementova´n pomocı´ na´vrhove´ho vzoru Mediator a z ostatnı´ch trˇ´ıd aplikace je umozˇneˇn staticky´ prˇ´ıstup k teˇmto trˇ´ıda´m pomocı´ trˇ´ıdy Mediator. Trˇ´ıda Mediator je trˇ´ıda implementujı´cı´ prˇ´ıstup z trˇ´ıd aplikace k trˇ´ıda´m obsazˇeny´m v tomto balı´ku. K zajisˇteˇnı´ te´to funkcˇnosti jsou implementova´ny do te´to trˇ´ıdy vnitrˇnı´ trˇ´ıdy, kde kazˇda´ vnitrˇnı´ trˇ´ıda obsluhuje prˇ´ıstup k verˇejneˇ poskytovany´m metoda´m jedne´ prˇirˇazene´ trˇ´ıdy v tomto balı´ku. Trˇ´ıda XStream je trˇ´ıda z externı´ knihovny com.thoughtworks.xstream a implementuje serializaci a deserializaci objektu do XML textu. Tato trˇ´ıda je schopna ukla´dat take´ odkazy na instance objektu˚ a po deserializaci objektu z textu jsou tyto odkazy funkcˇnı´. Tuto trˇ´ıdu jsem vyuzˇil pro ukla´da´nı´ a nacˇ´ıta´nı´ objektu˚ nebo animacı´ do XML. Trˇ´ıda R1 XML je trˇ´ıda implementujı´cı´ ukla´da´nı´ objektu nebo cele´ animace do XML souboru nebo jejich nacˇ´ıta´nı´. Vyuzˇ´ıva´ k tomu trˇ´ıdu XStream pro serializaci a deserializaci objektu˚ do XML a trˇ´ıdu R3 HandlingFiles pro za´pis tohoto XML souboru nebo jeho nacˇtenı´. Trˇ´ıda R3 HandlingFiles je trˇ´ıda implementujı´cı´ ukla´da´nı´ textu do souboru nebo jeho nacˇ´ıta´nı´. Trˇ´ıda R2 Transformation je trˇ´ıda implementujı´cı´ funkcionalitu transformacı´ objektu˚. Jedna´ se o transformaci posunu, rotace a zmeˇny meˇrˇ´ıtka. Vstupem metod pro transformaci je kolekce transformovany´ch objektu˚ a rˇ´ıdı´cı´ body, prˇ´ıpadneˇ take´ pomocne´ u´daje jako velikost u´hlu. V metoda´ch pote´ dojde k u´praveˇ rˇ´ıdı´cı´ch bodu˚ transformovany´ch objektu˚ podle vlozˇeny´ch parametru˚. Trˇ´ıda R4 ConnectedTransformations je trˇ´ıda implementujı´cı´ transformace nava´zany´ch objektu˚. Obsahuje metodu runConnectedTransformations, ktera´ je vola´na po kazˇde´ u´praveˇ rˇ´ıdı´cı´ch bodu˚ jake´hokoliv objektu a zajisˇt’uje u´pravu objektu˚, ktere´ jsou nava´za´ny na upravovane´m objektu˚. Da´le obsahuje metodu transformShape, ktera´ implementuje algoritmus rˇ´ıdı´cı´ u´pravy nava´zany´ch objektu˚.
24
Obra´zek 9: Balı´k rules
25
6 6.1
Na´vrh aplikace - sekvencˇnı´ diagramy za´kladnı´ch funkcı´ Sekvencˇnı´ diagram pouzˇitı´ na´vrhove´ho vzoru Factory
Tento na´vrhovy´ vzor je vyuzˇit pro obsluhu uda´lostı´ generovany´ch zobrazeny´mi komponentami nebo uda´lostı´ mysˇi. Metody pro obsluhu uda´lostı´ nazvane´ notifyChange majı´ vzˇdy podobnou implementaci a jsou obsazˇeny v trˇ´ıda´ch implementujı´cı´ch posluchacˇe uda´lostı´. Jedna´ se o trˇ´ıdy v balı´ku dialog.listener a trˇ´ıdu MainDialog. V prˇ´ıpadeˇ vzniku uda´lostı´ dojde k vola´nı´ metody notifyChange s parametrem obsahujı´cı´m zdroj uda´losti. Metoda na´sledneˇ zı´ska´ instanci tova´rnı´ trˇ´ıdy ActionFactory pomocı´ staticke´ metody getInstance. Da´le dojde k otestova´nı´ parametru prˇedane´ho prˇi vola´nı´ notifyChange, je zde umozˇneˇno zpracova´vat pouze parametr typu JComponent. V prˇ´ıpadeˇ jiny´ch typu˚ parametru nebude provedena zˇa´dna´ dalsˇ´ı cˇinnost. Da´le je zı´ska´na instance trˇ´ıdy obsluhujı´cı´ vlastnı´ prova´deˇnı´ akce. Zı´ska´ se pomocı´ metody getAction volane´ pomocı´ instance tova´rnı´ trˇ´ıdy s prˇedany´m parametrem stejny´m jako parametr notifyChange. Tato metoda vra´tı´ instanci akce implementujı´cı´ rozhranı´ IAction. Na´sledneˇ dojde ke spusˇteˇnı´ vlastnı´ akce pomocı´ metody execute volane´ pomocı´ instance akce. Na´vrh sekvecˇnı´ho diagramu pouzˇitı´ na´vrhove´ho vzoru Factory viz obra´zek 10.
6.2
Sekvencˇnı´ diagram pouzˇitı´ na´vrhove´ho vzoru State
Tento na´vrhovy´ vzor je vyuzˇit pro obsluhu stavu zobrazovany´ch vizua´lnı´ch komponent v za´vislosti na stavu aplikace. Stavy aplikace jsou rˇ´ızeny pomocı´ trˇ´ıdy StateHolder obsahujı´cı´ odkaz na vsˇechny stavy aplikace. Odkaz na instanci te´to trˇ´ıdy se nacha´zı´ v trˇ´ıdeˇ MainDialog. Zmeˇny stavu aplikace se vyvola´vajı´ prˇi zpracova´nı´ akcı´. V prˇ´ıpadeˇ, zˇe dojde potrˇebeˇ zmeˇny stavu aplikace prˇi vykona´va´nı´ akce, dojde k inicializaci nastavovacı´ metody setStateCreatingAnimation nastavujı´cı´ stav aplikace pomocı´ objektu obsazˇene´m v hlavnı´m dialogu. V tomto prˇ´ıpadeˇ se jedna´ o stav StateCreatingAnimation nastavujı´cı´ komponenty do stavu pro kreslenı´ novy´ch objektu˚ na pla´tneˇ. Nastavovacı´ metoda zavola´ metodu init objektu reprezentujı´cı´ dany´ inicializovany´ stav. Tato metoda je definova´na v rozhranı´ IState a je implementova´na v abstraktnı´ trˇ´ıdeˇ AbstractState. Metoda postupneˇ zavola´ inicializacˇnı´ metody vsˇech zobrazovany´ch komponent, ve ktery´ch nastavı´ zobrazovany´ stav dane´ komponenty. Na´vrh sekvecˇnı´ho diagramu pouzˇitı´ na´vrhove´ho vzoru State viz obra´zek 11.
6.3
Sekvencˇnı´ diagram klonova´nı´ registru˚ kreslı´cı´ho pla´tna
Klonova´nı´ registru˚ a obsahu kreslı´cı´ho pla´tna je klı´cˇova´ soucˇa´st programu umozˇnˇujı´cı´ vracet provedene´ zmeˇny objektu˚ nebo vracet probeˇhlou animaci. Funkcˇnost samotne´ho klonova´nı´ je definova´na v metodeˇ cloneCanvas trˇ´ıdy AnimableCanvas. Pro zajisˇteˇnı´ funkcˇnosti klonova´nı´ musı´ by´t pro kazˇdy´ objekt kreslı´cı´ho pla´tna a jeho vlastnosti definova´na metoda pro klonova´nı´. Vzhledem k tomu, zˇe jednotlive´ kreslene´ objekty
26
Obra´zek 10: Metoda notifyChange
Obra´zek 11: Metoda execute
27
Obra´zek 12: Metoda cloneCanvas nebo animace odkazujı´ do registru˚ obsahujı´cı´ch vsˇechny objekty, nelze vyuzˇ´ıt standardnı´ implementace metody clone. Proto jsem definoval toto klonova´nı´ pomocı´ metody getNewInstance, ktera´ vracı´ novy´ objekt s odkazy do novy´ch registru˚. Pro jednoduchost a na´zornost rˇesˇenı´ je na obra´zku uvedeno pouze klonova´nı´ instancı´ rˇ´ıdı´cı´ch bodu˚. Klonova´nı´ cely´ch kresleny´ch objektu˚ a animacˇnı´ch objektu˚ probı´ha´ analogicky. Prˇi prova´deˇnı´ metody cloneCanvas se nejdrˇ´ıve vytvorˇ´ı nova´ instance registru, v tomto prˇ´ıpadeˇ newPointRegister. Da´le se v cyklu procha´zı´ stary´ registr rˇ´ıdı´cı´ch bodu˚ a kazˇda´ jeho polozˇka se klonuje pomocı´ metody getNewInstance. Na´sledneˇ je tato nova´ instance prˇida´na do nove´ho registru pomocı´ metody add. Tı´m je zajisˇteˇno, zˇe nove´ instance bodu˚ majı´ stejny´ index v registru jako stare´ instance. Obdobneˇ je rˇesˇeno i klonova´nı´ kresleny´ch objektu˚ s tı´m, zˇe jako parametr metody getNewInstance se prˇeda´va´ novy´ a stary´ registr bodu˚. V te´to metodeˇ dojde po vytvorˇenı´ nove´ instance objektu k prˇesmeˇrova´nı´ odkazu˚ rˇ´ıdı´cı´ch bodu˚ ze stare´ho registru do nove´ho. Jako klı´cˇ je vyuzˇit index bodu v registru. Na´vrh sekvecˇnı´ho diagramu klonova´nı´ registru˚ kreslı´cı´ho pla´tna viz obra´zek 12.
28
Obra´zek 13: Metoda getNewInstance
6.4
Sekvencˇnı´ diagram klonovacı´ metody
Klonovacı´ metoda je soucˇa´stı´ kazˇde´ho kreslene´ho objektu, jeho rˇ´ıdı´cı´ch bodu˚ a k neˇmu prˇirˇazeny´ch animacı´. Slouzˇ´ı k vytvorˇenı´ nove´ho objektu stejne´ho typu se stejny´mi vnitrˇnı´mi informacemi a s odkazy na naklonovane´ objekty objektu˚, na ktere´ meˇl odkazy objekt prˇed klonova´nı´m. V sekvencˇnı´m diagramu je uveden postup klonova´nı´ rˇ´ıdı´cı´ho bodu. Tento bod obsahuje objekt typu Point2D.Double uchova´vajı´cı´ polohu bodu, jeho vlastnosti uchova´vane´ pomocı´ primitivnı´ch datovy´ch typu˚ a kolekci bodu˚, se ktery´mi je vza´jemneˇ spojen. Prˇi klonova´nı´ se nejdrˇ´ıve naklonuje objekt uchova´vajı´cı´ polohu bodu pomocı´ standardneˇ implementovane´ klonovacı´ metody. Da´le se vytvorˇ´ı nova´ instance objektu rˇ´ıdı´cı´ho bodu v informacemi o poloze vyuzˇity´mi z naklonovane´ho bodu. Da´le se zkopı´rujı´ vnitrˇnı´ informace bodu do nove´ instance rˇ´ıdı´cı´ho bodu. Nakonec se zkopı´rujı´ odkazy na propojene´ body do prˇ´ıslusˇne´ kolekce nove´ instance bodu. Tyto odkazy budou na konci cele´ klonovacı´ procedury metody cloneCanvas nahrazeny odkazy na noveˇ naklonovane´ prˇ´ıslusˇne´ body. Na´vrh sekvecˇnı´ho diagramu klonovacı´ metody viz obra´zek 13.
29
7
Potencia´lnı´ mozˇnosti rozsˇ´ırˇenı´ aplikace
Aplikace je navrhnuta tak, aby byla snadno modifikovatelna´ a rozsˇirˇitelna´. Obsahuje zvla´sˇt’ oddeˇlene´ rˇ´ızenı´ stavu komponent, rˇ´ızenı´ a prova´deˇnı´ akcı´, implementaci kresleny´ch objektu˚, implementaci posluchacˇu˚ a podobneˇ. Zde jsou uvedeny mozˇnosti rozsˇ´ırˇenı´ aplikace o novou funkcionalitu nebo jejı´ modifikace.
7.1
Prˇida´nı´ zobrazovane´ komponenty
Zobrazovanou komponentu je nutno nejdrˇ´ıve prˇidat do trˇ´ıdy MainDialog. Toto prˇida´nı´ je nejlepsˇ´ı prove´st pomocı´ na´stroje Jigloo, ale lze to prove´st i manua´lneˇ. Prˇi rucˇnı´m prˇida´va´nı´ je potrˇeba inicializovat komponentu v metodeˇ initGUI. Da´le je potrˇeba prˇidat metodu getteru vracejı´cı´ danou komponentu. Pokud bude docha´zet ke zmeˇneˇ stavu komponenty tak je nutno prˇidat komponentu do trˇ´ıd implementujı´cı´ch stavy aplikace. Do trˇ´ıdy AbstractState je nutno prˇidat metodu init komponenty do metody init a da´le prˇidat abstraktnı´ metodu init komponenty pro vynucenı´ jejı´ implementace. Da´le je nutno implementovat metodu init komponenty do kazˇde´ho stavu aplikace. Obsah metody bude nastavovat stav komponenty pro dany´ stav aplikace. Pokud bude komponenta generovat akci prˇi kliknutı´ na ni tak je nutno implementovat akci pro danou komponentu. Nejdrˇ´ıve je trˇeba implementovat trˇ´ıdu akce v balı´ku dialog.dlgMain.action.dlgAction. Tato trˇ´ıda musı´ rozsˇirˇovat abstraktnı´ trˇ´ıdu AbstractAction. V metodeˇ execute je pote´ trˇeba implementovat cˇinnost prova´deˇnou prˇi vyvola´nı´ akce. Da´le je nutno implementovat ve trˇ´ıdeˇ ActionFactory do metody getAction s parametrem komponenty (JComponent) vra´cenı´ trˇ´ıdy akce komponenty v prˇ´ıpadeˇ, zˇe parametr metody getAction je dana´ komponenta.
7.2
Prˇida´nı´ za´kladnı´ho kreslene´ho objektu
Pro prˇida´nı´ kreslene´ho objektu je nejdrˇ´ıve nutno implementovat trˇ´ıdu definujı´cı´ dany´ objekt do balı´ku dialog.object. Trˇ´ıda objektu musı´ rozsˇirˇovat abstraktnı´ trˇ´ıdu AbstractShape. V konstruktoru s parametrem obsahujı´cı´m kolekci rˇ´ıdı´cı´ch bodu˚ by meˇlo by´t definova´no vytvorˇenı´ podobjektu˚ tohoto objektu a jejich ulozˇenı´ do kolekce. Da´le trˇ´ıda musı´ implementovat metodu getInstance pro vra´cenı´ inicializovane´ instance trˇ´ıdy vytvorˇene´ podle prˇedany´ch parametru˚ obsahujı´cı´ch body kliku mysˇi a prˇ´ıpadneˇ text. Da´le musı´ trˇ´ıda implementovat metodu getNewInstance vracejı´cı´ novou instanci trˇ´ıdy s naklonovany´mi parametry a odkazy na dalsˇ´ı objekty obsazˇeny´mi v novy´ch registrech (viz. obra´zek 13: Sekvencˇnı´ diagram pro klonova´nı´). Da´le je trˇeba prˇidat trˇ´ıdu kreslene´ho objektu do nabı´dky vy´beˇru kreslı´cı´ch objektu˚. Provede se to prˇida´nı´m staticke´ho objektu trˇ´ıdy definovane´ho ve te´to trˇ´ıdeˇ do vektoru uchova´vajı´cı´ho nabı´dku kresleny´ch objektu˚. Tento vektor se nacha´zı´ ve trˇ´ıdeˇ MainDialog v
30
metodeˇ initGUI v mı´steˇ, kde docha´zı´ k inicializaci zobrazovane´ komponenty comboChooseShape.
7.3
Prˇida´nı´ nove´ho typu animace
Pro prˇida´nı´ nove´ho typu animace je potrˇeba nejdrˇ´ıve vytvorˇit novou trˇ´ıdu cˇasovacˇe te´to animace. Tato trˇ´ıda se vytva´rˇ´ı v balı´ku dialog.animation.timer. Trˇ´ıda by meˇla rozsˇirˇovat abstraktnı´ trˇ´ıdu AbstractTimer. Meˇla by implementovat metody timingEvent, obsahujı´cı´ implementaci chova´nı´ v pru˚beˇhu animace (viz. obra´zek 6: Trˇ´ıdnı´ diagram balı´ku animation a dokumentace na´stroje Timing Framework), getName, vracejı´cı´ jme´no animace, a getNewInstance, vracejı´cı´ novou instanci animace (viz. obra´zek 13: Sekvencˇnı´ diagram klonovacı´ metody). Pro samotne´ zpracova´nı´ transformace objektu˚ by meˇl cˇasovacˇ vyuzˇ´ıvat metodu transformace ve trˇ´ıdeˇ R2 Transformation. Lze zde prˇidat i novou metodu transformace, ale je nutno prˇidat do trˇ´ıdy Mediator metodu pro prˇ´ıstup k te´to metodeˇ (podobna´ implementace jako ostatnı´ metody v trˇ´ıdeˇ Mediator). Da´le je trˇeba prˇidat do trˇ´ıdy Animation metodu getteru vracejı´cı´ inicializovanou instanci animace podle vlozˇeny´ch parametru˚ (viz. podobneˇ implementovane´ metody v trˇ´ıdeˇ Animation). Da´le je potrˇeba ve trˇ´ıdeˇ ActionMouseAnimate do metody execute prˇidat podmı´nku, prˇi ktere´ dojde k vytvorˇenı´ instance noveˇ vytvorˇene´ animace a jejı´ prˇirˇazenı´ do registru animacı´ v trˇ´ıdeˇ AnimableCanvas. Podmı´nka by meˇla by´t umı´steˇna spolecˇneˇ s ostatnı´mi podobny´mi podmı´nkami.
7.4
Prˇida´nı´ nove´ho stavu aplikace
Pro prˇida´nı´ nove´ho stavu aplikace je potrˇeba vytvorˇit novou trˇ´ıdu stavu˚ komponent v balı´ku dialog.dlgMain.state.dlgState. Tato trˇ´ıda musı´ rozsˇirˇovat abstraktnı´ trˇ´ıdu AbstractState. Trˇ´ıda musı´ take´ implementovat inicializacˇnı´ metody vsˇech vizua´lnı´ch komponent. Da´le je potrˇeba vytvorˇit novy´ objekt v trˇ´ıdeˇ StateHandler. Tento objekt bude typu IShape a bude inicializovany´ v konstruktoru trˇ´ıdy. Da´le bude prˇida´na metoda setState typu stavu s implementacı´ podobnou ostatnı´m metoda´m a prˇ´ıpadneˇ i metoda isState typu stavu pro zjisˇteˇnı´, zda je aplikace v tomto stavu.
7.5
Prˇida´nı´ nove´ho posluchacˇe
Trˇ´ıda nove´ho posluchacˇe uda´lostı´ by meˇla by´t umı´steˇna do balı´ku dialog.listener. Trˇ´ıda by meˇla implementovat metodu notifyChange s podobnou implementacı´ jako v podobny´ch trˇ´ıda´ch. Tato metoda by meˇla by´t spusˇteˇna v prˇ´ıpadeˇ kazˇde´ uda´losti, kterou
31
chceme zpracova´vat. Instance trˇ´ıdy posluchacˇe by meˇla by´t umı´steˇna ve trˇ´ıdeˇ MainDialog a meˇla by by´t prˇirˇazena jako posluchacˇ komponenty, jejı´zˇ uda´losti chceme zpracova´vat.
7.6
´ prava algoritmu pro vy´pocˇet transformacı´ nava´zany´ch objektu˚ U
Algoritmus transformace nava´zany´ch objektu˚ je implementova´n ve trˇ´ıdeˇ R4 ConnectedTransformations v metodeˇ transformShape. Soucˇasna´ implementace vypocˇ´ıta´ strˇed transformovane´ho objektu a ten pouzˇije jako teˇzˇisˇteˇ objektu prˇi trans´ prava algoformaci. Pro nava´zane´ objekty se vyuzˇ´ıva´ transformace posunu a rotace. U ritmu se provede jeho prˇepsa´nı´m.
7.7
Modifikace a prˇida´va´nı´ atributu˚ kresleny´ch objektu˚
Prˇida´nı´ nebo modifikace atributu˚ kresleny´ch objektu˚ se provede ve trˇ´ıdeˇ AbstractShape. Prˇi prˇida´nı´ parametru ovlivnˇujı´cı´ho vykreslenı´ objektu˚ je potrˇeba upravit metody repaint v trˇ´ıda´ch, ktere´ tuto metodu prˇepisujı´ vlastnı´ implementacı´.
32
8
Pru˚beˇh animace
Vlastnı´ animace nakresleny´ch objektu˚ mu˚zˇe by´t spusˇteˇna pouze v prˇ´ıpadeˇ, zˇe je nadefinova´na alesponˇ jedna animace. Animace se spousˇtı´ v metodeˇ execute trˇ´ıdy ActionRunAnimate, ktera´ je inicializova´na prˇi stisknutı´ tlacˇ´ıtka Run animation. Prˇi stisknutı´ tlacˇ´ıtka Run animation program nejdrˇ´ıve procha´zı´ vsˇechny animace a zjisˇt’uje, zda jsou spusˇteˇny. V prˇ´ıpadeˇ, zˇe animace nenı´ spusˇteˇna, program zkontroluje zda je animace va´za´na´ na jinou animaci a v prˇ´ıpadeˇ, zˇe nenı´ va´za´na, dojde ke spusˇteˇnı´ animace. Prˇi spusˇteˇnı´ animace nejdrˇ´ıve dojde k reinicializaci objektu trˇ´ıdy Animator zajisˇt’ujı´cı´ obsluhu vlastnı´ animace. Tato reinicializace se prova´dı´ z du˚vodu, zˇe objekt nemusı´ by´t nastaven do pocˇa´tecˇnı´ho stavu a beˇh animace by byl nestandardnı´. Reinicializace se skla´da´ z vytvorˇenı´ nove´ho objektu anima´toru a inicializace jeho nastavenı´ obsahujı´cı´ de´lku animace, zpozˇdeˇnı´ animace, cˇasovacˇ animace a dalsˇ´ı. Pote´ se spustı´ metoda start objektu anima´toru, ktera´ spustı´ vlastnı´ animacˇnı´ proces. Animacˇnı´ proces probı´ha´ v objektu trˇ´ıdy Animator. V tomto procesu docha´zı´ k periodicke´mu vyvola´va´nı´ uda´lostı´ podle vnitrˇnı´ch hodin objektu a tyto uda´losti jsou prˇeda´va´ny prˇirˇazene´mu objektu cˇasovacˇe. Jedna´ se o uda´losti vyvola´vajı´cı´ metodu begin, tato metoda je vyvola´na na zacˇa´tku animace, metodu end, tato metoda je vyvola´va´na na konci animace, a metodu timingEvent, tato metoda je vyvola´va´na periodicky a obsahuje parametr s informacı´ o tom, v jake´ cˇa´sti se animace zrovna nacha´zı´. Metody begin a end se zpracova´vajı´ v abstraktnı´ trˇ´ıdeˇ AbstractTimer, tuto trˇ´ıdu pote´ rozsˇirˇujı´ jednotlive´ cˇasovacˇe. V metodeˇ begin docha´zı´ k vynulova´nı´ promeˇnne´ obsahujı´cı´ informaci o tom, v jake´m stavu se nacha´zela animace prˇi prˇedchozı´m prˇerusˇenı´. Da´le se zde spousˇteˇjı´ animace, ktere´ jsou na tuto animaci nava´zane´ a majı´ se spustit za´rovenˇ s touto animacı´. V metodeˇ end docha´zı´ ke spousˇteˇnı´ nava´zany´ch animacı´, ktere´ se majı´ spustit po skoncˇenı´ te´to animace. Metoda timingEvent se implementuje v jednotlivy´ch konkre´tnı´ch cˇasovacˇ´ıch a obsahuje vlastnı´ implementaci chova´nı´ animace. Neˇktere´ cˇasovacˇe prˇi prvnı´ uda´losti vypocˇ´ıtajı´ hodnoty dane´ animace, jako naprˇ´ıklad u´hel rotace u cˇasovacˇe rotace, a tyto hodnoty da´le vyuzˇ´ıvajı´ prˇi dalsˇ´ım vyvola´nı´ uda´lostı´. Da´le docha´zı´ v metodeˇ k vypocˇ´ıta´nı´ aktua´lnı´ch pomocny´ch hodnot pro provedenı´ samotne´ transformace objektu˚ a na´sleduje vyvola´nı´ metody transformace ve vnitrˇnı´ trˇ´ıdeˇ R2 trˇ´ıdy Mediator. Tato trˇ´ıda obsahuje objekt typu R2 Transformation, ktery´ zpracova´va´ metody jednotlivy´ch druhu˚ animace. Da´le na´sleduje vyvola´nı´ metody obsluhujı´cı´ transformaci nava´zany´ch objektu˚. Metody transformacı´ objektu˚ ve trˇ´ıdeˇ R2 Transformation majı´ podobnou funkcˇnost popsanou na´sledovneˇ. Nejdrˇ´ıve se zkontroluje, zda prˇedane´ argumenty jsou dostatecˇne´ k provedenı´ transformace. Pote´ se vypocˇ´ıtajı´ pomocne´ hodnoty transformace a
33
vytvorˇ´ı se novy´ objekt trˇ´ıdy AffineTransform (standardnı´ trˇ´ıda Javy) implementujı´cı´ vlastnı´ transformaci. Da´le se tento objekt nastavı´ jako transformace typu odpovı´dajı´cı´mu metodeˇ, ve ktere´ je instanciova´n, a jsou mu prˇeda´ny parametry transformace. Na´sledneˇ se postupneˇ procha´zı´ jednotlive´ transformovane´ objekty a jejich jednotlive´ body jsou transformova´ny pomocı´ nadefinovane´ho objektu transformace. Transformace nava´zany´ch objektu˚ jsou vykona´va´ny ve trˇ´ıdeˇ R4 ConnectedTransformations pomocı´ metody runConnectedTransformations. V metodeˇ se nejdrˇ´ıve procha´zejı´ jednotlive´ rˇ´ıdı´cı´ body obsazˇene´ registru rˇ´ıdı´cı´ch bodu˚ a hledajı´ se jejich nava´zane´ body. Pro vsˇechny tyto nava´zane´ body se spocˇ´ıta´ vzda´lenost mezi rˇ´ıdı´cı´m bodem a jeho nava´zany´m bodem. Pokud je vzda´lenost veˇtsˇ´ı nezˇ 0,001 tak se nalezne kresleny´ objekt obsahujı´cı´ tento nava´zany´ bod. Da´le dojde k otestova´nı´, zda byl objekt jizˇ transformova´n. Tento test je zde umı´steˇny´ pro zabra´neˇnı´ zacyklova´nı´ programu. V prˇ´ıpadeˇ, zˇe objekt nebyl transformova´n, dojde k transformaci objektu. Tato transformace je prova´deˇna v soukrome´ metodeˇ transformShape. V metodeˇ transformShape je prova´deˇna vlastnı´ transformace nava´zany´ch objektu˚. Zde se nejdrˇ´ıve vypocˇ´ıta´ obde´lnı´k ohranicˇujı´cı´ nava´zany´ objekt, Da´le se zjistı´ poloha nava´zane´ho bodu vzhledem k objektu a vypocˇ´ıta´ se bod lezˇ´ıcı´ na opacˇne´ straneˇ vzhledem ke strˇedu objektu. Tento bod bude pote´ bra´n jako referencˇnı´ bod prˇi rotaci objektu. Da´le je provedena transformace objektu rotacı´ pomocı´ modifikovane´ho bodu, bodu, ktery´ je na neˇj nava´za´n a vypocˇ´ıtane´ho referencˇnı´ho bodu. Na´sleduje transformace posunem odpovı´dajı´cı´m vzda´lenosti mezi modifikovany´m bodem a nava´zany´m bodem.
34
9
Za´veˇr
V te´to pra´ci jsem navrhl jednoduchy´ animacˇnı´ program vyuzˇitelny´ pro vy´ukove´ u´cˇely. Tento program je vytvorˇen pomocı´ na´vrhovy´ch vzoru˚ pro zajisˇteˇnı´ jednoduche´ modifikace a prˇida´va´nı´ novy´ch funkcı´. Struktura trˇ´ıd programu je popsa´na pomocı´ trˇ´ıdnı´ch diagramu˚ a funkce jeho hlavnı´ch metod je rozepsa´na pomocı´ sekvencˇnı´ch diagramu˚. Soucˇa´stı´ pra´ce je i prototypova´ aplikace implementujı´cı´ navrhnutou za´kladnı´ funkcˇnost. Tato aplikace je napsa´na pomocı´ programovacı´ho jazyka Java. Tato pra´ce mi prˇinesla mozˇnost zdokonalenı´ v programova´nı´ v jazyce Java a za´rovenˇ jsem mohl vyzkousˇet konkre´tnı´ uplatneˇnı´ na´vrhovy´ch vzoru˚ prˇi na´vrhu aplikace a jejı´ implementaci.
35
10
Literatura
[1] Timing framework, https://timingframework.dev.java.net/. [2] Java 2D, http://java.sun.com/products/java-media/2D/index.jsp. [3] Jigloo, http://www.cloudgarden.com/jigloo/. [4] Fat Jar:, http://fjep.sourceforge.net/. [5] XStream, http://xstream.codehaus.org/. [6] Stickman 5, http://www.cutoutpro.com/.