Witam. Muszę stworzyć animowany model wszechświata w javie. Mam już planety, ruch itd, wszystko gra i buczy, ale mam jeden mały problem. Otóż muszę wyrysować orbity planet i sprawić by znikały one po naciśnięciu klawisza F3 i były "zniknięte" tak długo jak trzymam klawisz.
Orbity narysowałam metodą g2.drawOval, ale nie mam pojęcia w jaki sposób mogłabym się ich elegancko pozbyć. Czy jest jakiś sposób, żeby dany kształt/daną linię uczynić niewidzialnym/ą?
Myślałam też żeby przez naciśnięcie F3 zmienić kolor okręgu na czarny i zleje on się wtedy z tłem, lecz nie wiem jak mogę ingerować w g2.setColor(Color.WHITE); by z white zrobić black.
Kod pozwoliłam sobie trochę poobcinać, bo był dosyć długi.
public class Animation extends JPanel implements Runnable, KeyListener{
private static final long serialVersionUID = 1L;
private Image sun, merkury, wenus, ziemia, mars;
private Thread animThreat;
private int x,x1, y,y1, r, r1, r2, r3, wysokosc, szerokosc, wysokoscMerkury, szerokoscMerkury, wysokoscWenus, szerokoscWenus, wysokoscMars, szerokoscMars;
private double kat;
private final int refreshRate = 20;
private boolean isPaused = false;
public Animation() {
...
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.WHITE);
g2.drawImage(merkury, (int) (x1 + r * 0.3871 * Math.cos(kat/0.2408)), (int) (y1 + r * 0.3871 * Math.sin(kat/0.2408)), wysokoscMerkury, szerokoscMerkury, this); //merkury
g2.drawOval((int) (x1-r*0.3871+15), (int) (y1-r*0.3871+15), 2*r1, 2*r1);
g2.drawImage(wenus, (int) (x1 + r * 0.7233 * Math.cos(-kat/0.6152)), (int) (y1 + r * 0.7233 * Math.sin(-kat / 0.6152)), wysokoscWenus, szerokoscWenus, this); //wenus
g2.drawOval((int) (x1-r*0.7233+15), (int) (y1-r*0.7233+15), 2*r2, 2*r2);
g2.drawImage(ziemia, (int) (x1 + r * Math.cos(kat)), (int) (y1 + r * Math.sin(kat)), wysokosc, szerokosc, this); //ziemia
g2.drawOval(x1-r+15, y1-r+15, 2*r, 2*r);
g2.drawImage(mars, (int) (x1 + r * 1.5237 * Math.cos(kat/1.8808)), (int) (y1 + r * 1.5237 * Math.sin(kat / 1.8808)), wysokoscMars, szerokoscMars,this); //mars
g2.drawOval((int) (x1-r*1.5237+15), (int) (y1-r*1.5237+15), 2*r3, 2*r3);
g2.drawImage(sun, x, y, wysokosc, szerokosc,this); //slonce
g.dispose();
}
public void movement() {
kat += 0.02;
if (kat > 360) {
kat = 0;
}
}
public void run() {
long beforeTime, timeDiff, sleep;
beforeTime = System.currentTimeMillis();
while (true) {
while (isPaused)
{
try {
Thread.sleep(200);
} catch (InterruptedException e) {
System.out.println("interrupted");
}
}
movement();
repaint();
timeDiff = System.currentTimeMillis() - beforeTime;
sleep = refreshRate - timeDiff;
...
beforeTime = System.currentTimeMillis();
}
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_SPACE) {
isPaused = !isPaused;
}
else if (key == KeyEvent.VK_F1) {
kat += 0.1;
}
else if (key == KeyEvent.VK_F2) {
kat += 0.00000000001;
}
else if (key == KeyEvent.VK_F3) {
???
}
else if (key == KeyEvent.VK_LEFT) {
x = x-2;
}
else if (key == KeyEvent.VK_RIGHT) {
x = x+2;
}
else if (key == KeyEvent.VK_UP) {
y = y-2;
}
else if (key == KeyEvent.VK_DOWN) {
y = y+2;
}
}
...
}