Ciao, mi sapreste spiegare come fare ad impostare un'immagine di sfondo e farli muovere sopra un'altra immagine (esempio una pedina)?
Link utili o codice.
Grazie anticipate.
Potrebbe essere una cosa di questo tipo (sorgente unico, Main.java, richiede l'esistenza di un'immagine "sfondo.png" e un'immagine "pedina.png" nella cartella dei file class):
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import javax.swing.*;
import javax.imageio.*;
public class Main {
public static void main(String[] args) {
final BufferedImage immaginePedina;
final BufferedImage immagineSfondo;
try {
immaginePedina = ImageIO.read(Main.class.getResource("/pedina.png"));
immagineSfondo = ImageIO.read(Main.class.getResource("/sfondo.png"));
} catch(java.io.IOException ex) {
System.err.println("Immagini non presenti o non leggibili");
return;
}
SwingUtilities.invokeLater(new Runnable() { public void run() {
SimpleSfondo sfondo = new SimpleSfondo(immagineSfondo);
SimplePedina pedina = new SimplePedina(sfondo, immaginePedina);
KeyController controller = new KeyController(pedina);
JFrame window = new JFrame("Pedina.");
window.addKeyListener(controller);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.add(sfondo);
window.pack();
window.setVisible(true);
controller.start();
}});
}
}
/** Uno sfondo è qualcosa su cui si disegna*/
interface Sfondo {
void disegna(Image i, int x, int y);
}
/** Una pedina è una roba che si muove*/
interface Pedina {
int DESTRA = 2;
int SINISTRA = 4;
int SU = 8;
int GIU = 16;
void muovi(int direzione);
}
/** Un KeyController è un oggetto correlato ad una pedina e ad un KeyListener */
class KeyController extends KeyAdapter implements Pedina {
private Map<Integer, Integer> keyDirectionMap =
new HashMap<Integer, Integer>();
private int movimento = 0;
private Pedina pedina;
public KeyController(Pedina p) {
this.pedina = p;
keyDirectionMap.put(KeyEvent.VK_UP, Pedina.SU);
keyDirectionMap.put(KeyEvent.VK_DOWN, Pedina.GIU);
keyDirectionMap.put(KeyEvent.VK_LEFT, Pedina.SINISTRA);
keyDirectionMap.put(KeyEvent.VK_RIGHT, Pedina.DESTRA);
}
public void keyPressed(KeyEvent e) {
Integer direzione = keyDirectionMap.get(e.getKeyCode());
if(direzione != null) {
movimento |= direzione;
}
}
public void keyReleased(KeyEvent e) {
Integer direzione = keyDirectionMap.get(e.getKeyCode());
if(direzione != null) {
movimento ^= direzione;
}
}
public void muovi(int direzione) {
pedina.muovi(direzione);
}
public void start() {
ActionListener task = new ActionListener() {
public void actionPerformed(ActionEvent e) {
muovi(movimento);
}
};
new javax.swing.Timer(50, task).start();
}
}
/** Un SimpleSfondo è un oggetto correlato ad un'etichetta e ad uno sfondo */
class SimpleSfondo extends JLabel implements Sfondo {
private Graphics2D graphics;
private BufferedImage buffer;
private final BufferedImage sfondo;
/** Invoca setPreferredSize */
public SimpleSfondo(BufferedImage sfondo) {
this.sfondo = sfondo;
setPreferredSize(new Dimension(sfondo.getWidth(), sfondo.getHeight()));
buffer = new BufferedImage(sfondo.getWidth(), sfondo.getHeight(),
Transparency.OPAQUE);
graphics = buffer.createGraphics();
}
public void disegna(Image i, int x, int y) {
graphics.setColor(Color.WHITE);
graphics.drawImage(sfondo, 0, 0, null);
graphics.drawImage(i, x, y, null);
repaint();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(buffer, 0, 0, null);
}
}
/** Un SimplePedina è una pedina che si muove su uno sfondo.*/
class SimplePedina implements Pedina, Sfondo {
private final Sfondo sfondo;
private final Image immagine;
private final Point position = new Point();
public SimplePedina(Sfondo sfondo, Image immagine) {
this.sfondo = sfondo;
this.immagine = immagine;
}
public void disegna(Image i, int x, int y) {
sfondo.disegna(i, x, y);
}
public void muovi(int d) {
int dy = d == SU ? -1 : d == GIU ? 1 : 0;
int dx = d == SINISTRA ? -1 : d == DESTRA ? 1 : 0;
position.translate(dx, dy);
disegna(immagine, position.x, position.y);
}
}
Se la pedina non deve solo muoversi e lo sfondo non è solo qualcosa su cui si disegna, la faccenda si arricchisce. Se le cose da disegnare diventano molte allora anzichè un'etichetta come sfondo si può pensare di usare un BufferStrategy con delle immagini ottimizzate dopo il caricamento. Insomma, ci si può sbizzarrire.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.