0

シンプルな Pong ゲームを作成しようとしています。私が最初に取り組んでいるのは、ユーザーがフレームにある「左」または「右」ボタンをクリックしたときに、パドルが左または右に移動するようにすることです。ユーザーがボタンをクリックすると、MainPanel クラスのアクション リスナーが「paddlePosition」という Paddle クラスの定数を変更し、「repaint()」を呼び出します。しかし、それは機能しておらず、パドルは動いていません。「Hello World」と paddlePosition の値を出力するため、ボタンが機能していることはわかっていますが、再描画に問題があるようです。これまでのところ、すべてを機能させるために Swing、JFrame、Graphics2D を使用しています。

ここに画像の説明を入力

私のクラス:

ポン枠(ランクラス)

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;


public class PongFrame extends JFrame{

    private static final long serialVersionUID = 1L;

    public PongFrame(){

    ButtonPanel buttonPanel = new ButtonPanel();
    MainPanel mainPanel = new MainPanel();

    add(buttonPanel, BorderLayout.SOUTH);
    add(mainPanel);

    setSize(400, 400);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
}

    public static void main(String[] args) {
        new PongFrame();

    }

}

メインパネル:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MainPanel extends JPanel implements ActionListener{

    public Paddle paddle;

    public MainPanel(){

        setSize(300, 300);
        paddle = new Paddle();
    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D)g;
        paddle.draw(g2);
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println("Hello World");
        Paddle.movePaddleLeft();
        System.out.println(Paddle.paddlePosition);
        this.repaint();
    }
}

ボタン パネル:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class ButtonPanel extends JPanel {


    private static final long serialVersionUID = 1L;

    public MainPanel mainPanelActionListener = new MainPanel(); 

    JButton left;
    JButton right;

    public ButtonPanel(){
        left = new JButton("Left");
        right = new JButton("Right");

        add(left);
        add(right);

        left.addActionListener(mainPanelActionListener);
        right.addActionListener(mainPanelActionListener);
    }
}

パドル:

import java.awt.Graphics2D;

public class Paddle{

    public static int paddlePosition = 200;
    private java.awt.Rectangle paddle;
    private int centerCoordinateX;
    private int centerCoordinateY;

    public Paddle(){
        //paddle = new java.awt.Rectangle(paddlePosition, 285, 100, 10); // x, y, width, height
    }

    public void draw(Graphics2D g2){
        paddle = new java.awt.Rectangle(paddlePosition, 285, 100, 10);
        g2.draw(paddle);
    }

    public static void movePaddleLeft(){
        paddlePosition = (paddlePosition + 3);
    }
}

誰が何が悪いのか分かりますか?ボタンをクリックしてもパドルが動かないのはなぜですか?

4

1 に答える 1

2

ButtonPanelで、新しい を作成していますMainPanel。これにより、更新中の新しい表示パネルが作成されます。

実際に行う必要があるのは、そのコンストラクターに を送信することMainPanelですButtonPanel


編集:( 免責事項:ここのすべてのコードはIDEなしで生成されます)

PongFrameコンストラクターで次のようにします。

MainPanel mainPanel = new MainPanel();
ButtonPanel buttonPanel = new ButtonPanel(mainPanel);

これにより、ButtonPanelへの参照を持つ が作成されMainPanelます。

今ではButtonPanel

public MainPanel mainPanelReference;

JButton left;
JButton right;

public ButtonPanel(MainPanel mainPanelReference) {
    this.left = new JButton("Left");
    this.right = new JButton("Right");

    add(left);
    add(right);

    this.mainPanelReference = mainPanelReference;

    left.addActionListener(mainPanelReference);
    right.addActionListener(mainPanelReference);
}
于 2013-01-15T15:27:27.410 に答える