Как нарисовать ArrayList объектов в Java? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь воссоздать простую версию Brick Breaker для школы, и у меня возникают проблемы при создании кирпичей.(Я также очень новичок в Java и переполнении стека ...)

Моя первая идея при создании кубиков состояла в том, чтобы сделать их ArrayList, а затем использовать цикл for, чтобы добавить больше кирпичных объектов для заполнения.экран.Мне удалось отобразить только один кирпичный объект на экране, и я не уверен, как рисовать другие.Я также пытался создать 2D-массив, чтобы создать карту, но это тоже не сработало.Иногда JFrame просто гаснет, и больше ничего не появляется.

Это мой код для класса Board, в котором находится paintComponent:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;


public class Board extends JPanel implements ActionListener {

    Ball ball;
    Game game;
    Paddle paddle;
    Timer timer;
    Brick brick;
    private final int edge = 100;
    private List<Brick> brickList;


    public Board(Game game){
        setPreferredSize(new Dimension(600,800));
        setBackground(Color.BLACK);
        this.game = game;
        ball = new Ball(this, this.paddle);
        paddle = new Paddle(this.game, this, this.ball);
        brick = new Brick(this.ball);
    }
    public void init(){
        brickList = new ArrayList<Brick>(20);
        ball.setPosition(getWidth()/2,getHeight()/2);
        paddle.setPosition(getWidth()/2,getHeight()-edge);
        brick.setPosition(edge,edge);
        timer = new Timer(1000/60,this);
        timer.start();
    }
    public void actionPerformed(ActionEvent e){
        ball.move();
        paddle.move();
        ball.checkCollision(paddle);
        brick.checkCollision(ball);
        repaint();
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.lightGray);
        ball.paint(g);
        g.setColor(Color.white);
        paddle.paint(g);
        g.setColor(Color.red);
        brick.paint(g);
          for(int i = 0; i < brickList.size(); i++){
            brickList.add(new Brick(this.ball));
            g.setColor(Color.green);
        }
      }
    }

А это мой код для класса Brick:

import java.awt.*;
import java.util.ArrayList;

public class Brick {
    /* Four Rows of Five Bricks = Total 20 Bricks */
    private int width =  120;
    private int height = 80;
    private int x,y;
    private Ball ball;

    public Brick(Ball ball){
        x = 0;
        y = 0;
        this.ball = ball;
    }
    public void setPosition(int x, int y){
        this.x =  x - width/2;
        this.y = y - height/2;
    }
    public Rectangle getBounds(){
        return new Rectangle(x,y,width,height);
    }
    public void checkCollision(Ball ball){
        if(getBounds().intersects(ball.getBounds())){
            /* Will fill in later */
        }
    }

   /* public int getWidth(){return width;}
    public int getHeight(){return height;}
    public int getX(){return x;}
    public int getY(){return y;} */

    public void paint(Graphics g){
        g.fillRect(x,y,width,height);
    }

}

Iподумал, что если я добавлю новый кирпич в список, он создаст новый в зеленый цвет.Я думал, что это будет работать 20 раз, так как это то, что я тоже установил, но ничего не произошлоВ моей программе ничего не изменилось.Только один кирпич все еще появился в углу, и никаких новых кирпичей не появилось.

1 Ответ

0 голосов
/ 13 февраля 2019

Не это - вы добавляете новые кубики в компонент рисования, не имеет смысла.

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.lightGray);
    ball.paint(g);
    g.setColor(Color.white);
    paddle.paint(g);
    g.setColor(Color.red);
    brick.paint(g);
      for(int i = 0; i < brickList.size(); i++){
        brickList.add(new Brick(this.ball)); // ???? what the heck???
        g.setColor(Color.green);
    }
  }

Почему бы вместо этого просто нарисовать кирпичи в цикле for, ничего не делать, кроме рисования:

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.lightGray);
    ball.paint(g);
    g.setColor(Color.white);
    paddle.paint(g);
    g.setColor(Color.red);
    // brick.paint(g); // not sure what you're painting here, what brick

    // consider setting brick color here:
    // g.setColor(BRICK_COLOR);  // assuming use of a constant
    for(int i = 0; i < brickList.size(); i++){
        // brickList.add(new Brick(this.ball));
        // g.setColor(Color.green);
        brickList.get(i).paint(g);
    }
}
...