2012-02-11 1 views
3

나의 순진함을 여기에서 처음으로 그리고 처음으로 자바 그래픽의 애니메이션을 다룬다. 나는 일종의 호 (2d 현명으로 궤도를 시뮬레이션하려는)를 따라 움직이는 별 모양의 애니메이션을 완성하려고합니다. 궤도 활동은 스타와 함께 움직이기 위해 타이머와 함께 사용됩니다.자바 그래픽을 사용하여 아크 경로를 따라 움직이는 모양

간단히 말해서, jpanel의 여러 위치에 여러 개의 별을 그렸습니다. 별 y 위치의 변환은 해당 별이 x 축에서 얼마나 떨어져 있는지에 따라 달라지며, 이는 300으로 초기화됩니다 (jpanel의 중심). 별이 감소 지점에 가까울수록 y 위치가 더 작아 질 것입니다. 별이 패널의 오른쪽에 닿거나 지나갈 때 (또는 보이지 않는 경우), 원래의 y 위치 (왼쪽)로 왼쪽으로 재설정합니다. 나는 별들이 무작위로 배치되기 때문에 이런 방식으로 선택했다. 나는 모든 별을 같은 dy로 시작할 수는 없다. 그렇다면 모든 별이 대신 자신의 원호를 따라 움직일 것이다.

그러나 이걸 실행하면 세 번째 패스 후에 모든 별의 x 위치가 더 작아집니다 (음수 범위와 보이지 않음). 원래 작업을 수행하는 더 좋은 방법에 대한 제안은 언제나 환영합니다. 감사.

private Action orbit = new AbstractAction() { 

    int declineAxis = 300; //if a stars top left x is greater than this, move downwards 
    double distFromDecline; 
    AffineTransform at = new AffineTransform(); 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     for (int i = 0; i < 12; i++) { 
      distFromDecline = Math.abs(declineAxis - stars.getStar(i).getBounds().getCenterX()); 
      if (distFromDecline <= 50) { 
       if (stars.getStar(i).getBounds().getX() < declineAxis) { 
        at.translate(5, -2); 
       } else { 
        at.translate(5, 2); 
       } 
      } else if (distFromDecline <= 100 && distFromDecline > 50) { 
       if (stars.getStar(i).getBounds().getX() < declineAxis) { 
        at.translate(5, -3); 
       } else { 
        at.translate(5, 3); 
       } 
      } else if (distFromDecline <= 200 && distFromDecline > 100) { 
       if (stars.getStar(i).getBounds().getX() < declineAxis) { 
        at.translate(5, -4); 
       } else { 
        at.translate(5, 4); 
       } 
      } else if (distFromDecline >200) { 
       if (stars.getStar(i).getBounds().getX() < declineAxis) { 
        at.translate(5, -5); 
       } else { 
        at.translate(5, 5); 
       } 
      } 
      stars.move(at, i); 
     } 
    } 
}; 
public class Stars { 

private int[] yOrigins; 
private Path2D[] stars; 
private Random rand = new Random(); 

public Stars(int n) { 
    stars = new Path2D[n]; 
    yOrigins = new int[n]; 
    int dx = 700/n; 
    int x = 0; 
    for (int i = 0; i < n; i++) { 
     int y = rand.nextInt(401); 
     generateStar(i, x, y); 
     yOrigins[i] = y; 
     x += dx; 
    } 
} 

private void generateStar(int i, int x, int y) { 
    stars[i] = new Path2D.Double(); 
    Path2D.Double cur = (Path2D.Double) stars[i]; 
    cur.moveTo(x, y); 
    cur.lineTo(cur.getCurrentPoint().getX() + 6, y - 2); 
    cur.lineTo(cur.getCurrentPoint().getX() + 2, cur.getCurrentPoint().getY() - 6); 
    cur.lineTo(cur.getCurrentPoint().getX() + 2, cur.getCurrentPoint().getY() + 6); 
    cur.lineTo(cur.getCurrentPoint().getX() + 6, cur.getCurrentPoint().getY() + 2); 
    cur.lineTo(cur.getCurrentPoint().getX() - 6, cur.getCurrentPoint().getY() + 2); 
    cur.lineTo(cur.getCurrentPoint().getX() - 2, cur.getCurrentPoint().getY() + 6); 
    cur.lineTo(cur.getCurrentPoint().getX() - 2, cur.getCurrentPoint().getY() - 6); 
    cur.closePath(); 
} 

public void paintStars(Graphics2D g) { 
    //super.paintComponent(g); 
    g.setColor(new Color(246, 246, 255)); 
    for (int i = 0; i < stars.length; i++) { 
     g.fill(stars[i]); 
    } 
} 

public Shape getStar(int i) { 
    return stars[i]; 
} 

void move(AffineTransform at, int i) { 
    stars[i] = (Path2D) stars[i].createTransformedShape(at); 
    System.out.println(i+": " + stars[i].getBounds()); 
    if(stars[i].getBounds().getX()>700){ 
     at.translate(-(stars[i].getBounds().x+stars[i].getBounds().getWidth()), yOrigins[i]); 
     stars[i] = (Path2D) at.createTransformedShape(stars[i]); 
    } 
} 

} 썬/오라클 Java2D에 데모에서

+0

에 오신 것을 환영합니다 SO 여기 FRM! 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

답변

3

java.awt.geom.FlatteningPathIterator 당신은 당신의 아크 (또는 다른 모양)를 통과하고 위치 스타로 포인트를 사용합니다.

당신이 사용할 수있는 별 http://java-sl.com/shapes.html

+0

링크가 [Archive.org] (https://web.archive.org/web/20131113102448/http://java-sl.com/tip_flatteningpathiterator_moving_shape.html)를 통해서만 제공 되더라도 매우 유용합니다. – mhvelplund