gpt4 book ai didi

java - 当我加载图像列表时仅显示一张图像

转载 作者:行者123 更新时间:2023-12-01 14:09:19 25 4
gpt4 key购买 nike

我正在编写一个塔防游戏,我需要将一个 JPanel 列表与加载到 JFrame 上的缓冲图像一起放置。我正在使用 for 循环将 JPanel 放置到 JFrame 上,但是,当我运行该程序时,仅显示列表中的最后一个 JPanel。我已经检查以确保图像没有被放置在另一张图像上,并且它们被放置在三个不同的位置。

这是我的类创建 JFrame 的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class GameScreen extends JPanel 
implements MouseListener {

private ArrayList< JPanel > images;
private TDGame currentGame;
private JFrame frame;
private static final int width = 700;
    private static final int length = 700;

public void mouseExited(MouseEvent e) {
this.repaint();
}
    
    public void mouseEntered(MouseEvent e) {
this.repaint();
}
    
    public void mouseReleased(MouseEvent e) {
this.repaint();
}
    
    public void mousePressed(MouseEvent e) {
this.repaint();
}
    
    public void mouseClicked(MouseEvent e) {
this.repaint();
}
    
    public GameScreen() {
super();
images = new ArrayList<JPanel>();
currentGame = new TDGame();
frame = new JFrame("Tower Defense");
frame.setSize(width, length);
frame.setVisible(true);
frame.pack();
frame.getContentPane().add(this,BorderLayout.CENTER);
currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
new BasicEnemy(0, 0, LoadImage()));
currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
new BasicEnemy(250, 250, LoadImage2()));
currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
new BasicEnemy(0, 0, LoadImage1()));

this.repaint();
}

    public BufferedImage LoadImage() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("Saturn-Intruder.png"));
} catch (IOException e) {
}
return img;
}
    
    public BufferedImage LoadImage1() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("Level1-TD.jpeg"));
} catch (IOException e) {
}
return img;
}
    
    public BufferedImage LoadImage2() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("BlackBird-Intruder.jpeg"));
} catch (IOException e) {
}
return img;
}

    @Override
    protected void paintComponent(Graphics g) {
for(int i = 0; i < currentGame.Defense.size(); i++) {
frame.add(currentGame.Defense.get(i));
}

for(int i = 0; i < currentGame.EnemyForce.size(); i++) {
frame.add( currentGame.EnemyForce.get(i));
}

for(int i = 0; i < currentGame.ShotsFired.size(); i++) {
frame.add(currentGame.ShotsFired.get(i));
}
}
}

这是我将 JPanel 放置到 JFrame 上的代码:

import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;

public class BasicEnemy extends Entity {
JPanel ePanel;
Graphics g;

public BasicEnemy(double x, double y, BufferedImage image) {
super(x, y, image);
ePanel = new JPanel();
ePanel.setVisible(true);
}

protected void paintComponent(Graphics g) {
g.drawImage(getImage(), (int)(getXCoord()),
(int)(getYCoord()), null);
}
}

如何解决此问题,以便放置所有图像,而不仅仅是一个图像?

最佳答案

我不知道为什么你的游戏只显示一张图像。但随着这个游戏的进一步发展,我强烈建议您不要在自己的 JPanel 中添加每个图像。

我将如何处理您的源代码以使其正常工作。

  • 从 BasicEnemy(以及所有其他类似类)中删除 JPanel
  • 将 GameScreen.paintComponent 中的所有 for 循环更改为读取

    for(...) { currentGame.EnemyForce.get(i).paintComponent(g); }

  • 在 GameScreen 的构造函数中,在 frame.setVisible(true);

    之前添加 frame.add(this);

如果您要在 Swing 中使用图形,则永远不应该在 JComppondents 中保留属于游戏一部分的单个元素。您应该使用 GameScreen 作为您的“ Canvas ”,并在 PaintComponent 内部使用 Graphics 对象来绘制所有游戏内容。

关于java - 当我加载图像列表时仅显示一张图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com