나의 순진함을 여기에서 처음으로 그리고 처음으로 자바 그래픽의 애니메이션을 다룬다. 나는 일종의 호 (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에 데모에서
에 오신 것을 환영합니다 SO 여기 FRM! 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –