0

タワー ディフェンス ゲームを作成しています。バッファリングされたイメージがロードされた JPanel のリストを JFrame に配置する必要があります。JPanel を JFrame に配置するために for ループを使用していますが、プログラムを実行すると、リストの最後の JPanel のみが表示されます。画像が互いに重なって配置されていないこと、およびそれらが 3 つの別々の場所に配置されていることを確認しました。

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

JFrame に配置される JPanels のコードは次のとおりです。

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

この問題を修正して、1 つだけでなくすべての画像が配置されるようにするにはどうすればよいですか?

4

1 に答える 1