Ne propunem sa raspundem la urmatoarea intrebare: cum facem o figura sa se miste pe ecran? Pentru rezolvarea acestei probleme exista mai multe tehnici care vor fi prezentate in continuare, dar toate au acelasi principiu de functionare si anume:
- se deseneaza figura:
- se asteapta o perioada de timp;
- se sterge figura si se deplaseaza intr-o alta pozitie.
Pentru ca figura sa para ca se misca in mod real, un rol important il are timpul de asteptare (timpul in care figura ramane pe ecran pana a se sterge). Acesta se regleaza de la caz la caz cu ajutorul procedurii Delay.
In principal, exista trei tehnici de realizare a animatiei. Ele difera prin procedurile pe care le utilizeaza si prin viteza de executie. Pentru exemplificarea lor vom folosi o singura problema si anume de a misca un patrat pe orizontala.
Tehnica 1
Operatiile de desenare si stergere a figurii se fac cu ajutorul procedurii SetWriteMode, pe care o vom prezenta in continuare.
Forma generala a acestei proceduri este SetWriteMode(valoare intreaga). Vom folosi aceasta procedura cu un singur parametru si anume XorPut (valoarea 1 predefinita in Unit-ul Graph). In concluzie, vom pune SetWriteMode(XorPut).
Dupa apelul acestei proceduri procedam astfel:
- apelam o procedura care deseneaza o figura (aceasta va fi vizibila pe ecran); ¬
- asteptam o perioada de timp;
- apelam din nou procedura care realizeaza desenul, exact in aceeasi pozitie (la acest apel desenul va disparea, pentru ca, de fapt, desenul se realizeaza acum utilizand culoarea fondului);
- apelam procedura care realizeaza desenul intr-o alta pozitie (acesta va deveni vizibil, pentru ca se realizeaza utilizand culoarea curenta);
- asteptam o perioada de timp;
- procedeul se repeta pana cand figura a ajuns in pozitia dorita.
Tehnica 2
Aceasta tehnica de animatie este superioara primei tehnici, datorita faptului ca este mai rapida operatia de aducere din memorie pe ecran a unei imagini, decat desenarea ei. Acest fapt constituie un mare avantaj in cazul imaginilor complexe.
Pentru a intelege aceasta tehnica, trebuie sa prezentam in prealabil cateva proceduri.
Orice imagine care se afla pe ecran poate fi salvata in memoria interna. Exista posibilitatea ca anumite informatii (cum ar fi cele care permit vizualizarea unei imagini) sa fie salvate in memoria interna, alocand spatiul necesar pentru aceasta in timpul executiei programului. O astfel de alocare a memoriei poarta numele de alocare dinamica si se va studia in detaliu in clasa a zecea, dar pentru aceasta tehnica de animatie ne sunt necesare cateva cunostinte minimale.
Variabila de tip Pointer are posibilitatea de a retine o adresa in memorie (a nu se face confuzie intre adresa unei zone de memorie si continutul ei). Alocarea spatiului in memorie (un numar de octeti consecutivi la o anumita adresa) se face cu ajutorul procedurii GetMem care creeaza in heap o variabila dinamica de dimensiune specificata.
Sintaxa: Procedure GetMem (Var p : Pointer, dim : Word);
P - variabila de tip pointer care va contine adresa de inceput a zonei alocate variabilei
dinamice
Dim - este o expresie care stabileste lungimea in octeti a zonei care va fi ocupata in heap.
Valorea sa maxima este 65521.
Cum salvam imaginea? De fapt, se salveaza imaginea continuta intr-un dreptunghi pentru care se cunosc coordonatele colturilor din stanga sus si dreapta jos: De unde stim cati octeti sunt necesari pentru a salva o imagine? Aici, ne este de mare folos functia ImageSize. Aceasta functie este de tip Word si returneaza numarul de octeti necesari pentru salvarea unei imagini in cazul cand dispunem de acest spatiu, in caz contrar se returneaza valoarea 0.
Pana acum stim cum putem afla numarul de octeti necesari memorarii imaginii, cum sa rezervam spatiul necesar memorarii imaginii, dar nu stim cum salvam efectiv imaginea (octetii corespunzatori ei aflati in memoria video). Pentru a putea realiza aceasta, folosim procedura GetImage are forma urmatoare: GetImage (x1,y1,x2,y2,a^).