22 votes

Comment définir une image d'arrière-plan en Java ?

Je développe un jeu de plateforme simple en Java en utilisant BlueJ comme IDE. Pour l'instant, les sprites des joueurs et des ennemis, les plates-formes et les autres éléments du jeu sont dessinés à l'aide de polygones et de formes simples. A terme, j'espère pouvoir les remplacer par des images réelles.

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

J'apprécierais que ce ne soit pas quelque chose de long ou de complexe car mes compétences en programmation ne sont pas très bonnes et je veux que mon programme soit aussi simple que possible. Merci de fournir des exemples de codes avec des commentaires pour développer leur fonction, et aussi si c'est dans sa propre classe, comment appeler les méthodes pertinentes utilisées par elle dans d'autres classes.

Je vous remercie de votre attention.

31voto

coobird Points 70356

La réponse variera légèrement selon que l'application ou l'applet utilise des AWT o Balançoire .

(Basiquement, les classes qui commencent par J tels que JApplet y JFrame sont Swing, et Applet y Frame sont des AWT).

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

  1. Dessiner ou charger une image dans un Image objet.
  2. Dessinez l'image d'arrière-plan dans l'événement de peinture de l'objet Component dans laquelle vous souhaitez dessiner l'arrière-plan.

Étape 1. Le chargement de l'image peut se faire soit en utilisant la fonction Toolkit ou par la classe ImageIO classe.

En Toolkit.createImage peut être utilisée pour charger un Image à partir d'un emplacement spécifié dans un 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 peinture pour le Component qui doit obtenir l'arrière-plan devra être surchargée et peindre la ligne de commande Image sur le composant.

Pour AWT, la méthode à remplacer est la méthode paint et utiliser la méthode drawImage de la méthode Graphics qui est transmis à l'objet paint méthode :

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 la méthode JComponent et dessiner le Image à l'instar de ce qui a été fait dans l'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 lors de son instanciation et dessine cette image sur elle-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 :

1voto

Créez tout d'abord une nouvelle classe qui étend la classe WorldView classe. J'ai appelé ma nouvelle classe Background . Dans cette nouvelle classe, importez donc tous les paquets Java dont vous aurez besoin pour remplacer la fonction paintBackground méthode. Ce 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 y a bien la mention "extends". WorldView . Voici ce qu'il en est :

public class Background extends WorldView

Déclarez ensuite les variables jeu de type Game et une variable image de type Image quelque chose comme ça :

private Game game;
private Image image;

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

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

Dans ce cas, il suffit de remplacer l'option paintBackground exactement de la même manière que vous l'avez fait lors de la surcharge de la méthode paint dans la méthode Player classe. Voici ce qu'il en est :

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 déclarer une référence au niveau de la classe à la nouvelle classe que vous venez de créer dans le fichier Game et l'initialiser dans la classe Game quelque chose comme ceci :

private Background image;

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

Enfin, il ne reste plus qu'à ajouter le fond au cadre ! C'est ce qui nous manquait à tous, j'en suis sûr. Pour ce faire, vous devez faire quelque chose comme ceci après la variable frame a été déclarée :

frame.add(image);

Veillez à ajouter ce code juste avant frame.pack(); . Veillez également à utiliser une image de fond qui ne soit pas trop grande !

Voilà, c'est fait ! J'ai remarqué que les moteurs de jeu peuvent gérer les formats d'image JPEG et PNG, mais qu'ils pourraient aussi en supporter d'autres. Même si cela permet d'inclure une image de fond dans votre jeu, ce n'est pas parfait ! En effet, lorsque vous passez au niveau suivant, toutes vos plateformes et tous vos sprites sont invisibles et tout ce que vous pouvez voir, c'est votre image de fond et tous les JLabels/Jbuttons que vous avez inclus dans le jeu.

0voto

JavaIsCool Points 1

Ou essayez ceci ;)

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

-1voto

Ben Whithead Points 1

Le chemin est la seule chose dont vous devez vous préoccuper si vous êtes vraiment novice en matière de Java. Vous devez faire glisser votre image dans le fichier principal du projet, et elle apparaîtra tout en bas de la liste.

Le chemin d'accès au fichier est ensuite assez simple. Ce code se trouve dans le constructeur de la classe.

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

CS2 est le nom de mon projet, et tout ce qui précède mène à l'espace de travail.

-1voto

Joe McComas Points 1
<script>
    function SetBack(dir) {
        document.getElementById('body').style.backgroundImage=dir;
    }
    SetBack('url(myniftybg.gif)');
    </script>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X