Tehnici de animatie 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; 42168rrj85nxz7v 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; 42168rrj85nxz7v 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.