Définir l'image de fond pour un Composite en Java Jeu d'Évasion
D'accord, cela semble vraiment une tâche simple, mais je n'arrive pas à l'obtenir. Tout ce que je veux, c'est avoir une image (jpg) dans le fond de mon jeu d'évasion. Voici mon code:
Classe Principale:
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Breakout extends JFrame {
public Breakout()
{
add(new BreakBoard());
setTitle("Breakout");
setSize(BreakCommons.WIDTH, BreakCommons.HEIGTH);
setLocationRelativeTo(null);
setIgnoreRepaint(true);
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
new Breakout();
}
}
Conseil De Classe:
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BreakBoard extends JPanel implements BreakCommons {
ImageIcon icon = new ImageIcon("../pacpix/love.jpg");
Timer timer;
String message = "Game Over";
BreakBall ball;
BreakPaddle paddle;
BreakBrick bricks[];
boolean ingame = true;
int timerId;
public BreakBoard() {
setOpaque(false);
addKeyListener(new TAdapter());
setFocusable(true);
//setBackground(Color.white);
bricks = new BreakBrick[30];
setDoubleBuffered(true);
timer = new Timer();
timer.scheduleAtFixedRate(new ScheduleTask(), 1000, 10);
}
public void paint(Graphics g) {
super.paint(g);
g.drawImage(icon.getImage(), 10, 10, this);
if (ingame) {
g.drawImage(ball.getImage(), ball.getX(), ball.getY(),
ball.getWidth(), ball.getHeight(), this);
g.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(),
paddle.getWidth(), paddle.getHeight(), this);
for (int i = 0; i < 30; i++) {
if (!bricks[i].isDestroyed())
g.drawImage(bricks[i].getImage(), bricks[i].getX(),
bricks[i].getY(), bricks[i].getWidth(),
bricks[i].getHeight(), this);
}
} else {
Font font = new Font("Verdana", Font.BOLD, 18);
FontMetrics metr = this.getFontMetrics(font);
g.setColor(Color.BLACK);
g.setFont(font);
g.drawString(message,
(BreakCommons.WIDTH - metr.stringWidth(message)) / 2,
BreakCommons.WIDTH / 2);
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
Alors l'image est stockée dans la variable icon
et se trouve dans mes fichiers source (avec mes classes) donc je sais que le chemin est droit. J'ai essayé le cadre et le panneau de setOpaque(false)
mais juste changé le fond par défaut de gris. Je peux facilement définir la couleur d'arrière-plan par setBackground(Color.white);
, mais comment puis-je définir une image?
J'ai essayé de mettre l'image dans un JLabel et puis l'ajouter à la Composite, mais qui n'a donné aucun résultat. Je vous serais reconnaissant de toute aide, et merci d'avance! Je peux fournir plus d'informations que nécessaire.
OriginalL'auteur CodeAddict | 2013-03-18
Vous devez vous connecter pour publier un commentaire.
moyen facile d'abord créer une catégorie distincte pour les jpane
comment l'utiliser
OriginalL'auteur Adel
C'est un Composite avec une image d'arrière-plan. Utilisation IPanel en place d'un Composite dans votre code. Ajuster si nécessaire pour répondre à vos besoins.
Exemple:
Produit:
C'est un Composite avec une image d'arrière-plan. Utilisation IPanel en place d'un Composite dans votre code. Ajuster si nécessaire.
cela ne fonctionne pas. et je suis si confus, où dois-je mettre? Mon code n'a pas vraiment d'avoir une place pour ce que je peux voir de. Pourriez-vous expliquer la logique de ton code?
Maintenant, je suis confus...Vous dites qu'il ne fonctionne pas, mais encore vous ne savez pas où l'utiliser. Ce code est un Composite avec une image d'arrière-plan. Il est appelé IPanel. Au lieu d'utiliser un Composite, utilisez ce IPanel. Vous pourriez avoir à faire quelques modifications comme l'ajout d'un zéro-arg CTOR et un setter() de l'image. Alors peut-être changer "BreakBoard s'étend Composite" à "BreakBoard s'étend IPanel". Voir l'exemple dans ma réponse. Lieu que dans une méthode main() pour tester. Espérons que cette aide.
Haha, j'ai essayé de le mettre dans mon code et ça ne fonctionne pas, c'est pourquoi. Donc, utiliser l'IPanel au lieu d'un Composite, ne IPanel fonctionnent de la même comme un Composite? J'ai vraiment pensé que c'était plus simple que cela, comme peut-être cinq lignes de code max. Wow xD
OriginalL'auteur Java42
Je l'ai eu à travailler enfin!
Pour de futures recherches ou ceux qui sont curieux, j'ai utilisé http://zetcode.com/tutorials/javagamestutorial/basics/. Très bon site pour les débutants! (Ou ceux qui ont besoin de nivellement vers le bas, pour comprendre)
même si elle semble fonctionner, en substituant peinture est l'approche erronée de Swing: au lieu de cela, remplacer paintComponent
OriginalL'auteur CodeAddict
OriginalL'auteur vamsi