移动对象和计时器

我有一个屏幕,说500宽度和400高度,我有一个形状束vector。 比方说,vector有两种不同的形状。 我希望物体从屏幕底部随机popup,达到一定的上升,然后再下降(类似于游戏水果忍者,水果是我的形状)。

在我的主要(视图)我有一个形状的向量我实例化计时器,添加到数组,并使用翻译function将它们放置在屏幕的button。 我的计时器需要一个动作监听器,它基本上改变了形状的平移,直到上升然后下降,但是我的问题是所有的形状都是同时开始的。

像这样的东西:

Shape f = new Shape(new Area(new Ellipse2D.Double(0, 50, 50, 50))); f.translate(0, 400); f.timer = new Timer( 10 , taskPerformer); f.timer.start(); vector.add(f); Shape f2 = new Shape(new Area(new Rectangle2D.Double(0, 50, 50, 50))); f2.translate(200, 400); f2.timer = new Timer( 10 , taskPerformer); f2.timer.setInitialDelay(5000); f2.timer.start(); vector.add(f2); 

和我的行动听众:

  Random generator = new Random(); ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) { //...Perform a task... for (Shape s : model.getShapes()) { // Scale object using translate // once reached ascent drop down // translate to diffrenet part of the bottom of the screen // delay its timer } update(); //basically repaints } }; 

我遇到了所有形状都遵循相同计时器的问题,并且同时开始popup(不延迟)…

任何build议如何避免这一点,或者如果有不同的方法,我应该尝试

“我希望物体从屏幕的底部随机popup,达到一定的上升,然后再下降”

请参阅下面的可运行示例。 我所做的就是将一个radomDelayedStart传递给Shape 。 定时器的每一个滴答, randomDelayedStart减less,直到它达到0,这是当标志被提出。 大部分逻辑都在Shape类方法中,在TimerActionlistener中调用。 一切都在一个 Timer完成。 对于上升,我只是使用硬编码的50,但你也可以随机上升到Shape 。 如果您有任何问题,请告诉我。 我试图让代码尽可能清楚。

在这里输入图像描述

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Timer; public class RandomShape extends JPanel { private static final int D_HEIGHT = 500; private static final int D_WIDTH = 400; private static final int INCREMENT = 8; private List<Shape> shapes; private List<Color> colors; private Timer timer = null; public RandomShape() { colors = createColorList(); shapes = createShapeList(); timer = new Timer(30, new ActionListener() { public void actionPerformed(ActionEvent e) { for (Shape shape : shapes) { shape.move(); shape.decreaseDelay(); repaint(); } } }); JButton start = new JButton("Start"); start.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { timer.start(); } }); JButton reset = new JButton("Reset"); reset.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { shapes = createShapeList(); timer.restart(); } }); JPanel panel = new JPanel(); panel.add(start); panel.add(reset); setLayout(new BorderLayout()); add(panel, BorderLayout.PAGE_START); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (Shape shape : shapes) { shape.drawShape(g); } } @Override public Dimension getPreferredSize() { return new Dimension(D_WIDTH, D_HEIGHT); } private List<Color> createColorList() { List<Color> list = new ArrayList<>(); list.add(Color.BLUE); list.add(Color.GREEN); list.add(Color.ORANGE); list.add(Color.MAGENTA); list.add(Color.CYAN); list.add(Color.PINK); return list; } private List<Shape> createShapeList() { List<Shape> list = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 20; i++) { int randXLoc = random.nextInt(D_WIDTH); int randomDelayedStart = random.nextInt(100); int colorIndex = random.nextInt(colors.size()); Color color = colors.get(colorIndex); list.add(new Shape(randXLoc, randomDelayedStart, color)); } return list; } class Shape { int randXLoc; int y = D_HEIGHT; int randomDelayedStart; boolean draw = false; boolean down = false; Color color; public Shape(int randXLoc, int randomDelayedStart, Color color) { this.randXLoc = randXLoc; this.randomDelayedStart = randomDelayedStart; this.color = color; } public void drawShape(Graphics g) { if (draw) { g.setColor(color); g.fillOval(randXLoc, y, 30, 30); } } public void move() { if (draw) { if (y <= 50) { down = true; } if (down) { y += INCREMENT; } else { y -= INCREMENT; } } } public void decreaseDelay() { if (randomDelayedStart <= 0) { draw = true; } else { randomDelayedStart -= 1; } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame(); frame.add(new RandomShape()); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } }