0

私は小さなゲームを作成しています。ボタン(上、下、左、右)をクリックして、猫(長方形で表されます)を制御して、マウス(別の長方形で表されます)を追いかけます。Lame私は知っています...とにかく私はmvcデザインパターンを使用していて、2つの長方形が「ペイント」されるパネルのコントローラーのボタンリスナーからrepaintメソッドを呼び出すのに問題があります。彼らは最初はうまくペイントしますが、それ以上はペイントしません。

paintComponent()メソッドを2つの方法で実装しましたが、どちらも機能しませんでした

  1. JPanelを拡張し、paintComponentビジネスを実行する別のクラスを作成し、ビューにそのクラスの新しいオブジェクトを作成し、それを使用して長方形をペイントします。
  2. JPanelを作成し、新しいJPanelオブジェクトの括弧内にpaintComponentのものを書き込みます。

コントローラーにコードを実装して2つの方法で再描画しましたが、どちらも機能しませんでした

  1. paintComponentメソッドを使用するjpanelを返すビューからメソッドを呼び出し、その上でrepaintを呼び出します。
  2. コントローラでjpanelを作成し、ビューからパネルをそれに割り当ててから、その上でrepaintを呼び出します。

ビューとコントローラーのコード(長いです、申し訳ありません!)は以下のとおりです。これには、2つの方法から前述の問題に取り組むために作業できなかったコメントアウトされたものも含まれています...

View

/ * * gameView.java * /

パッケージゲーム;

java.awtをインポートします。; java.awt.eventをインポートします。; インポートjavax.swing。*;

パブリッククラスgameViewはJFrameを拡張します{

//components
private JButton up = new JButton("Up");
private JButton down = new JButton("Down");
private JButton left = new JButton("Left");
private JButton right = new JButton("Right");
//panels
private JPanel content = new JPanel();
//boardPanel leftPanel = new boardPanel();
private Stroke drawingStroke = new BasicStroke(1);

private JPanel leftPanel = new JPanel(){
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponents(g);
        myPaint(g);
        }
};
private JPanel rightPanel = new JPanel();
//model
private gameModel model;
//mouse and cat
private Rectangle cat;
private Rectangle mouse;

public void myPaint(Graphics g){

    Graphics2D g1 = (Graphics2D)g;
    Graphics2D g2 = (Graphics2D)g;

    g1.setStroke(drawingStroke);
    g1.draw(cat);
    g1.setPaint(Color.yellow);
    g1.fill(cat);

    g2.setStroke(drawingStroke);
    g2.draw(mouse);
    g2.setPaint(Color.red);
    g2.fill(mouse);
}

//constructor
public gameView(gameModel _model){
    model = _model;
    //cat and mouse
    cat = new Rectangle(_model.getCatX(), _model.getCatY(), 10, 10);
    mouse = new Rectangle(_model.getMouseX(), _model.getMouseY(), 10, 10);
    //layout
    content.setSize(500, 400);
    content.setLayout(new GridLayout(0,2));

    leftPanel.setSize(200, 200);
    leftPanel.setBackground(Color.blue);

    rightPanel.setSize(100, 400);
    rightPanel.setLayout(new FlowLayout());
    rightPanel.add(new JLabel("Controls"));
    rightPanel.add(up);
    rightPanel.add(down);
    rightPanel.add(left);
    rightPanel.add(right);

    content.add(leftPanel);
    content.add(rightPanel);

    this.setSize(500, 400);
    this.setContentPane(content);
    this.setTitle("Cat & Mouse Game");
}
//returns the leftPanel to repaint in the controller
public JPanel getLeft(){
    return leftPanel;
}

//listeners for buttons
public void addUpListener(ActionListener moveUp){
    up.addActionListener(moveUp);
}
public void addDownListener(ActionListener moveDown){
    down.addActionListener(moveDown);
}
public void addLeftListener(ActionListener moveLeft){
    left.addActionListener(moveLeft);
}
public void addRightListener(ActionListener moveRight){
    right.addActionListener(moveRight);
}
public void addCloseListener(WindowListener close){
    this.addWindowListener(close);
}
//
public Rectangle getCat(){
    return cat;
}
public Rectangle getMouse(){
    return mouse;
}
//left side board panel
/*class boardPanel extends JPanel{
    Stroke drawingStroke = new BasicStroke(1);
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g1 = (Graphics2D)g;
        g1.setStroke(drawingStroke);
        g1.draw(cat);
        g1.setPaint(Color.yellow);
        g1.fill(cat);

        Graphics2D g2 = (Graphics2D)g;
        g2.setStroke(drawingStroke);
        g2.draw(mouse);
        g2.setPaint(Color.red);
        g2.fill(mouse);
    }
}
public JPanel getLeft(){
    return leftPanel;
}*/

}

コントローラ

/ * * gameController.java*/パッケージゲーム;

java.awt.eventをインポートします。; javax.swingをインポートします。;

パブリッククラスgameController{

private gameModel model;
private gameView view;
private JPanel lp = new JPanel();

public gameController(gameModel _model, gameView _view){
    model = _model;
    view = _view;

    lp=_view.getLeft();

    //listeners
    view.addUpListener(new UpListener());
    view.addDownListener(new DownListener());
    view.addLeftListener(new LeftListener());
    view.addRightListener(new RightListener());
    view.addCloseListener(
        new WindowAdapter(){
              public void windowClosing(WindowEvent we){
                  System.exit(0);
                  }
        });
}
//DOWN
class DownListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        model.setCatY((model.getCatY()+10));
        //do a random move for the mouse
        //model.randomMove();
        //view.getLeft().repaint();
        lp.repaint();
        System.out.println("x="+model.getCatX()+"y="+model.getCatY());
    }
}
//LEFT
class LeftListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        model.setCatY((model.getCatY()-10));
        //do a random move for the mouse
        //model.randomMove();
        //view.getLeft().repaint();
        lp.repaint();
        System.out.println("x="+model.getCatX()+"y="+model.getCatY());
    }
}
//RIGHT
class RightListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        model.setCatY((model.getCatY()+10));
        //do a random move for the mouse
        //model.randomMove();
        //view.getLeft().repaint();
        lp.repaint();
        System.out.println("x="+model.getCatX()+"y="+model.getCatY());
    }
}

}

4

1 に答える 1

0

ボタンリスナーがモデルを更新しているように見えますが、実際には猫とマウスの長方形の座標を更新するものはありません。モデルから初期境界を取得しますが、その後は更新されません。

ビューはおそらくモデルをリッスンして、猫とマウスの位置を実際のRectangleオブジェクトに同期させる必要があります。

于 2011-04-15T16:37:24.947 に答える