web-dev-qa-db-fra.com

Comment définir une image de fond en Java?

Je développe un jeu de plateforme simple utilisant Java en utilisant BlueJ comme IDE. En ce moment, j'ai des sprites de joueurs/ennemis, des plates-formes et d'autres objets dans le jeu dessinés à l'aide de polygones et de formes simples. J'espère finir par les remplacer par des images réelles.

Pour le moment, j'aimerais savoir quelle est la solution la plus simple pour définir une image (URL ou source locale) comme "arrière-plan" de ma fenêtre/toile de jeu?

Je l’apprécierais si cela n’était pas long ou complexe, car mes compétences en programmation n’étaient pas très bonnes et je souhaitais que mon programme soit aussi simple que possible. Veuillez fournir des exemples de codes avec des commentaires pour préciser leur fonction et indiquer également, s’il s’agit d’une classe qui lui est propre, comment faire appel aux méthodes pertinentes qu’il utilise pour d’autres classes.

Merci beaucoup.

22
Dew

La réponse varie légèrement selon que l'application ou l'applet utilise AWT _ ou Swing _.

(En gros, les classes qui commencent par J, telles que JApplet et JFrame sont Swing, et Applet et Frame sont AWT.)

Dans les deux cas, les étapes de base seraient les suivantes:

  1. Dessine ou charge une image dans un objet Image.
  2. Dessinez l’image d’arrière-plan dans l’événement de peinture de la Component dans laquelle vous voulez dessiner l’arrière-plan.

Étape 1. Le chargement de l'image peut être effectué en utilisant la classe Toolkit ou la classe ImageIO .

La méthode Toolkit.createImage peut être utilisée pour charger une Image à partir d'un emplacement spécifié dans une String:

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

De même, ImageIO peut être utilisé:

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

Étape 2. La méthode de dessin pour la Component qui devrait obtenir l'arrière-plan devra être remplacée et Peindre la Image sur le composant.

Pour AWT, la méthode à remplacer est la méthode Paint et utilisez la méthode drawImage de l'objet Graphics transmise à la méthode Paint:

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

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

Pour Swing, la méthode à remplacer est la méthode paintComponent de JComponent , et tracez la Image comme avec ce qui a été fait dans AWT.

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

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

Exemple de composant simple

Voici une Panel qui charge un fichier image lorsqu'il est instancié et dessine cette image sur lui-même:

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

Pour plus d'informations sur la peinture:

28
coobird

Commencez par créer une nouvelle classe qui étend la classe WorldView. J'ai appelé ma nouvelle classe Background. Ainsi, dans cette nouvelle classe, importez tous les packages Java dont vous aurez besoin pour remplacer la méthode paintBackground. Cela devrait être:

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;

Ensuite, après le nom de la classe, assurez-vous qu'il est étendu WorldView. Quelque chose comme ça:

public class Background extends WorldView

Puis déclarez le jeu de variables de type Game et une variable d'image de type Image à peu près comme ceci:

private Game game;
private Image image;

Ensuite, dans le constructeur de cette classe, assurez-vous que le jeu de type Game se trouve dans la signature du constructeur et que, dans l'appel à super, vous devrez initialiser la WorldView, initialiser le jeu et initialiser les variables d'image, comme ceci:

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

Ensuite, vous substituez simplement la méthode paintBackground de la même manière que lorsque vous surchargiez la méthode Paint dans la classe Player. Juste comme ça:

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

Enfin, vous devez enfin déclarer une référence de niveau de classe à la nouvelle classe que vous venez de créer dans la classe Game et l'initialiser dans le constructeur Game, à peu près comme ceci:

private Background image;

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

Enfin, tout ce que vous avez à faire est d’ajouter l’arrière-plan au cadre! C'est la chose que je suis sûr que nous manquions tous. Pour faire cela, vous devez faire quelque chose comme ceci après que la variable frame ait été déclarée:

frame.add(image);

Assurez-vous que vous ajoutez ce code juste avant frame.pack();. Assurez-vous également que vous utilisez une image d'arrière-plan qui n'est pas trop grande!

Maintenant ça y est! J'ai remarqué que les moteurs de jeu peuvent gérer les formats d'image JPEG et PNG mais pourraient également en supporter d'autres. Même si cela aide à inclure une image d’arrière-plan dans votre jeu, ce n’est pas parfait! Car une fois que vous passez au niveau suivant, toutes vos plates-formes et vos sprites sont invisibles et vous ne pouvez voir que votre image d'arrière-plan et tous les JLabels/Jbuttons que vous avez inclus dans le jeu.

Ou essayez ceci;)

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