Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在基于Java、JFrame的游戏中,使用JLabel不断更新分数_Java_Swing_Jlabel_Runnable_Pong - Fatal编程技术网

在基于Java、JFrame的游戏中,使用JLabel不断更新分数

在基于Java、JFrame的游戏中,使用JLabel不断更新分数,java,swing,jlabel,runnable,pong,Java,Swing,Jlabel,Runnable,Pong,我正在用Java开发一个小的“乒乓”游戏 我试图在顶部添加一个记分员,每当球员用球拍救球时,该记分员都会显示更新的分数(+1) 我正在尝试使用JLabel,但问题是,我想不出一种方法,可以在每次击桨时不断更新JLabel 有什么想法吗 我的代码: 主面板类别(带有挡板、球和标签的类别) 还有我的球类: 导入java.awt.Color; 导入java.awt.Graphics2D; 导入java.awt.geom.Ellipse2D; 导入java.awt.geom.Rectangle2D; 导

我正在用Java开发一个小的“乒乓”游戏

我试图在顶部添加一个记分员,每当球员用球拍救球时,该记分员都会显示更新的分数(+1)

我正在尝试使用JLabel,但问题是,我想不出一种方法,可以在每次击桨时不断更新JLabel

有什么想法吗

我的代码:

主面板类别(带有挡板、球和标签的类别)

还有我的球类:

导入java.awt.Color; 导入java.awt.Graphics2D; 导入java.awt.geom.Ellipse2D; 导入java.awt.geom.Rectangle2D; 导入java.util.Random

public class Ball {

    private Ellipse2D ball;
    private double radius;
    private double ballCircumference;
    private Color color;

    private double x;
    private double y;
    private double dx = 5;
    private double dy = 5;

    private int score = 0;
    public int getScore() {
        return score;
    }
    //Boundaries to determine if ball is hit by paddle
    private double criticalBoundaryX;
    private double criticalBoundaryY1; 
    private double criticalBoundaryY2;
    private double paddleHalfwayPoint;
    private boolean inGame = true;
    public void recalculateCriticals(){
        criticalBoundaryX = Paddle.getYPosition() - ballCircumference;
        criticalBoundaryY1 = Paddle.getXPosition()- ballCircumference; //Left boundary
        criticalBoundaryY2 = Paddle.getXPosition()+Paddle.getPaddleWidth()+ballCircumference; //Right Boundary
        paddleHalfwayPoint = (Paddle.getXPosition()+Paddle.getPaddleWidth())/2;
    }

    public Ball(int centerX, int centerY, int radius) {
        this.x = centerX - radius;
        this.y = centerY - radius;
        this.radius = radius;
        ballCircumference = 2*radius;
        Random randomRGB = new Random();
        color = new Color(randomRGB.nextInt(255), randomRGB.nextInt(255), randomRGB.nextInt(255));
        this.ball = new Ellipse2D.Double(x, y, 2*radius, 2*radius);
    }

    public void move(Rectangle2D bounds) {
        recalculateCriticals();
        x += dx;
        y += dy;
        if (x < bounds.getMinX()) {
            x = bounds.getMinX();
            dx = -dx;
        }
        if (x + 2*radius >= bounds.getMaxX()) {
            //System.out.println(bounds.getMaxX());
            x = bounds.getMaxX() - 2*radius;
            dx = -dx;
        }
        if (y < bounds.getMinY()) {
            y = bounds.getMinY();
            dy = -dy;
        }
        if (y > criticalBoundaryX){
             if (x < criticalBoundaryY1 || x > criticalBoundaryY2){
                 inGame = false;
             }
             if (!inGame && hittingEdge(x))
                 dx = -dx;
        }
        if (y > criticalBoundaryX && inGame){ //When it hits the paddle
            changeColor();
            score++;
            y = criticalBoundaryX;
            dy = -dy;
         }
        if (y > bounds.getMaxY()){
            System.out.println("Game Over");
            System.exit(0);
        }
        recalculateCriticals();
        ball.setFrame(x, y, 2*radius, 2*radius);
    }

    public boolean onPaddle(double x){
        return ((x > Paddle.getXPosition()) && (x < Paddle.getXPosition()+Paddle.getPaddleWidth()) && (y > Paddle.getYPosition()-10));
    }
    public boolean hittingEdge(double x){
        return ((x >= criticalBoundaryY1 && x < paddleHalfwayPoint)
                ||
                (x <= criticalBoundaryY1 && x > paddleHalfwayPoint)); //Return true if x is hitting the side edge of the paddle
    }
    public void changeColor(){
        Random randomColor = new Random();
        color = new Color(randomColor.nextInt(255), randomColor.nextInt(255), randomColor.nextInt(255));
    }

    public void draw(Graphics2D g2) {
        g2.setColor(color);
        g2.fill(ball);
    }
}
公开课舞会{
私人椭圆球;
私人双半径;
私人双球周长;
私人色彩;
私人双x;
私人双y;
私人双dx=5;
私人双dy=5;
私人智力得分=0;
公共整数getScore(){
返回分数;
}
//确定球是否被划桨击中的边界
私有双临界边界;
私有双临界边界1;
私有双临界边界2;
私人双桨中途站;
私有布尔inGame=true;
公共文件{
criticalBoundaryX=桨。getYPosition()-球周长;
CriticalBoundary1=桨。getXPosition()-球周长;//左边界
CriticalBoundary2=桨。getXPosition()+桨。getPaddleWidth()+球周长;//右边界
PapperHalfWayPoint=(blade.getXPosition()+blade.getPapperWidth())/2;
}
公共球(整数中心X、整数中心Y、整数半径){
此.x=中心x-半径;
y=中心y-半径;
这个半径=半径;
球周长=2*半径;
随机随机RGB=新随机();
颜色=新颜色(randomRGB.nextInt(255)、randomRGB.nextInt(255)、randomRGB.nextInt(255));
this.ball=新的椭圆2d.Double(x,y,2*半径,2*半径);
}
公共无效移动(矩形2D边界){
重新计算临界值();
x+=dx;
y+=dy;
if(x=bounds.getMaxX()){
//System.out.println(bounds.getMaxX());
x=bounds.getMaxX()-2*半径;
dx=-dx;
}
if(y临界边界X){
if(xcriticalboundary2){
inGame=false;
}
if(!inGame&&hittingEdge(x))
dx=-dx;
}
如果(y>临界边界X&&inGame){//当它碰到桨时
变色();
分数++;
y=临界边界X;
dy=-dy;
}
如果(y>bounds.getMaxY()){
System.out.println(“游戏结束”);
系统出口(0);
}
重新计算临界值();
球形固定框架(x,y,2*半径,2*半径);
}
公共布尔onblade(双x){
返回((x>paile.getXPosition())和&(xpaile.getYPosition()-10));
}
公共布尔hittingEdge(双x){
返回((x>=临界边界1&&x<半路点)
||
(x桨叶中途点));//如果x击中桨叶的侧边,则返回true
}
公共void changeColor(){
Random randomColor=新的Random();
颜色=新颜色(randomColor.nextInt(255)、randomColor.nextInt(255)、randomColor.nextInt(255));
}
公共空白绘图(图形2D g2){
g2.设置颜色(颜色);
g2.填充(球);
}
}
执行此操作的“Java方式”是定义侦听器接口,例如:

public interface BallListener {
  void paddleHit();
}
在Ball类中,应该添加一个字段

私有列表侦听器

以及方法

public void addBallListener(BallListener l) { listeners.add(l); }
public void removeBallListener(BallListener l) { listeners.remove(l); }
当划桨被击打时,您可以:

for (BallListener l : listeners)
  l.paddleHit();
主类应该实现
BallListener
接口,并向ball注册自己(
ball.addBallListener(this)


这种方法还使您能够在需要时,将发生在球上的不同事件通知程序的其他部分(即,为您想要发出信号的每个事件向
BallListener
添加新方法).

我不知道你是在嘲笑我还是在欣赏我的才华。你可以为你的分数创建一个班级,让你的分数变得引人注目。您需要能够将观察者添加到实例中,每次设置分数时,您都会遍历所有观察者,并告诉他们分数已更改(您可以自己轻松实现)。然后在主面板中创建一个观察者,更新每个ValueChangedEvent的分数。我想,安妮特只是在嘲笑这个班名。@Aniket哈哈,太好笑了!我说“我的球类”。。notVlad提出了需要实现某种观察模式的观点。基本上,我会创建某种模型来维护您需要的数据。它将被你的应用程序的各个部分使用,允许PADDLs(例如)更新分数并在分数改变时为记分板提供监听器接口。参见MVC和观测者模式。也可以考虑,在每个<代码> JTabs<代码>中找到。()?对点递增器的静态调用?
for (BallListener l : listeners)
  l.paddleHit();