2009-02-07 7 views
21

Ich entwickle ein einfaches Plattformspiel mit Java unter Verwendung von BlueJ als IDE. Im Moment habe ich Spieler/Gegner-Sprites, Plattformen und andere Gegenstände im Spiel, die mit Polygonen und einfachen Formen gezeichnet wurden. Irgendwann hoffe ich, sie durch tatsächliche Bilder zu ersetzen.Wie setze ich ein Hintergrundbild in Java?

Für jetzt würde ich gerne wissen, was ist die einfachste Lösung zum Festlegen eines Bildes (entweder URL oder aus lokaler Quelle) als "Hintergrund" meines Spiels Fenster/Leinwand?

Ich würde es schätzen, wenn es nicht etwas lang oder komplex ist, da meine Programmierkenntnisse nicht sehr gut sind und ich mein Programm so einfach wie möglich halten möchte. Bitte geben Sie Beispielcodes mit Kommentaren an, um ihre Funktion zu erläutern, und auch, wenn es in einer eigenen Klasse ist, wie Sie relevante Methoden aufrufen, die von anderen Klassen verwendet werden.

Vielen Dank.

Antwort

27

Die Antwort hängt davon ab, ob die Anwendung oder das Applet AWT oder Swing verwendet.

(. Grundsätzlich Klassen, die mit J wie JApplet und JFrame sind Schaukel beginnen und Applet und Frame sind AWT)

In jedem Fall würden die grundlegenden Schritte sein:

  1. Draw oder Laden Sie ein Bild in ein Image Objekt.
  2. Zeichnen Sie das Hintergrundbild in der Malerei Falle der Component Sie wollen in den Hintergrund zeichnen.

Schritt 1. die Lade Bild entweder durch Verwendung der Toolkit Klasse oder durch die ImageIO Klasse sein kann.

Die Toolkit.createImage Verfahren verwendet werden, können ein Image von einer Stelle in einem String angegeben zu laden:

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

Schritt 2. Das Gemälde:

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

, ähnlichen ImageIO kann verwendet werden, Methode für die Component, die den Hintergrund erhalten sollte überschrieben werden und malen Sie die Image auf die Komponente.

Für AWT, das Verfahren zu überschreiben, ist die paint Methode, und verwendet die drawImage Verfahren des Graphics Objekts, das in die paint Methode übergeben wird:

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

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

für Swing, zu überschreiben, wobei das Verfahren der paintComponent Methode der JComponent, und zeichnen Sie die Image wie mit was in AWT getan wurde.

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

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

einfache Komponente Beispiel

Hier ist eine Panel, die eine Bilddatei lädt, wenn instanziiert, und zeichnet das Bild auf sich selbst:

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); 
    } 
} 

Weitere Informationen über die Malerei:

+0

Vielen Dank für Ihre Antwort. Ich habe einige Fragen- 1. Wo sollte das betreffende Bild liegen? Können Sie einen Beispiel-Quellpfad des Bildes angeben, da ich nicht sicher bin, wie es angelegt werden soll. – Dew

+0

2. Sagen Sie, wenn ich eine Klasse namens "Hintergrund" mit dem obigen Code erstellen, welche Methode muss ich aufrufen, in meiner 'Spiel' -Klasse (die die Ansicht, Größe des Spielfensters steuert) von der Hintergrundklasse zu das Hintergrundbild erscheinen lassen? Bitte geben Sie ein Beispiel. – Dew

+0

Hier ist der Code, den ich derzeit verwende, um die Hintergrundfarbe meines Spielfensters einzustellen: view = new WorldView (Welt, Breite, Höhe); view.setBackground (neue Farbe (230, 245, 255)); – Dew

1

Erstellen Sie zuerst eine neue Klasse, die die Klasse WorldView erweitert. Ich nannte meine neue Klasse Background. Importieren Sie also in dieser neuen Klasse alle Java-Pakete, die Sie benötigen, um die Methode paintBackground zu überschreiben. Dies sollte sein:

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; 

Weiter nach dem Klassennamen sicherstellen, dass sie sagt, erstreckt WorldView. Etwas wie folgt aus:

public class Background extends WorldView 

dann die Variablen Spiel Game Typ deklarieren und eine Bild Variable vom Typ Image etwas wie folgt aus:

private Game game; 
private Image image; 

Dann im Konstruktor dieser Klasse stellen Sie sicher, das Spiel vom Typ Game ist in der Signatur des Konstruktors und in dem Aufruf an super müssen Sie die WorldView initialisieren, das Spiel initialisieren und die Bildvariablen initialisieren, etwa so:

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

Dann überschreiben Sie einfach die paintBackground Methode in genau der gleichen Art und Weise wie Sie, als in der Player Klasse die paint Methode überschrieben. Genau wie folgt aus:

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

Nun endlich haben Sie eine Klassenstufe Verweis auf die neue Klasse deklarieren Sie nur in der Game Klasse gemacht und initialisieren diese im Game Konstruktor, so etwas wie dieses:

private Background image; 

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

Zuletzt müssen Sie nur noch den Hintergrund zum Rahmen hinzufügen! Das ist die Sache, ich bin mir sicher, dass wir alle vermisst wurden. Zu tun, dass Sie so etwas wie dies nach den Variablen frame zu tun haben, hat erklärt:

frame.add(image); 

Stellen Sie sicher, diesen Code hinzufügen, kurz vor frame.pack();. Stellen Sie außerdem sicher, dass Sie ein Hintergrundbild verwenden, das nicht zu groß ist!

Jetzt ist es soweit! Ich habe bemerkt, dass die Game-Engines JPEG- und PNG-Bildformate verarbeiten können, aber auch andere unterstützen können. Auch wenn dies ein Hintergrundbild in deinem Spiel beinhaltet, ist es nicht perfekt!Denn sobald du zur nächsten Ebene gehst, sind alle deine Plattformen und Sprites unsichtbar und alles, was du sehen kannst, ist dein Hintergrundbild und alle JLabels/JButtons, die du in das Spiel eingefügt hast.

0

Oder versuchen Sie dies;)

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

jetzt ... Was passiert, wenn Sie dem Rahmen Komponenten hinzufügen? – kleopatra

-1

Der Weg ist das einzige, was Sie befürchten wirklich, wenn Sie Java wirklich neu sind. Sie müssen Ihr Bild in die Hauptprojektdatei ziehen, und es wird am Ende der Liste angezeigt.

Dann ist der Dateipfad ziemlich geradlinig. Dieser Code wird in den Konstruktor der Klasse eingefügt.

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

CS2 ist der Name meines Projekts, und alles davor führt zum Arbeitsbereich.

+1

Die Frage ist, wie man ein Bild als Hintergrund anzeigt, nicht wie man ein Bild aus einer Datei lädt. –

+0

Eigentlich @userunknown, wie man das Bild aus der Datei lädt, war absolut Teil des Problems, über das das OP verwirrt war. –