2014-02-18 1 views
3

나는 500 개의 너비와 400 개의 높이를 가진 스크린을 가지고 있으며, 나는 모양이 많은 벡터를 가지고있다. 예를 들어 벡터에 2 가지 모양이 있다고 가정 해 봅시다. 나는 화면의 바닥에서 무작위로 튀어 나오게하는 물체가 특정 오르막에 이르렀다가 다시 떨어지는 것을 원한다. (게임 과일 닌자와 마찬가지로, 과일은 내 모양이다.)움직이는 객체와 타이머

내 주요 (보기) 나는 타이머를 인스턴스화하는 도형의 벡터를 가지고 있습니다. 배열에 추가하고 translate 함수를 사용하여 화면의 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

'와 나는 모양이 많은 벡터를 가지고있다. '- 벡터를 사용하지 마라. 대신에'ArrayList'를 사용하십시오. – camickr

답변

13

아래의 실행 가능한 예제를 참조하십시오 "나는 개체가 임의로 특정 상승에 도달 화면 하단에서 팝업 다음 아래로 후퇴 할". 내가하는 일은 radomDelayedStartShape으로 전달하는 것입니다. 타이머의 모든 틱, randomDelayedStart은 0에 도달 할 때까지 감소합니다. 그 때 그려지는 플래그가 그려집니다. 대부분의 로직은 클래스 메서드에 있으며 에서 호출됩니다. 모든 것은 하나에서 이루어집니다.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

나는 그것이 좋지 않은 수학이 필요하다고 생각합니다. 나는 당신이 그것을 할 수 있다고 확신한다;) –