2009-02-07 36 views
21

Sto sviluppando un semplice gioco di piattaforma usando Java usando BlueJ come IDE. In questo momento ho sprite giocatore/nemico, piattaforme e altri oggetti nel gioco disegnati usando poligoni e forme semplici. Alla fine spero di sostituirli con immagini reali.Come impostare l'immagine di sfondo in Java?

Per ora mi piacerebbe sapere qual è la soluzione più semplice per impostare un'immagine (URL o da sorgente locale) come "sfondo" della mia finestra di gioco/tela?

Apprezzerei molto se non è qualcosa di lungo o complesso in quanto le mie capacità di programmazione non sono molto buone e voglio mantenere il mio programma il più semplice possibile. Fornisci gentilmente codici di esempio con commenti per approfondire la loro funzione, e anche se è nella sua stessa classe, come chiamare i metodi rilevanti da esso utilizzati su altre classi.

Grazie mille.

risposta

27

La risposta può variare leggermente a seconda che l'applicazione o l'applet stiano utilizzando AWT o Swing.

(. In sostanza, le classi che iniziano con J quali JApplet e JFrame sono swing, e Applet e Frame sono AWT)

In entrambi i casi, sarebbero i passaggi fondamentali:

  1. Disegnare o caricare un'immagine in un oggetto Image.
  2. disegnare l'immagine di sfondo in caso dipinto della Component si desidera disegnare lo sfondo in.

Fase 1. Caricamento dell'immagine può essere sia utilizzando la classe Toolkit o dalla classe ImageIO.

Procedimento Toolkit.createImage può essere utilizzato per caricare un Image da una posizione specificata in un String:

Image img = Toolkit.getDefaultToolkit().createImage("background.jpg"); 

Analogamente, può essere utilizzato ImageIO:

Image img = ImageIO.read(new File("background.jpg"); 

Passo 2. Il dipinto metodo per lo Component che dovrebbe ottenere lo sfondo dovrà essere sovrascritto e dipingere il Image sul componente.

Per AWT, il metodo per ignorare è il metodo paint, e utilizzare il metodo dell'oggetto Graphics che si tramanda nel metodo paintdrawImage:

public void paint(Graphics g) 
{ 
    // Draw the previously loaded image to Component. 
    g.drawImage(img, 0, 0, null); 

    // Draw sprites, and other things. 
    // .... 
} 

per Swing, il metodo per ignorare è la paintComponent metodo di JComponent e disegnare lo Image come con ciò che è stato fatto in AWT.

public void paintComponent(Graphics g) 
{ 
    // Draw the previously loaded image to Component. 
    g.drawImage(img, 0, 0, null); 

    // Draw sprites, and other things. 
    // .... 
} 

semplice componente Esempio

Ecco un Panel che carica un file di immagine quando istanziato, e disegna l'immagine su se stessa:

class BackgroundPanel extends Panel 
{ 
    // The Image to store the background image in. 
    Image img; 
    public BackgroundPanel() 
    { 
     // Loads the background image and stores in img object. 
     img = Toolkit.getDefaultToolkit().createImage("background.jpg"); 
    } 

    public void paint(Graphics g) 
    { 
     // Draws the img to the BackgroundPanel. 
     g.drawImage(img, 0, 0, null); 
    } 
} 

Per ulteriori informazioni sulla pittura:

+0

Grazie per la risposta. Ho alcune domande: 1. Dove deve essere collocata l'immagine in questione? Puoi dare un esempio di "riserva d'immagine" perché non sono sicuro di come dovrebbe essere definito. – Dew

+0

2. Di 'se creo una classe chiamata' Sfondo 'usando il codice sopra, quale metodo devo chiamare, nella mia classe' Gioco '(che controlla la vista, la dimensione della finestra di gioco) dalla classe Sfondo a far apparire l'immagine di sfondo? Per favore, fai un esempio. – Dew

+0

Ecco il codice che attualmente utilizzo per impostare il colore di sfondo della finestra di gioco: view = new WorldView (mondo, larghezza, altezza); view.setBackground (new Color (230, 245, 255)); – Dew

1

Creare innanzitutto una nuova classe che estenda la classe WorldView. Ho chiamato la mia nuova classe Background. In questa nuova classe, quindi, importa tutti i pacchetti Java necessari per sostituire il metodo paintBackground. Questo dovrebbe essere:

import city.soi.platform.*; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.image.ImageObserver; 
import javax.swing.ImageIcon; 
import java.awt.geom.AffineTransform; 

Avanti dopo il nome della classe assicurarsi che si dice estende WorldView. Qualcosa di simile a questo:

public class Background extends WorldView 

quindi dichiarare le variabili di gioco di tipo Game e una variabile immagine di tipo Image qualcosa di simile:

private Game game; 
private Image image; 

Poi nel costruttore di questa classe assicurarsi che il gioco di tipo Game è nella firma del costruttore e che nella chiamata a super sarà necessario inizializzare lo WorldView, inizializzare il gioco e inizializzare le variabili dell'immagine, ad esempio:

super(game.getCurrentLevel().getWorld(), game.getWidth(), game.getHeight()); 
this.game = game; 
bg = (new ImageIcon("lol.png")).getImage(); 

Poi basta sovrascrivere il metodo paintBackground esattamente nello stesso modo in cui avete fatto quando l'override del metodo paint nella classe Player. Proprio come questo:

public void paintBackground(Graphics2D g) 
{ 
float x = getX(); 
float y = getY(); 
AffineTransform transform = AffineTransform.getTranslateInstance(x,y); 
g.drawImage(bg, transform, game.getView()); 
} 

Ora finalmente si deve dichiarare un riferimento livello di classe alla nuova classe appena creato nella classe Game e inizializzare questo nel costruttore Game, qualcosa di simile:

private Background image; 

And in the Game constructor: 
image = new Background(this); 

Infine, tutto ciò che devi fare è aggiungere lo sfondo alla cornice! Questa è la cosa che sono sicuro che ci stessero tutti perdendo. Per fare questo è necessario fare qualcosa di simile dopo la variabile frame è stata dichiarata:

frame.add(image); 

Assicurati di aggiungere questo codice appena prima frame.pack();. Assicurati anche di usare un'immagine di sfondo non troppo grande!

Ora è tutto! Ho notato che i motori di gioco sono in grado di gestire i formati di immagine JPEG e PNG, ma potrebbero anche supportare gli altri. Anche se questo aiuta a includere un'immagine di sfondo nel tuo gioco, non è perfetto!Perché una volta che vai al livello successivo tutte le tue piattaforme e sprite sono invisibili e tutto ciò che puoi vedere è la tua immagine di sfondo e qualsiasi JLabels/Jbuttons che hai incluso nel gioco.

0

Oppure provare questo;)

try { 
    this.setContentPane(
    new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg"))))); 
} catch (IOException e) {}; 
+0

ora ... cosa succede se aggiungi componenti al frame? – kleopatra

-1

il percorso è l'unica cosa che realmente dovete preoccuparvi se siete veramente nuovo a Java. È necessario trascinare l'immagine nel file di progetto principale e verrà visualizzata nella parte inferiore dell'elenco.

Quindi il percorso del file è piuttosto semplice. Questo codice va nel costruttore per la classe.

img = Toolkit.getDefaultToolkit().createImage("/home/ben/workspace/CS2/Background.jpg"); 

CS2 è il nome del mio progetto e tutto ciò che precede conduce allo spazio di lavoro.

+1

La domanda è come visualizzare un'immagine come sfondo, non come caricare un'immagine dal file. –

+0

In realtà, @userunknown, come caricare l'immagine dal file era assolutamente parte del problema di cui l'OP era confuso. –