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: p8r17rf
- 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^).
Parametrii au urmatoarea semnificatie:
- x1,y1,x2,y2 - coordonatele coltului din stanga sus si dreapta jos ale
dreptunghiului care contine imaginea;
- a^ - spatiul in care se face salvarea. Referitor la ultimul parametru,
facem urmatoarele precizari:
- a este variabila de tip Pointer
- cand scriem a, ne referim la adresa unde s-a facut rezervarea);
- cand scriem a^ ne referim la continutul de la adresa care se gaseste
in variabila a.
In concluzie, procedura GetImage are rolul de a salva o imagine in
memorie. Operatia inversa, da a reface imaginea prin aducerea octetilor de informatie
in memoria video, se face prin utilizarea procedurii PutImage. Aceasta
are forma generala: PutImage(x1,y1,a^,XorPut).
Parametrii au urmatoarea semnificatie:
- x1,y1 - coordonatele coltului din stanga sus al dreptunghiului care
contine imaginea (nu este obligatoriu sa refacem imaginea in pozitia pe
care a avut-o inainte de salvare, acest fapt permite si animatia);
- a^ - continutul zonei de memorie a carei adresa se gaseste in a;
- parametrul XorPut, prezentat si la SetWriteMode si care are rolul ca odata
figura sa fie vizibila, odata nu (se deseneaza utilizand culoarea de fond).
Utilizand tehnica salvarii si refacerii imaginii, pentru a realiza animatia
se procedeaza astfel:
- se deseneaza figura intr-o prima pozitie;
- se calculeaza numarul de octeti necesari salvarii ei in memoria interna;
- se salveaza imaginea;
- se asteapta un interval de timp;
- se reface imaginea dar cu culoarea fondului, ceea ce duce de fapt la stergerea
ei;
- repetitiv se procedeaza astfel:
- se reface imaginea intr-o pozitie noua;
- se asteapta un interval de timp;
- se reface imaginea in aceeasi pozitie dar, datorita parametrului XorPut,
de fapt se sterge;
- procedeul continua pana cand s-a ajuns in pozitia finala.
Tehnica 3
Aceasta tehnica nu este aplicabila in general, ci numai in cazul
in care se lucreaza intr-un mod grafic, cu un driver grafic ce permite
utilizarea mai multor pagini video. O pagina video este memoria necesara (existenta
fizic pe placa grafica) ce permite retinerea unei imagini.
Ideea de baza este urmatoarea: atat timp cat este vizualizata o
pagina, intr-o alta se realizeaza desenul in noua pozitie. Prin
aceasta se castiga timp.
Un exemplu in care putem folosi aceasta tehnica este atunci cand
folosim driverul VGA si lucram in modul VGALo, caz in care dispunem de
4 pagini video. Apar doua notiuni noi si anume pagina vizualizata si pagina
activa.
Pagina vizualizata este aceea care se vede pe ecran, iar cea activa este cea
in care actioneaza procedurile grafice. Daca avem o singura pagina video,
cele doua natiuni coincid. In cazul in care se lucreaza cu mai multe
pagini video, una poate fi vizualizata si alta activa. Stabilirea paginii care
se vizualizeaza se face cu ajutorul procedurii SetVisualPage(nr), unde nr reprezinta
numarul paginii. Facem precizarea ca paginile se numeroteaza incepand
cu 0 (astfel, daca dispunem de 4 pagini video, acestea sunt numerotate intre
0 si 3). Stabilirea paginii active se face cu procedura SetActivePage(nr), unde
parametrul nr este de tip Integer si are semnificatia de numar al paginii.