• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Guida Creare software con Canvas e interfaccia Runnable

Mi.ke

Utente Master
Autore del topic
16 Giugno 2011
2.857
60
Miglior risposta
0
Salve a tutti cari lettori,

Voglio scrivervi una breve guida riguardo l'uso dei Canvas, (obbligatoriamente) anche attraverso l'uso dell'interfaccia Runnable.

Che cosa dobbiamo fare?

Noi abbiamo delle immagini da dover disegnare nel nostro Canvas.
Quindi ci serve un oggetto che 'trascriva' ciò che gli passiamo.

Iniziamo con creare un oggetto che si riferisca all'immagine.






public class Immagine {


BufferedImage immagine; // BufferedImage è l'oggetto di cui abbiamo bisogno per caricare l'immagine
int larghezza,altezza; // Parametri riguardanti le dimensioni dell'immagine che possono sempre servire
int x,y; // Parametri modificabili che indicheranno la posizione dell'immagine nel Canvas





Immagine(String percorso,int x,int y)
{

try
{
immagine=ImageIO.read(new File(percorso));
}
catch(IOException e)
{
JOptionPane.showMessageDialog(null,"Immagine:"+percorso+" non caricata.");
e.printStackTrace();
}

larghezza=immagine.getWidth();
altezza=immagine.getHeight();
this.x=x;
this.y=y;

}

// Prepariamo diversi costruttori in base alle nostre esigenze

Immagine(String percorso)
{
try
{
immagine=ImageIO.read(new File(percorso));
}
catch(IOException e)
{
JOptionPane.showMessageDialog(null,"Immagine:"+percorso+" non caricata.");
e.printStackTrace();
}

larghezza=immagine.getWidth();
altezza=immagine.getHeight();
x=0;
y=0;
}

// Se vogliamo possiamo inserire dei metodi Setter e Getter, ma in questo caso visto che ho lasciato le variabili 'public', modificherò se necessario le variabili semplicemente in questo modo: "Immagine2.x=0;", per esempio.


Ora andiamo a creare una classe che ci permetta di disegnare le immagini di cui abbiamo bisogno all'interno del Canvas.

public class Screen extends Canvas implements Runnable {

Thread screen_thread=new Thread(this);
BufferStrategy bs=this.getBufferStrategy();
Graphics g;
JFrame finestra=new JFrame("Screen.");
Immagine sfondo=new Immagine("res/bg.png",0,0);
boolean run;


public synchronized void start()
{
if(run) return;
run=true;
Thread.start();
}

public synchronized void stop()
{
if(!run) return;

try{
run=false;
Thread.join()
}
catch(InterruptedException e)
{
e.printStackTrace();
}

}


Screen(){

finestra.setSize(sfondo.larghezza,sfondo.altezza);
finestra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
finestra.setResizable(false);
finestra.add(this);
finestra.setVisible(true);
if(bs==null)
{
this.createBufferStrategy(3);
g=bs.getDrawGraphics();
}
this.start();

}

@Override
public void run()
{
while(run)

{
render(sfondo);


}


}

public void render(Immagine img)
{
bs=this.getBufferStrategy();
g=bs.getDrawGraphics();
g.drawImage(img.immagine,img.x,img.y,null);
g.dispose();
bs.show();
}


}

Bene, in questo modo abbiamo creato un oggetto che una volta istanziato mostrerà una finestra, di dimensioni dell'immagine caricata con il suo disegno.



Ovviamente questo codice è di base ed è migliorabile anche grazie all'uso delle interfacce dinamiche o qualsiasi altra struttura informatica al fine di raggiungere un risultato migliore, si possono anche inserire gli ascoltatori del Mouse (MouseListener, MouseMotionListener) e Tastiera (KeyListener,..) al Canvas (this.addKeyListener(...), this.addMouseMotionListener(...),this.addMouseListener(..);
Attraverso i canvas si possono creare giochini 2D e 3D applicando semplicemente la matematica, coordinate etc.


Spero di avervi fatto capire il concetto base e che vi possa essere utile in futuro.
Un saluto :bye:
 
Ultima modifica: