|
Ne propunem s? r?spundem la urm?toarea întrebare: cum facem o figur? s? se mi?te pe ecran? Pentru rezolvarea acestei probleme exist? mai multe tehnici care vor fi prezentate în continuare, dar toate au acela?i principiu de func?ionare ?i anume:
- se deseneaz? figura:
- se a?teapt? o perioad? de timp;
- se ?terge figura ?i se deplaseaz? într-o alt? pozi?ie.
Pentru ca figura s? par? c? se mi?c? în mod real, un rol important îl are timpul de a?teptare (timpul în care figura r?mâne pe ecran pân? a se ?terge). Acesta se regleaz? de la caz la caz cu ajutorul procedurii Delay.
În principal, exist? trei tehnici de realizare a anima?iei. Ele difer? prin procedurile pe care le utilizeaz? ?i prin viteza de execu?ie. Pentru exemplificarea lor vom folosi o singur? problem? ?i anume de a mi?ca un p?trat pe orizontal?.
Tehnica 1
Opera?iile de desenare ?i ?tergere a figurii se fac cu ajutorul procedurii SetWriteMode, pe care o vom prezenta în continuare.
Forma general? a acestei proceduri este SetWriteMode(valoare întreag?). Vom folosi aceast? procedur? cu un singur parametru ?i anume XorPut (valoarea 1 predefinit? în Unit-ul Graph). În concluzie, vom pune SetWriteMode(XorPut).
Dup? apelul acestei proceduri proced?m astfel:
- apel?m o procedur? care deseneaz? o figur? (aceasta va fi vizibil? pe ecran); ¬
- a?tept?m o perioad? de timp;
- apel?m din nou procedura care realizeaz? desenul, exact in aceea?i pozi?ie (la acest apel desenul va disp?rea, pentru c?, de fapt, desenul se realizeaz? acum utilizând culoarea fondului);
- apel?m procedura care realizeaz? desenul într-o alt? pozi?ie (acesta va deveni vizibil, pentru c? se realizeaz? utilizând culoarea curent?);
- a?tept?m o perioad? de timp;
- procedeul se repet? pân? când figura a ajuns în pozi?ia dorit?.
Tehnica 2
Aceast? tehnic? de anima?ie este superioar? primei tehnici, datorit? faptului c? este mai rapid? opera?ia de aducere din memorie pe ecran a unei imagini, decât desenarea ei. Acest fapt constituie un mare avantaj în cazul imaginilor complexe.
Pentru a în?elege aceast? tehnic?, trebuie s? prezent?m în prealabil câteva proceduri.
Orice imagine care se afl? pe ecran poate fi salvat? în memoria intern?. Exist? posibilitatea ca anumite informa?ii (cum ar fi cele care permit vizualizarea unei imagini) s? fie salvate în memoria intern?, alocând spa?iul necesar pentru aceasta în timpul execu?iei programului. O astfel de alocare a memoriei poart? numele de alocare dinamic? ?i se va studia în detaliu în clasa a zecea, dar pentru aceast? tehnic? de anima?ie ne sunt necesare câteva cuno?tin?e minimale.
Variabila de tip Pointer are posibilitatea de a re?ine o adres? în memorie (a nu se face confuzie între adresa unei zone de memorie ?i con?inutul ei). Alocarea spa?iului în memorie (un num?r de octe?i consecutivi la o anumit? adres?) se face cu ajutorul procedurii GetMem care creeaz? în heap o variabil? dinamic? de dimensiune specificat?.
Sintax?: Procedure GetMem (Var p : Pointer, dim : Word);
P – variabil? de tip pointer care va con?ine adresa de început a zonei alocate variabilei
dinamice
Dim – este o expresie care stabile?te lungimea în octe?i a zonei care va fi ocupat? în heap.
Valorea sa maxim? este 65521.
Cum salv?m imaginea? De fapt, se salveaz? imaginea con?inut? într-un dreptunghi pentru care se cunosc coordonatele col?urilor din stânga sus ?i dreapta jos: De unde ?tim câ?i octe?i sunt necesari pentru a salva o imagine? Aici, ne este de mare folos func?ia ImageSize. Aceast? func?ie este de tip Word ?i returneaz? num?rul de octe?i necesari pentru salvarea unei imagini în cazul când dispunem de acest spa?iu, în caz contrar se returneaz? valoarea 0.
Pân? acum ?tim cum putem afla num?rul de octe?i necesari memor?rii imaginii, cum s? rezerv?m spa?iul necesar memor?rii imaginii, dar nu ?tim cum salv?m efectiv imaginea (octe?ii corespunz?tori ei afla?i în memoria video). Pentru a putea realiza aceasta, folosim procedura GetImage are forma urm?toare: GetImage (x1,y1,x2,y2,a^).
|