2014-02-18 3 views
3

У меня есть экран с шириной 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  
      } 

    }; 

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

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

+2

Resit с использованием различных таймеров, поддерживать один таймер, который просто обновляет состояние объектов в рамках модели. Случайное добавление новых объектов в список фигур на основе некоторых других требований вместо этого ... – MadProgrammer

+1

Чтобы лучше помочь, отправьте сообщение [MCTaRE] (http://stackoverflow.com/help/mcve) (минимальный полный протестированный и читаемый пример). –

+0

'и у меня есть вектор с кучей фигур' - Не используйте Vector. Вместо этого используйте 'ArrayList'. – camickr

ответ

13

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

См работоспособного пример ниже. Что я делаю, это передать radomDelayedStart в Shape. Каждый тик таймера, randomDelayedStart уменьшается до тех пор, пока он не достигнет 0, вот тогда флаг будет нарисован в поднятом. Большая часть логики находится в методах класса Shape, которые вызываются в Timer s Actionlistener. Все делается в одинTimer. Для восхождения я просто использовал жесткий код 50, но вы также можете пройти случайное восхождение к Shape. Дайте знать, если у вас появятся вопросы. Я попытался сделать код максимально понятным.

enter image description here

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

Хороший ответ. Красочный. –

+1

@peeskillet Как бы я использовал вашу функцию перемещения, чтобы объекты перемещались в произвольной дуге, а затем просто поднимались и опускались? – Thatdude1

+1

Я думаю, что это требует некоторой математики, которой я не очень хорош. Я уверен, что вы можете это сделать;) –

Смежные вопросы