Java 一个接一个地移动球

Java 一个接一个地移动球,java,animation,javax.swing.timer,Java,Animation,Javax.swing.timer,我正在写一个游戏豆机(高尔顿盒子)的代码,它的机制是一个球落下并随机移动,直到它到达一个插槽(随机),然后另一个球来做同样的事情,等等,问题是所有球同时落下,这是我不想要的,我希望每一个球在当前球完成它的移动时都能落下。有人能帮我吗!谢谢 代码如下: import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.Collection; import java.util.Random

我正在写一个游戏豆机(高尔顿盒子)的代码,它的机制是一个球落下并随机移动,直到它到达一个插槽(随机),然后另一个球来做同样的事情,等等,问题是所有球同时落下,这是我不想要的,我希望每一个球在当前球完成它的移动时都能落下。有人能帮我吗!谢谢

代码如下:

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Random;
import java.util.Scanner;
import java.lang.Iterable;

import javax.swing.*;


public class BallPanel extends JPanel  {

int x=1, y=1;
Collection <Ball> ball;
public static void main(String [] args){
      // create the list
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
    JFrame frame= new JFrame("Bean game");
    frame.add(new BallPanel());
    frame.setSize(300,500);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
        }
    });    
}

public BallPanel() {

    JPanel panel = new JPanel();
    ball=new ArrayList<>(); 
    for(int i=1;i<=4;i++){
        ball.add(new Ball(x,y));
        x++;
        y++;
    }
     Timer timer = new Timer(400, new ActionListener()
    { 
        public void actionPerformed(ActionEvent e) {
            for (Ball b: ball) {
                  b.move();repaint();
            }

        }
    });
      timer.start();
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    int raduis=10;
    int  i=0;
    int width=(getWidth()/8);
    int space=(getWidth()-8*30)/2;
    g.setColor(Color.BLACK);
    for(i=0;i<=8;i++){
        g.drawLine(space+(30*i),getHeight()-5*(raduis) ,space+(30*i) ,getHeight() );
        if(i!=0 && i!=8)
            g.fillOval(space+(30*i)-5, getHeight()-5*(raduis)-5, 10, 10);
        if(i==0){
            g.drawLine(space,getHeight()-5*(raduis) , space+((8)*15)-(raduis/2)-15 , getHeight()-15-(5*raduis)-(30*(8-2))-raduis/2);
            g.drawLine(space+((8)*15)-(raduis/2)-15 , getHeight()-15-(5*raduis)-(30*(8-2))-raduis/2 , space+((8)*15)-(raduis/2)-15 , getHeight()/2-8*8);//vertical line

        }
        if(i==8){
            g.drawLine(space+(30*i), getHeight()-5*(raduis), space+((8)*15)+(raduis/2)+15, getHeight()-15-(5*raduis)-(30*(8-2))-raduis/2);
            g.drawLine(space+((8)*15)+(raduis/2)+15 , getHeight()-15-(5*raduis)-(30*(8-2))-raduis/2 , space+((8)*15)+(raduis/2)+15 , getHeight()/2-8*8);//vertical line

        }

    }


    int o=1;
    for(i=1;i<=8-2;i++){
        int k=2;
        for(int j=i;j<=8-2;j++){
            g.fillOval(space+((i+k)*15)-raduis/2, getHeight()-(5*raduis)-(30*o)-raduis/2, raduis, raduis); 
            k=k+2;   
         }o++;
    }
    for (Ball b : ball) {
         b.draw(g);
    }
}
public class Ball {
    Random rand=new Random();
    private int n;
    private int raduis = 10;
    private int moveRaduis=12;
    private int L = 0;
    private int R = 0;
    private int D = 0;
    int x, y; 

    public Ball(int x, int y){
        this.x=x;
        this.y=y;
    }  

    public void draw(Graphics g) {
        g.setColor(Color.RED);
        g.fillOval(getWidth()/2 -raduis/2  + R + L, 0 + D , moveRaduis, moveRaduis);

    }
    public void move() {
        n=1+rand.nextInt(100);
        if(n<=51){
            D+=15;

            if(D<=(getHeight()-15-(5*raduis)-(30*(8-2))-raduis/2))
                L=0;
            else if(D>getHeight()-15-(5*raduis)-(30*(8-2))-raduis/2 && D<getHeight()-5*(raduis))
            {
                D+=15;
                L-=15;

            }
            else if(D>=getHeight()-5*(raduis))
            {
                if(D==31*15)D-=15;
                D=D;

            }

        }
        else if (n>=51 && n<=100){
            D+=15;
            if(D<=getHeight()-15-(5*raduis)-(30*(8-2))-raduis/2)
                R=0;
            else if(D>getHeight()-15-(5*raduis)-(30*(8-2))-raduis/2 && D<getHeight()-5*(raduis))
                {
                D+=15;
                R+=15;
            }
            else if(D>=getHeight()-5*(raduis)){
                if(D==31*15)D-=15;
                D=D;

            }

        }

    }
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.Random;
导入java.util.Scanner;
导入java.lang.Iterable;
导入javax.swing.*;
公共类BallPanel扩展了JPanel{
int x=1,y=1;
收集球;
公共静态void main(字符串[]args){
//创建列表
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
JFrame=新JFrame(“豆子游戏”);
frame.add(新的BallPanel());
框架。设置尺寸(300500);
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});    
}
公共事务委员会(){
JPanel面板=新的JPanel();
ball=新的ArrayList();

对于(inti=1;i所以,您的移动代码在每次迭代中移动所有的球,您需要做的是有一个“活动”球,例如

private Ball activeBall;

Timer timer = new Timer(400, new ActionListener() { 
    public void actionPerformed(ActionEvent e) {
        if (activeBall != null && activeBall.hasCompleted()) {
            activeBall = null;
        }
        if (activeBall == null && ball.size() > 0) {
            activeBall = ball.remove(0);
        }
        if (activeBall != null) {
            activeBall.move();
            repaint();
        }
    }
});

你需要添加一些检查来确定球已经完成了它的运行,尽管我已经使用了它,它已经被复制了,但是它们同时移动,我不想要的是,我希望每个球移动并完成它的移动,然后另一个球来了,依此类推。