Objekte und Timer verschieben

Ich habe einen Bildschirm mit 500 Breite und 400 Höhe, und ich habe einen Vektor mit einer Reihe von Formen. Nehmen wir an, der Vektor hat zum Beispiel 2 verschiedene Formen. Ich möchte, dass das Objekt zufällig vom unteren Bildschirmrand auftaucht und einen bestimmten Aufstieg erreicht, um dann wieder herunterzufallen (ähnlich dem Spielfruchtninja, wo die Früchte meine Formen sind).

In meiner Hauptansicht habe ich einen Vektor von Formen, von denen ich die Timer instanziiere, zu Array hinzufüge und sie mit der Übersetzungsfunktion in den unteren Bildschirmbereich lege. Mein Timer nimmt einen Action-Listener auf, der die Übersetzung der Form grundsätzlich so verändert, dass sie sich bis zum Aufstieg und dann nach unten bewegt, aber mein Problem ist, dass alle Formen gleichzeitig beginnen.

Etwas wie das:

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

und meine Aktion Listener:

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

Ich laufe auf Probleme, dass alle Formen den gleichen Timer folgen, und beginnen, zur gleichen Zeit (keine Verzögerung) aufzutauchen …

Irgendwelche Vorschläge, wie man dies vermeidet oder wenn es einen anderen Ansatz gibt, den ich versuchen sollte

   

“Ich möchte, dass das Objekt zufällig vom unteren Bildschirmrand auftaucht und einen bestimmten Aufstieg erreicht und dann wieder herunterfällt.”

Siehe das ausführbare Beispiel unten. Was ich tue, ist ein radomDelayedStart an die Shape . Bei jedem Tick des Timers wird der randomDelayedStart bis zum Erreichen von 0 verringert, randomDelayedStart wenn das Flag gezogen wird. Der Großteil der Logik befindet sich in den Shape classnmethoden, die im Actionlistener des Timer Actionlistener . Alles ist in einem Timer erledigt. Für den Aufstieg habe ich nur eine hart codierte 50 verwendet, aber Sie können auch einen zufälligen Aufstieg zur Shape passieren. Lass es mich wissen, wenn du irgendwelche Fragen hast. Ich habe versucht, den Code so klar wie möglich zu machen.

Bildbeschreibung hier eingeben

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