我已经完成了将圆随机化的工作,现在我的挑战是将圆添加到像实际队列一样的直线队列中(我希望圆最好在框架的顶部从左到右排队。当我调用removeCircle时(),我希望圈子离开队列并向下移动框架。您能帮我使用addCircle()和removeCircle()方法吗?谢谢您。
public class AirTrafficLanding
{
private static void createAndShowUI()
{
PlanePanel panel = new PlanePanel(1);
JFrame frame = new JFrame("Air traffic Landing System");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.add( panel );
frame.pack();
frame.setVisible( true );
panel.startAnimation();
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
static class PlanePanel extends JPanel implements ActionListener
{
private ArrayList<Plane> planes = new ArrayList<Plane>();
public PlanePanel(int planeCount)
{
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setLayout( null );
setBackground( Color.BLACK );
Random random = new Random();
for (int i = 0; i < planeCount; i++)
{
Plane plane = new Plane();
plane.setRandomColor(true);
plane.setLocation(0, 700);
//plane.setLocation(random.nextInt(screenSize.width), random.nextInt(screenSize.height));
plane.setMoveRate(32, 32, 1, 1, true);
plane.setSize(32, 32);
planes.add( plane );
}
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
for (Plane plane: planes)
{
plane.draw(g);
}
}
public void startAnimation()
{
Timer timer = new Timer(55, this);
timer.start();
}
public void actionPerformed(ActionEvent e)
{
move();
repaint();
}
private void move()
{
for (Plane plane : planes)
{
plane.move(this);
}
}
}
static class Plane
{
public Color color = Color.BLACK;
public int x = 0;
public int y = 0;
public int width = 1;
public int height = 1;
private int moveX = 1;
private int moveY = 1;
private int directionX = 1;
private int directionY = 1;
private int xScale = moveX;
private int yScale = moveY;
private boolean randomMove = false;
private boolean randomColor = false;
private Random myRand = null;
public Plane()
{
myRand = new Random();
setRandomColor(randomColor);
}
public void move(JPanel parent)
{
int iRight = parent.getSize().width;
int iBottom = parent.getSize().height;
x += 5 + (xScale * directionX);
y += 5 + (yScale * directionY);
if (x <= 0)
{
x = 0;
directionX *= (-1);
xScale = randomMove ? myRand.nextInt(moveX) : moveX;
if (randomColor) setRandomColor(randomColor);
}
if (x >= iRight - width)
{
x = iRight - width;
directionX *= (-1);
xScale = randomMove ? myRand.nextInt(moveX) : moveX;
if (randomColor) setRandomColor(randomColor);
}
if (y <= 0)
{
y = 0;
directionY *= (-1);
yScale = randomMove ? myRand.nextInt(moveY) : moveY;
if (randomColor) setRandomColor(randomColor);
}
if (y >= iBottom - height)
{
y = iBottom - height;
directionY *= (-1);
yScale = randomMove ? myRand.nextInt(moveY) : moveY;
if (randomColor) setRandomColor(randomColor);
}
}
public void draw(Graphics g)
{
g.setColor(color);
g.fillOval(x, y, width, height);
}
public void setColor(Color c)
{
color = c;
}
public void setLocation(int x, int y)
{
this.x = x;
this.y = y;
}
public void setMoveRate(int xMove, int yMove, int xDir, int yDir, boolean randMove)
{
this.moveX = xMove;
this.moveY = yMove;
directionX = xDir;
directionY = yDir;
randomMove = randMove;
}
public void setRandomColor(boolean randomColor)
{
this.randomColor = randomColor;
switch (myRand.nextInt(3))
{
case 0: color = Color.ORANGE;
break;
case 1: color = Color.GREEN;
break;
case 2: color = Color.RED;
break;
default: color = Color.BLACK;
break;
}
}
public void setSize(int width, int height)
{
this.width = width;
this.height = height;
}
}
}
我希望从队列中的零个圆圈开始,并以10秒的间隔添加一个圆圈。我希望每15秒将一个圆圈从队列移到队列底部。我已经完成了将圆随机化的工作,现在我的挑战是将圆添加到像实际队列一样的直线队列中(我希望圆最好在帧的顶部从左到右排队。当我调用removeCircle()时,我希望圆离开队列并向下移动框架。您能通过addCircle()和removeCircle()方法来帮助我吗?
答案 0 :(得分:1)
解决问题应该一次完成一个问题。在开始测试之前,请勿尝试编写整个程序。
因此,请分解程序的基本知识:
您需要一个Timer来使动画移动每个对象。因此,首先向ArrayList添加一个对象,然后在Timer触发时,您遍历ArrayList并移动每个对象。没关系,在ArrayList中只有一个对象可以开始。
然后创建另一个Timer,每15秒触发一次,以将另一个对象添加到ArrayList。
然后您添加逻辑以使该对象具有随机颜色
然后添加逻辑以赋予该对象优先级。
完成上述所有操作后,您将添加另一个Timer并将其从ArrayList中移除。
代码的基本结构需要更改。
签出:How do I paint multiple objetcs that move at different speeds in Java?来帮助重组的示例。
它不能满足您的所有需求,但这是一个好的开始。它将为对象的ArrayList设置动画。因此,您将需要修改代码以一次在ArrayList中填充一个对象,并一次移除一个对象。
编辑:
如果您想添加更多圈子,则需要另一个计时器。使用我提供的原始代码,您可以执行以下操作:
public void startAnimation()
{
//Timer timer = new Timer(75, this);
//timer.start();
Timer timer = new Timer(1000, new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
move();
repaint();
}
});
timer.start();
Timer timer2 = new Timer(3000, new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
addBalls(1);
}
});
timer2.start();
}
因此,第一个Timer对ArrayList中已经存在的球进行动画处理。第二个Timer向ArrayList添加一个新球。
我将让您编写Timer以便从ArrayList中删除一个球。我已经建议过,这是ActionListener中的一条语句。