1

私はJavaでいくつかのswingとawtプログラミングを学んでいるので、Pongを作ることにしました。Mainクラスは親JFrameです。ボールとパドルをインスタンス化し、それらを追加します(これらはJPanelsです)。ただし、最後に追加されたものだけが表示されます。これを修正するにはどうすればよいですか?

コード:

public class Main extends JFrame {

public Main() {
    super("Pong");
    add(new Ball());
    add(new Paddle());

    setSize(500, 500);
    setBackground(Color.orange);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    new Main().setVisible(true);
}

}

ボールクラス:

public class Ball extends JPanel implements ActionListener {

Timer timer;
private Vec2d position;
private Vec2d velocity;
private Dimension ballSize;

public Ball() {
    super();
    position = new Vec2d(50, 50);
    velocity = new Vec2d(2, 3);
    timer = new Timer(25, this);
    ballSize = new Dimension(40, 40);

    timer.start();
}    


@Override
public void actionPerformed(ActionEvent ae) {
    //Perform game frame logic
    bounceBall();
    repaint(); 
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.fillArc((int)position.x, (int)position.y, ballSize.width, 
            ballSize.height, 0, 360);
    position.add(velocity);
}

private void bounceBall() {
    if(position.x < 0 || position.x > getWidth() - ballSize.width) {
        velocity.x *= -1;
    }

    if (position.y < 0|| position.y > getHeight() - ballSize.height) {
        velocity.y *= -1;
    }
}

}

そして最後に、パドルクラス:

public class Paddle extends JPanel implements ActionListener {

private Vec2d position;
private double yVelocity;

private Rectangle rect;

private Timer timer;


public Paddle() {
    super();
    position = new Vec2d(30, 250);
    yVelocity = 0;

    timer = new Timer(25, this);
    timer.start();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.fillRect((int) position.x, (int) position.y, 20, 40);
}

@Override
public void actionPerformed(ActionEvent ae) {
    repaint();
}

}

Vec2dこれは、私が一緒に投げた小さな2次元のVectorクラスであることに注意してください。また、Pongロジック(パドルとボールの衝突、スコアリングなど)は実装されていません。正しく描画したいだけです

助けてくれてありがとう!

4

4 に答える 4

1

JPanel最初に行うことは、ウィンドウ自体ではなく、ウィンドウのコンテンツペインにsを追加することです。それについて実行時の警告が表示されなかったことに驚いています。

また、各パネルを画面全体に表示することを計画しているように見えますが、ペイントするのはその一部だけです。それが本当にあなたがそれをしたい方法であるならば、あなたはsetOpaque(false)それらの下のパネルが透けて見えることができるようにそれらで行う必要があります。しかし、おそらくより良い解決策JPanelは、描画面であるシングルを用意し、それを各ゲームオブジェクトにpaintComponent()渡してGraphics、それらが自分自身を描画できるようにすることです。

于 2012-12-29T17:19:37.960 に答える
1
add(new Ball());
add(new Paddle());

デフォルトでは、JFrameのレイアウトマネージャーはBorderLayoutです。BorderLayout.WESTまた、コンポーネントを追加する場所( 、、など)を指定しない場合はEAST、中央に追加されます。したがって、同じ場所、つまり中央に2つのコンポーネントを追加します。したがって、そのうちの1つだけが表示されます。

于 2012-12-29T17:19:40.610 に答える
1

BallPaddleを同じ位置に追加しているBorderLayout.CENTERので、最後に追加されたもの(つまり、Paddle)のみが表示されます。ここを使用して、GridLayout以下を表示できます。

setLayout(new GridLayout(1, 2));
add(new Paddle());
add(new Ball());
于 2012-12-29T17:20:37.743 に答える
0

パドルクラスでは、ボールクラスの場合のようにposition.add(velocity)を使用して位置に速度を追加することはありません。

于 2012-12-29T17:27:02.760 に答える