【问题标题】:Simple Pong game; Can't get paddle to move across the screen简单的乒乓球游戏;无法让桨在屏幕上移动
【发布时间】:2013-05-15 18:57:59
【问题描述】:

我正在尝试创建简单的 Pong 游戏。 我正在做的第一件事是当用户单击框架中提供的“左”或“右”按钮时让桨向左或向右移动。 当用户单击按钮时,MainPanel 类中的动作侦听器会更改 Paddle 类中名为“paddlePosition”的常量,然后调用“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);
    }
}

有谁知道出了什么问题?为什么点击按钮时桨叶不移动?

【问题讨论】:

  • 我建议您阅读一下static 的含义。似乎没有关于何时使用它和何时不使用它的逻辑。例如,我不明白你为什么使用静态字段作为 paddleposition。
  • 因为这样我就可以从它的类之外更新它。有没有更好的办法?
  • 任何公共字段都可以从类外更新;此外,您不需要,您只需要拥有(非静态)moveLeft() 和 moveRight()。然后调用 paddle.moveLeft();那是对实例字段进行 Paddle,而不是对类进行 Paddle。

标签: java swing jbutton actionlistener pong


【解决方案1】:

ButtonPanel 中,您正在创建一个新的MainPanel。这会导致您创建一个正在更新的新 invisible 面板。

您真正需要做的是将MainPanel 发送到您的构造函数中的ButtonPanel


编辑: (免责声明:这里的所有代码都是在没有 IDE 的情况下生成的)

PongFrame 构造函数中执行以下操作:

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

这会创建一个引用MainPanelButtonPanel

现在是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);
}

【讨论】:

  • “您真正需要做的,是将 MainPanel 发送到您的构造函数中的 ButtonPanel。” 您能详细说明一下吗?
  • @Imray 请检查此代码是否对您有帮助。好久没做java了,总有可能出错:)
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多