PDA

View Full Version : [JAVA] come far apparire un immagine e poi farla scomparire


alessia86
22-08-2009, 14:55
Allora..sto facendo un videogioco in java..ora se voglio far apparire un oggetto dopo un tot di tempo dall'inizio dell'applicazione..Io ho usato un thread..Vi mostro il codice del metodo run:



public void run(){


try {

sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/

dis=true;


f.render();

}
}


// f indica il frame dove devo mettere l'immagine

//nel metodo render della classe frame richiamo il thread che si chiama Bonus

public void render(){

if(b.dis){
g.drawImage(bon,100,500,this);
}
}



dis è la variabile booleana che vale true quando il thread si sveglia e disegna l'immagine ..
L'errore che mi da è che se metto la variabile dis non mi appare nemmeno il frame...mentre se la tolgo mi appare il frame con l'immagine..solo che l'immagine appare da subito..ed io voglio farla apparire dopo un pò..
Qualcuno sa aiutarmi???
Grazie infinite!! :muro:

PGI-Bis
22-08-2009, 22:08
Puoi farlo con un Thread ma la questione poi diventa piuttosto complicata perchè l'architettura complessiva del tuo motore di gioco diventa concorrente rispetto ad una pipeline di rendering (Swing o AWT) che è specificamente progettata per operare in un contesto sequenziale. Comunque supponendo che tu abbia uno "schermo" su cui disegnare di questa specie:

class JCanvas extends JComponent {
private volatile boolean dis;
private final Image bon = new ImageIcon(getClass().getResource("/bonus.png")).getImage();

public void setDisState(boolean value) {
dis = value;
repaint();
}

protected void paintComponent(Graphics graphics) {
if(dis) {
graphics.drawImage(bon, 100, 100, this);
}
}
}

Un Thread che dopo tot secondi attivi il disegno condizionato dal booleano "dis" sarebbe:

new Thread() {
public void run() {
try {
Thread.sleep(DELAY);
} catch(InterruptedException ex) {
return;
}
canvas.setDisState(true);
}
}.start();

L'esempio completo sarebbe:

import java.awt.*;
import javax.swing.*;

public class Main {

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {
public void run() {
showUI();
}
});
}

private static void showUI() {
final JCanvas canvas = new JCanvas();
canvas.setPreferredSize(new Dimension(640, 480));
JFrame window = new JFrame("Test");
window.add(canvas);
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.pack();
window.setVisible(true);
final long DELAY = 1500;
new Thread() {
public void run() {
try {
Thread.sleep(DELAY);
} catch(InterruptedException ex) {
return;
}
canvas.setDisState(true);
}
}.start();
}
}

class JCanvas extends JComponent {
private volatile boolean dis;
private final Image bon = new ImageIcon(getClass().getResource("/bonus.png")).getImage();

public void setDisState(boolean value) {
dis = value;
repaint();
}

protected void paintComponent(Graphics graphics) {
if(dis) {
graphics.drawImage(bon, 100, 100, this);
}
}
}

E' una soluzione molto specifica. Di solito un gioco anche moderatamente animato ha un'architettura di base specificamente progettata allo scopo di gestire la reazione dell'universo virtuale ad una varietà di eventi - tra cui il trascorrere del tempo.