Java 弹跳球不会按预期移动

Java 弹跳球不会按预期移动,java,Java,我有这个弹跳球应用程序 我面临的第一个问题是,当我启动所有3个球时,没有一个移动,或者只有1个移动 我面临的另一个问题是,球不会从框架的上壁反弹。我是错过了什么还是做错了什么 import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.*; public class Bouncing_Balls extends JPanel { //variables for the o

我有这个弹跳球应用程序

我面临的第一个问题是,当我启动所有3个球时,没有一个移动,或者只有1个移动

我面临的另一个问题是,球不会从框架的上壁反弹。我是错过了什么还是做错了什么

import javax.swing.JFrame;
        import javax.swing.JPanel;
        import java.awt.*;

public class  Bouncing_Balls extends JPanel {

    //variables for the object1
    int x= 0,y=0;
    int angleX = 1 , angleY=1;

    int speed = 5;

    //method to move the ball
    private void move(){
        if (x+angleX<0){
            angleX=speed;
        }else if (x+angleX > getWidth()-50){
            angleX=-speed;
        }else if (y+angleY <0){
            angleY=-speed;
        }else if (y+angleY > getHeight()-50) {
            angleY = -speed;
        }
        x=x+angleX;
        y=y+angleY;
    }

    //@Override
    //public void paint(Graphics g){
     //   super.paint(g);
      //  g.fillOval(x,y,50,50);
    //}

    int x1= 0,y1=0;
    int angleX1 = 1 , angleY1=1;

    int speed1 = 15;
    //variables for the object2

    private void move1(){
        if (x1+angleX1<0){
            angleX1=speed1;
        }else if (x+angleX1 > getWidth()-75){
            angleX1=-speed1;
        }else if (y1+angleY1 <0){
            angleY1=-speed1;
        }else if (y1+angleY1 > getHeight()-75) {
            angleY1 = -speed1;
        }
        x1=x1+angleX1;
        y1=y1+angleY1;
    }

    int x2= 0,y2=0;
    int angleX2 = 1 , angleY2=1;

    int speed2 = 15;
    //variables for the object2

    private void move2(){
        if (x2+angleX2<0){
            angleX2=speed2;
        }else if (x+angleX2 > getWidth()-25){
            angleX2=-speed2;
        }else if (y2+angleY2 <0){
            angleY2=-speed2;
        }else if (y2+angleY2 > getHeight()-25) {
            angleY2 = -speed2;
        }
        x1=x2+angleX2;
        y1=y2+angleY2;
    }


    @Override
    public void paint(Graphics g){
        super.paint(g);
        g.fillOval(x,y,50,50);
        g.fillOval(x1,y1,75,75);
        g.fillOval(x2,y2,25,25);
    }

    public static void main (String[] args) throws InterruptedException{

        JFrame frame = new JFrame("Bouncing Ball!");
        Bouncing_Balls app = new Bouncing_Balls();
        frame.add(app);
        frame.setSize(400,400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        while (true){
            app.move();
            app.move1();
            app.move2();
            app.repaint();
            Thread.sleep(10);
        }
    }


}
import javax.swing.JFrame;
导入javax.swing.JPanel;
导入java.awt.*;
公开课弹跳球扩展了JPanel{
//object1的变量
int x=0,y=0;
int angleX=1,angleY=1;
内速度=5;
//移动球的方法
私人空位移动(){
如果(x+angleX getWidth()-50){
角x=速度;
}否则,如果(y+angleY getHeight()-50){
角度=-速度;
}
x=x+角度x;
y=y+角度;
}
//@凌驾
//公共空间涂料(图g){
//超级油漆(g);
//g.fillOval(x,y,50,50);
//}
int-x1=0,y1=0;
int angleX1=1,angleY1=1;
int speed1=15;
//object2的变量
私有void move1(){
如果(x1+angleX1 getWidth()-75){
角度x1=-speed1;
}否则如果(y1+角度y1 getHeight()-75){
角度1=-速度1;
}
x1=x1+x1;
y1=y1+角度y1;
}
int x2=0,y2=0;
int angleX2=1,angleY2=1;
int speed2=15;
//object2的变量
私人机构2(){
如果(x2+angleX2 getWidth()-25){
角度x2=-speed2;
}否则如果(y2+角度y2 getHeight()-25){
角度2=-速度2;
}
x1=x2+角x2;
y1=y2+角度y2;
}
@凌驾
公共空间涂料(图g){
超级油漆(g);
g、 椭圆形(x,y,50,50);
g、 椭圆形(x1,y1,75,75);
g、 椭圆形(x2,y2,25,25);
}
公共静态void main(字符串[]args)引发InterruptedException{
JFrame=新的JFrame(“弹跳球!”);
弹跳球app=新弹跳球();
frame.add(app);
框架。设置尺寸(400400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while(true){
app.move();
app.move1();
app.move2();
app.repaint();
睡眠(10);
}
}
}

这可能无法完全解决您的问题,因为我没有使用
JFrame
来快速确定您的问题,但下面将展示一个示例,说明如何大大简化您编写代码的方式,从而在出现任何错误时更容易调试(发布此消息是因为您特别要求提供我的评论示例)

以下是您要求的示例:

public class Bouncing_Balls extends JPanel {

    int x, y;
    int angleX, angleY;
    int speed;
    int moveValue;

    public Bouncing_Balls(int angleX, int angleY, int speed, int moveValue) {
        this.angleX = angleX;
        this.angleY = angleY;
        this.speed = speed;
        this.moveValue = moveValue;
        this.x = 0;
        this.y = 0;
    }

    //method to move the ball
    private void move(){
        if (x+angleX<0){
            angleX=speed;
        }else if (x+angleX > getWidth() - moveValue){
            angleX=-speed;
        }else if (y+angleY <0){
            angleY=-speed;
        }else if (y+angleY > getHeight() - moveValue) {
            angleY = -speed;
        }
        x=x+angleX;
        y=y+angleY;
    }

    @Override
    public void paint(Graphics g){
        super.paint(g);
        g.fillOval(x, y, moveValue, moveValue);
    }

    public static void main (String[] args) throws InterruptedException{

        JFrame frame = new JFrame("Bouncing Ball!");
        Bouncing_Balls ball1 = new Bouncing_Balls(1, 1, 5, 50); //Pass the paremeters you want set (angleX, angleY, speed, moveValue)
        Bouncing_Balls ball2 = new Bouncing_Balls(1, 1, 15, 75);
        Bouncing_Balls ball3 = new Bouncing_Balls(1, 1, 15, 25); 
        frame.add(ball1);
        frame.add(ball2);
        frame.add(ball3);
        frame.setSize(400,400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        while (true){
            ball1.move();
            ball2.move();
            ball3.move();
            frame.repaint();
            Thread.sleep(10);
        }
    }
}
公共类弹跳球扩展JPanel{
int x,y;
int angleX,angleY;
整数速度;
int值;
公众弹跳球(int angleX、int angleY、int speed、int moveValue){
this.angleX=angleX;
this.angleY=angleY;
速度=速度;
this.moveValue=moveValue;
这个.x=0;
这个。y=0;
}
//移动球的方法
私人空位移动(){
如果(x+angleX getWidth()-moveValue){
角x=速度;
}else if(y+angleY getHeight()-moveValue){
角度=-速度;
}
x=x+角度x;
y=y+角度;
}
@凌驾
公共空间涂料(图g){
超级油漆(g);
g、 fillOval(x,y,moveValue,moveValue);
}
公共静态void main(字符串[]args)引发InterruptedException{
JFrame=新的JFrame(“弹跳球!”);
Bouncing_Balls ball1=新的Bouncing_Balls(1,1,5,50);//通过您想要设置的参数(angleX,angleY,speed,moveValue)
弹跳球2=新弹跳球(1,1,15,75);
弹跳球3=新弹跳球(1,1,15,25);
帧。添加(1);
帧。添加(2);
帧。添加(3);
框架。设置尺寸(400400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while(true){
ball1.move();
ball2.move();
ball3.move();
frame.repaint();
睡眠(10);
}
}
}
需要注意的主要事项是,通过使用设置类变量值的构造函数来删除不同的变量和不同的
move
方法,而不是在每个不同的情况下硬编码到类
弹跳球本身中

此外,我将您在
move()
方法(也称为50、75或25)中更改的值移动到构造函数和一个类变量中,这样您就可以声明您希望球“移动”的程度

最后,由于
Bouncing_Balls
现在将球分割为不同的对象,因此现在需要使用构造函数三次
Bouncing_Balls ball1=新的Bouncing_Balls(1,1,5,50)
并更改值

总的来说,我试图使它与您发布的代码完全相同,只是为了可读性而进行了重构,因此它的工作原理应该完全相同,但现在添加新的球或修复当前的问题会容易得多


最后,作为旁注,我建议遵循适当的Java命名约定,因为
Bouncing\u Balls
应该在Java中命名为
bouncingball
,不带下划线。

您似乎不太清楚什么是面向对象编程,您不需要创建三种不同的方法
move
,您只需要您需要创建一个,然后创建多个对象,执行
弹跳球1=新弹跳球();
弹跳球2=新弹跳球();
然后使用
ball1.move()
ball2.move()调用该方法
。您也不需要为每个对象创建多个不同的变量,只需为单个“球”创建所需的所有变量即可。@Nexevis,您的意思是我必须删除