Newsgroup: it.comp.java
Titolo: Repaint di un Container

Salve a tutti, spero che qualcuno mi sappia aiutare.
Devo poter disegnare su un Container (e fin qui non ci sono problemi),
qualcosa che poi quando chiamo repaint() non mi venga cancellata.
Come posso fissare un'immagine su un Container?
Questo mi serve perché quando chiamo repaint() per far muovere gli oggettini
che ho disegnato sul container, mi viene cancellato anche lo sfondo e questo
mi da un pochettino di fastidio.
Ho provato a ridisegnare ogni volto lo sfondo, ma l'animazione flescia da
morire.
Se non ho letto male ci dovrebbe essere un modo per fissare l'immagine ad un
Container().
Spero di essere stato sufficientemente chiaro.
Grazie a tutti anche solo per aver letto questa mia strana News

 ha scritto nel messaggio
news:9j3hl8$38m6$1...@stargate1.inet.it...

Io di norma mi riscrivo il metodo paint. Innanzitutto devi "svuotare" il
metodo update. Il meto update viene chiamato prima di ogni paint e repaint e
principalmente si occupa di cancellare lo sfondo con un bel fillRect(...) e
poi di settare il colore di foreground con setColor(..) e infine di chiamare
paint(..). Il problema dello sfarfallio è proprio quel fillRect!!
quindi
public void update(Graphics g) {
    paint(g);
}
e così non cancella più lo schermo. Poi nel metodo paint disegni come piace
a te con i metodi della classe Graphics. Se invece ti interessa solo
togliere lo sfarfallio e far si che disegni i componenti che ha nel
container, quello che devi fare è crearti una bella immagine di offscreen e
lavorare su di essa così:
public Image offscreen;
public Graphics oofg;
public void costruttore()
offscreen=createImage(larg_container,alt_container);
Graphics offg=offscreen.getGraphics();
}
public void update(Graphics g) {
    paint(g);
}
public void paint(Graphics g) {
super.paint(offg);
g.drawImage(offscreen,0,0,this);
}
In pratica, il costruttore crea un immagine. Quando si chiama un repaint,
viene passato al metodo della superclasse del container, come graphics,
quello relativo all'immagine offscreen. Quindi il vecchio "paint" disegna su
quell'immagine e quando ha finito, il nuovo paint disegna su schermo la tua
immagine "preconfezionata"!
Un pò complicatino se non hai dimestichezza, ma se capisci questo risolvi
tutti i problemi di sfarfallio. Lavorare offscreen è comodo, pulito e
soprattutto ottieni sempre quello che volevi!!
Ciao!!

Ciao, spero che non ti offendi se approfitto delle tue conoscenze.
Vorrei implemtare qualche giochettino, volevo sapere se c'è qualche buon
metodo per renderizzare le scene (2D).
Mi spiego meglio, date una serie di immagini che compongono i strati del
piano di gioco(es. sfondo con pista, ostacoli e vetture) ci sono dei metodi
per comporre velocemente le immagini e per aggiornarle?
So che Java 2 da questi aiuti, ma quel bisonte di Visual Cafe 3.0c non sa
neanche cos'è Java 2.
Mi hanno detto però che è possibile farglielo digerire, ma non so come, tu
sai dirmi qualcosa su questo argomento?

 ha scritto nel messaggio
news:9j41hi$5vm6$1...@stargate1.inet.it...

Umh... beh, l'offscreen!! In pratica grazie ad esso prima di mandare su
video quello che vuoi, disegni la scena e poi una volta che in memoria l'hai
completata, la fai dipingere.
Es: macchinine che scorrono su di uno sfondo:
prima disegni lo sfondo, poi sopra le macchinine nelle posizioni aggiornate,
poi dipingi a schermo:
supponi di avere una classe che estende Components. Svuota l'update come ho
scritto nel messaggio precedente, e creati l'immagine offscreen e il suo
graphics.
paint(Graphics g) {
    offg.drawImage(sfondo,0,0,this);
    offg.drawImage(auto1,x_auto1,y_auto1,this);
    offg.drawImage(auto2,x_auto2,y_auto2,this);
    g.drawImage(offscreen,0,0,this);
}
Ogni qualvolta disegni su g, disegni direttamente a schermo. Ogni qualvolta
disegni su offg, disegni sull'immagine in memoria. La procedura è quindi:
disegno tutto in memoria
disegno a schermo quello che ho in memoria.
Colui che si occuperà di aggiornare le posizioni delle vetture, sarà
ovviamente una classe che implementa Threads o Runnable e che alla fine dopo
aver calcolato le nuove posizioni delle macchinine, chiamerà un bel
repaint(). Questo chiamerà da solo update che essendo stato svuotato,
troverà solo l'istruzione paint(g) che chiamerà il tuo metodo paint, che
prima disegno offscreen e poi a schermo!!
Fammi sapere ancora per ogni dubbio che se vuoi andiamo ancora + nello
specifico(=invia il codice che ci si lavora sopra!)
Ciao!!

Per ora grazie mille, la tecnica è essenzialmente quella che conoscevo sotto
C (e che implementavo in assembler) conosciuta con il termine "Double
Buffering".
Il concetto di questa tecnica mi è molto chiaro, il problema è che con Java
non riesco a capire come far interagire i livelli.
Ad esempio (P.S. io uso Java 1.1) se lo sprite dell'automobilina ha delle
zone trasparenti il metodo drawImage, le gestisce in automatico?
Mi piacerebbe implementare un giochino di Auto e uno dei problemi
fondamentali è proprio quello di gestire le trasparenze.
Per esempio se la pista ha de più livelli, per esempio livello 1 = sfondo,
Livello 2 = rampe e ponti, livello 3 = altro, ovviamente quando disegno una
sopra l'altro i livelli, voglio che questi compongano l'immagine e non che
il Livello 3 comprea tutto.
Altro problema è quello di capire se sto nella pista o se sto urtando contro
qualche ostacolo.
Pensavo di tenere in memoria un'immagine in B/N dove se bianco sto nella
pista nero sto fuori, etc.
Ancora più ostico è capire come far ruotare gli sprite in tempo reale.
Quando sul 286 la capacità di calcolo non mi permetteva di calcolare le
rotazioni in tempo reale, scavalcavo il problema disegnado le varie fasi di
rotazione dello sprite.
Ma in java non so come gestire e come fare sprite che possano essere
animati.
Se hai dei consigli o dei link dove studiare e su come affrontare queste
tematiche, te ne sarei mooolto grato.
Purtroppo non posso dedicarmi spesso allo sviluppo di questo giochino perché
come finisco un progetto a lavoro, me ne danno subito un'altro, quindi prima
che ti possa mostrare qualche cosa ne passerà.
Volevo anche chiederti se la E-Mail che leggo nelle proprietà del tuo Nick è
reale oppure no, perchè almeno ti scrivo direttamente.
Se vuoi rispondimi direttamente, così memorizzo la tua E-Mail.
Ciao e grazie per il prezziosissimo supporto.

Primo: la mail č proprio quella!! Non credermi uno sbruffone e non
domandarti perchč usi questo nick!! E' una cosa piuttosto particolare! Viene
da un film ambientato a New Orleans ai tempi della America del West, ma non
andiamo oltre nella spiegazione!!
Secondo: massimo rispetto a chi abbia programmato anche in assembler, un
tempo neanche troppo lontano lo facevo anche io!
Terzo: io sono cresciuto guardando i Simpson e TelespallaBob era proprio un
fico!!
Allora: le trasparenze grazie a Dio sono gestite automaticamente: se hai uno
sfondo e sopra ci disegni una gif, vedrai che effettivamente č cosě!
Effettivamente double buffering č il nome giusto per quella cosa che io
erroneamente chiamo disegnare offscreen!!
Quindi visto che le trasparenze restano tali anche con il drawImage (e pensa
che con drawImage puoi anche disegnare una gif animata che ci pensa da sola
ad aggiornare la propria immagine!! Anche se sfarfalla di brutto!!) non hai
problemi a disegnare la pista e tutto ciň che vi sta "sopra". Il problema č
gestire le collisioni. Io proverei a definire gli oggetti (rampe, macchine
avversarie e cosě via) come delle classi a se stanti che comprendano dati
relativi alla propria posizione e alla propria dimensione. E poi scriverei
un algoritmo che mi permetta di controllare se la mia vettura urta (ovvero
interseca) l'area di qualche oggetto. Tale algoritmo č molto semplice e
anche performante, se le aree che decidi di controllare sono rettangolari.
Resto effettivamente un pň spaesato su come gestire il fatto che la macchina
si trovi in pista o meno. Non so, l'idea dell'immagine B/N potrebbe essere
buona, ma mi lascia un pň perplessino. Perň al momento proprio non ho idea.
La rotazione: c'ho provato anche io, ma ancora non ho ben capito!! So
ruotare tutto il contesto grafico (metodi della classe Graphics2D), ma
un'immagine singolarmente ci devo lavorare ancora un pň sopra. Se vuoi usare
immagini preruotate, basta che te le carichi tutte in memoria e poi con una
bel contatore, a seconda della rotazione che hai disegni l'una o l'altra!
Link: 
www.mokabyte.it
E' uno dei siti piů belli per imparare java (in particolare ha un piccolo
motore di ricerca sugli articoli che sono stati scritti (parecchi!!)) ed č
tutto in italiano!!
Fammi sapere che la cosa mi prende abbastanza!!