CATEGORII DOCUMENTE |
Implicit aceasta metoda are urmatorul cod sursa:
public void update(Graphics g)
Putem alege o versiune de rezolvare a problemei palpairii prin anularea totala a stergerii ecranului.Aceasta solutie nu poate fi aplicata pe scara larga dar in cazurile in care se poate aplica este cea mai simpla solutie.
Sa luam ca exemplu codul sursa de mai jos:
import java.awt.*;
public class AlternareCulori extends java.applet.Applet implements Runnable
}
public void stop()
public void run()
int i=0;
Thread firExecutie=Thread.currentThread();
while (executabil==firExecutie) catch (InterruptedException e)
if (i==culori.length) i=0;
}
}
public void paint(Graphics ecran)
}
Pentru a intelege cat mai bine appletul sa incercam un comentariu aproape linie cu linie al codului sursa:
Linia 5 defineste o variabila 'culori' care desemneaza un tablou cu 50 de elemente.La pornirea appletului metoda run() umple acest tablou cu obiecte Color.Crearea tabloului de culori poate fi realizata si in metoda paint() dar nu ar avea logica, el creandu-se astfel la fiecare apelare a metodei paint().In realitate este de ajuns crearea sa o singura data, astfel incat e mai bine sa cream tabloul de culori in metoda init().
Pentru a crea obiecte de culori diferite s-a folosit metoda getHSBColor() ; aceasta este parte a clasei Color si creaza un obiect Color pe baza combinatiei intre nuanta (hue), saturatie (saturation) si luminozitate (brightness).Prin incrementarea valorii nuantei putem astfel crea un obiect cu o culoare noua - avantajul crearii in acest fel a obiectelor Color fiind rapiditatea mai mare a limbajului la implementarea acestei metode.
Pentru a se obtine animatia - adica modificarea continua a culorii textului afisat de applet - se utilizeaza un ciclu care strabate tabloul de culori stabilind pe rand fiecare culoare din tablou drept culoare de desenare si apoi reapeleaza metoda repaint().Datorita conditiei din ciclul while procesul descris mai sus se va relua la infinit pana la oprirea fortata a appletului.
La rularea appletului - e adevarat ca si in functie de hardware-ul disponibil - apare efectul de flicker ; acesta se datoreaza aici faptului ca la fiecare desenare a sirului cu o noua culoare exista si o operatie de stergere totala a ecranului.
Acum vom opera modificarea metodei update() pentru a reduce acest efect suparator.Vom inlatura din metoda partea responsabila cu stergerea ecranului, obtinand o metoda update() cu urmatorul cod sursa:
public void update(Graphics ecran)
Cea de a doua metoda de evitare a flickerului este dubla memorare.Aceasta consta in procesul de a desena un cadru intreg de animatie intr-o zona invizibila inainte de a-l copia in zona vizibila de pe ecran.Zona invizibila in care lucram se numeste buffer (sau memorie tampon).
Prin aceasta tehnica se creaza practic inca o suprafata de desenare, se fac toate operatiunile de desenare pe ea dupa care se deseneaza dintr-o data intreaga suprafata in fereastra principala a appletului - toate acestea in loc sa se deseneze direct in fereastra appletului, pe rand fiecare element.
Tehnica dublei memorari este destulde performanta, ea reusind sa elimine practic flickerul dar aduce dezavantajul unei folosiri intensive a memoriei sistemului de calcul.Pentru a crea un applet bazat pe aceasta tehnica trebuie sa avem o imagine pe care o desenam in buffer si un context grafic pentru acea imagine.Acestea vor simula efectul desenarii pe suprafata appletului:contextul grafic (de fapt o instanta a clasei Graphics) care ofera metodele de desen si obiectul Image, care memoreaza ceea ce se va desena.
Ca sa reusim implementarea corect a tehnicii de mai sus trebuie sa parcurgem patru etape.
Mai intai imaginea invizibila si contextul grafic trebuie stocate in variabile de instanta care vor putea apoi fi trimise metodei paint().Acest lucru se face sintactic la modul urmator:
Image imagineInvizibila;
Graphics invizibil;
In al doilea rand pe parcursul initializarii appletului vom crea obiecte Image si Graphics pe care le vom atribui acestor variabile.Metoda createImage() returneaza o instanta a clasei Image, pe care apoi o putem transmite metodei getGraphics() pentru a obtine un nou context pentru imaginea respectiva:
imagineInvizibila = createImage(size().width, size().height);
invizibil=imagineInvizibila.getGraphics();
In acest moment, ori de cate ori va trebui sa desenam pe ecran - cu metoda paint() - vom desena in contextul grafic invizibil ; ca exemplu, pentru a desena o imagine numita img la pozitia 100,100 folosim linia de cod:
invizibil.drawImage(img,100,100,this);
In ceea ce priveste cuvantul cheie this folosit aici nu va faceti probleme pentru ceea ce reprezinta - va fi prezentat mai detaliat in paginile urmatoare.
Ultima etapa, dupa ce s-a terminat de desenat totul in contextul invizibil, instructiunea urmatoare copiaza zona tampon invizibila pe ecran:
ecran.drawImage(imagineInvizibila,0,0,this);
Pentru a elimina si umplerea ecranului cu culoarea de fond (operatia default a metodei update()) este indicat sa suprascriem si metoda update() la modul urmator:
public void update(Graphics g)
Pentru a realiza in practica implementarea dublei memorari vom prezenta un exemplu de applet care deseneaza si misca un cer intre doua patrate colorate diferit - appletul se numeste 'Dame', dupa asemanarea rezultatului vizual cu o piesa din acest joc:
import java.awt.*;
public class Dame extends java.applet.Applet implements Runnable
public void start()
}
public void stop()
public void run()
repaint();
try catch (InterruptedException e)
}
}
public void update(Graphics ecran)
public void paint(Graphics ecran)
public void destroy()
}
Sa comentam putin programul de mai sus:
- variabila pozX este folosita pentru a muta cercul dintr-un loc in altul, ea pastrand coordonatele unde se afla piesa la un moment dat.Valoarea variabilei se modifica continuu in metoda run().
- primul pas pentru dubla memorare consta in crearea unui obiect Image care sa pastreze cadrul invizibil pana cand acesta este complet si a unui obiect Graphics care sa permita desenarea in aceasta zona invizibila.Acest lucru il fac liniile:
Image imgInvizibila;
Graphics invizibil;
- celor doua variabile amintite in randurile precedente li se atribuie obiecte create in metoda init() a appletului:
public void init()
- metoda paint() este modificata pentru a scrie zona tampon invizibila in locul obiectului principal Graphics ; practic, doar ultima linie a metodei paint() afiseaza in fereastra appletului.Aceasta instructiune afiseaza cadrul de animatie complet la coordonatele 0,0.Deoarece obiectul imgInvizibil a fost creat de aceeasi dimensiune ca zona de ecran el va acoperi complet fereastra appletului.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1310
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved