1

我正在使用 Swing 设计一个简单的乒乓球游戏。该游戏由 5 个 .java 文件实现 - PingPongApp.java 是 JVM 的入口点,MainPanel.java 是一个面板,它组织了 2 个子面板:按钮面板和屏幕面板 (ScreenPanel.java),然后是 Ball.java 和 Racket .java 实现了球和球拍的逻辑。我正在尝试在屏幕面板上绘制球和球拍,但问题是不知何故,球是我运行应用程序时唯一绘制的对象。这是我的代码:

球拍.java

import java.awt.*;
public class Racket{
    public Racket(int x, int y, int width, int height){
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    public void draw(Graphics g){
        g.setColor(Color.RED);
        g.fillRect(x, y, width, height);
    }
    private int x, y, width, height;
}

Ball.java

import java.awt.*;
public class Ball{
    public Ball(int x, int y, int velocityX, int velocityY){
        this.x = x;
        this.y = y;
        this.velocityX = velocityX;
        this.velocityY = velocityY;
    }
    public void setBounds(int width, int height){
        rightBoundary = width - DIAMETER;
        bottomBoundary = height - DIAMETER;
    }
    public void move(){
        // Move the ball
    }
    public void draw(Graphics g){
        g.fillOval(x, y, DIAMETER, DIAMETER)
    }
    private final static int DIAMETER = 21;
    private int x, y, velocityX, velocityY, rightBoundary, bottomBoundary;
}

屏幕面板.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ScreenPanel extends JPanel{
    public ScreenPanel(){
        initComponents();
    }
    private void initComponents(){
        interval = 35;
        ball     = new Ball(130, 0, 2, 3);
        racket   = new Racket(120, 250, 70, 10);            
        setPreferredSize(new Dimension(200, 200));
        setBorder(BorderFactory.createLineBorder(Color.BLACK));
        timer = new Timer(interval, new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                ball.setBounds(getWidth(), getHeight());
                ball.move();
                repaint();  
            }
        });
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        ball.draw(g);
        racket.draw(g);  
    }
    public void startOrPauseGame(boolean turnOnOff){
        if(turnOnOff){
            timer.start();
        } else {
            timer.stop();
        }
    }
    private Racket racket;
    private Timer timer;
    private Ball ball;
    private int interval;
}

主面板.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MainPanel extends JPanel{
    public MainPanel(){
        initComponents();
    }
    private void initComponents(){
        buttonPanel = new JPanel(new FlowLayout());
        screenPanel = new ScreenPanel();
        cmdStart    = new JButton("Start/Resume");
        cmdPause    = new JButton("Pause");
        addComponentsToPane();
    }
    public void addComponentsToPane(){
        buttonPanel.add(cmdStart);
        buttonPanel.add(cmdPause);
        setLayout(new BorderLayout());
        add(buttonPanel , BorderLayout.NORTH);
        add(screenPanel , BorderLayout.SOUTH);
        cmdStart.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                // Start the game  
            }                   
        });
        cmdPause.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                // Pause the game 
            }    
        });   
    }
    private ScreenPanel screenPanel;
    private JPanel buttonPanel;
    private JButton cmdStart, cmdPause;
}
4

2 回答 2

3

问题是您的球拍的y坐标大于面板的首选尺寸高度ScreenPanel:- 250 > 200:

    racket = new Racket(120, 250, 70, 10);
                              ^
    setPreferredSize(new Dimension(200, 200));

使球拍脱离屏幕。

于 2012-08-11T11:12:33.520 回答
3

这是我在 ScreenPanel 类的程序中找到的代码

racket   = new Racket(120, 250, 70, 10);            
setPreferredSize(new Dimension(200, 200));

将其更改为您将获得的正确值。Y 为 250,大小为 200。

于 2012-08-11T11:13:31.340 回答