Перемещение объектов и таймеров

У меня есть экран с 500 шириной и 400 высотой, и у меня есть вектор с кучей фигур. пусть, например, вектор имеет две разные формы. Я хочу, чтобы объект случайно всплывал из нижней части экрана, достигая определенного восхождения, а затем падаю вниз (подобно игровому фруктовому ниндзя, где плоды – мои фигуры).

В моем главном (представлении) у меня есть вектор форм, из которых я создаю таймеры, добавляю к массиву и помещаю их в buttom экрана, используя функцию перевода. Мой таймер принимает прослушиватель действий, который в основном меняет перевод фигуры, чтобы двигаться вверх до восхождения, а затем вниз, но моя проблема в том, что все фигуры начинаются в то же время независимо.

Что-то вроде этого:

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 } }; 

У меня проблемы с тем, что все фигуры следуют одному и тому же таймеру и начинают всплывать одновременно (без задержки) …

Любые предложения о том, как избежать этого или если есть другой подход, я должен попробовать

«Я хочу, чтобы объект случайно выскочил со дна экрана, достиг определенного подъема, а затем упал обратно»,

См. Приведенный ниже пример. То, что я делаю, это передать radomDelayedStart в Shape . Каждый тик таймера, randomDelayedStart уменьшается до тех randomDelayedStart пока он не достигнет 0, вот когда флаг будет поднят в поднятом. Большая часть логики находится в методах classа Shape , которые Actionlistener Timer . Все делается за один 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 shapes; private List 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 createColorList() { List 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 createShapeList() { List 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); } }); } } 
  • System.Timers.Timer / Threading.Timer vs Thread with WhileLoop + Thread.Sleep для периодических задач
  • Как использовать class .NET Timer для запуска события в определенное время?
  • Как измерить, как долго работает функция?
  • Как написать таймер в Objective-C?
  • Как установить таймер в Java?
  • Являются ли таймеры и петли в .Net точными?
  • Timer & TimerTask против темы + спать в Java
  • Таймер, события и garbage collection: я что-то упускаю?
  • Как запустить метод каждые X секунд
  • java: запустить функцию через определенное количество секунд
  • C ++, получение миллисекундного времени на Linux - clock (), похоже, не работает должным образом
  • Давайте будем гением компьютера.