/ / L’image apparaît comme un carré gris lorsqu’elle est ajoutée à JPanel - java, swing

L'image apparaît sous la forme d'un carré gris lorsqu'elle est ajoutée à JPanel - java, swing

Je travaille sur un projet pour l'université qui estessentiellement un remaniement du jeu Space Invaders avec les règles légèrement modifiées. Jusqu'ici, j'ai un cadre principal JFrame, contenant une sous-classe de JPanel (pour l'image d'arrière-plan), qui contient une autre sous-classe de JPanel que j'utilise pour les sprites. Cependant, lorsque je le lance, JFrame et le JPanel d’arrière-plan fonctionnent bien, mais lorsque je dessine le sprite, il génère simplement un carré gris, pour lequel je ne peux pas "changer la taille ou la position. Voici le code que j'ai" obtenu pour mon cours de sprite:

import java.awt.*;
import java.io.File;
import javax.swing.*;


public class Sprite extends JPanel
{
Image spriteImage;
int speedX;
int speedY;
Point pos;
final boolean MV_LEFT = false;
final boolean MV_RIGHT = true;

public Sprite(File _imageFile)
{
try {
spriteImage = javax.imageio.ImageIO.read(_imageFile);
} catch (Exception e) {
/* handled in paintComponent() */
}
speedX = 1;
speedY = 1;
pos = new Point(100,100);
}

@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
if (spriteImage != null)
g.drawImage(this.spriteImage, this.pos.x, this.pos.y, this.getWidth(), this.getHeight(), this);
}

public void move(boolean direction)
{
if (direction == true)
{
this.pos = new Point((pos.x + speedX), pos.y);
repaint();
}
else
{
this.pos = new Point((pos.x - speedX), pos.y);
repaint();
}
}
}

Je suis sûr qu’il ya quelques erreurs dans les choses,mais pour la méthode paintComponent (), je viens de parroter tous les tutoriels de manipulation d’images trouvés sur Internet et cela ne semble toujours pas fonctionner. Y at-il quelque chose d’énorme que j’oublie?

Réponses:

2 pour la réponse № 1

Un problème que je vois avec le paintComponent ()La méthode est l’emplacement où vous dessinez l’image. Je comprends que chaque image-objet de votre jeu est un fichier JPanel distinct. L’objet Graphics (g) transmis dans la méthode paintComponent est donc différent pour chaque image-objet. Vous pouvez l’imaginer. un objet graphique en tant que toile de dessin Si vous ne disposiez que d'un seul objet graphique pour l'ensemble du jeu et si cet objet graphique représentait toute la fenêtre du jeu, votre logique serait alors correcte et tout devrait fonctionner.

Cependant, chaque image-objet a ici son propre objet graphique, probablement avec une hauteur et une largeur correspondant à l'image-objet. Dans ce cas, votre méthode paintComponent ressemblerait probablement à ceci:

public void paintComponent(Graphics g)
{
if (spriteImage != null)
g.drawImage(this.spriteImage, 0, 0, getWidth(), getHeight(); // always at (0,0)
}

Pourquoi? Avec votre conception, vous déplacez l’objet Sprite ET son objet Graphics autour de la fenêtre de jeu! Les coordonnées que vous transmettez à drawImage () sont relatives à l'objet Graphics; vous voulez toujours commencer à peindre dans le coin supérieur gauche (0,0) du Sprite. Vous obtenez juste un carré gris parce que vous essayez de tracer l'image hors des limites de l'objet Graphics.

A long terme, je ne pense pas que cette approche soitaller au travail car il n’est pas si facile de déplacer JPanels à l’intérieur de ses conteneurs parents (sauf si vous utilisez le positionnement absolu). Ce n'est pas vraiment évolutif non plus parce que les JPanels sont assez lourds et nécessitent beaucoup de ressources pour être créés et affichés.

Vous êtes probablement mieux d'avoir un seul JPanelcela représente toute la zone de jeu. Chaque Sprite ne serait pas une sous-classe de JPanel, vous n’avez donc pas de méthode paintComponent. Vous pouvez faire quelque chose comme ça:

public class GameArea extends JPanel
{
private final Collection<Sprite> sprites; // sprites to draw

public void paintComponent(Graphics g)
{
for(Sprite sprite : sprites)
{
sprite.drawOnSurface(g);
}
}
}

public class Sprite // no need to extend anything
{
/* Your other code looks OK */

public void drawOnSurface(Graphics surface)
{
surface.drawImage(image, x, y, getWidth(), getHeight());
}
}