Ok ich habe jetzt mal eine kleine Test-Version geschrieben, allerdings ist die Animation noch nicht flüssig, wenn ich Thread.sleep(50) setze.
Würde ich jetzt zum Beispiel Thread.sleep(5) setzen, läuft alles flüssig nur der CPU geht dann weit hoch.
1.Wie kann also die Animation bei sagen wir mal Thread.sleep(50) flüssig laufen?
2.Wie kann man den Speed der Animation exponentiell ändern, sodass es auch auf mehreren PCs gleich schnell läuft?
Ich denke mal nicht, dass man den Speed nach jeder Loop ändern kann, da die Animation ja dann durch eine rechenintensiven doLogic() Methode bei verschiedenen Rechnern
unterschiedlich schnell aufgeführt wird.
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class TestAnimation implements ActionListener {
private JFrame window;
private Animation animation;
private ComponentOne compOne;
private ComponentTwo compTwo;
private AtomicBoolean doAnimation;
public TestAnimation() {
doAnimation = new AtomicBoolean(false);
animation = new Animation();
animation.start();
compOne = new ComponentOne();
compTwo = new ComponentTwo();
window = new JFrame();
window.setSize(500, 300);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setLayout(null);
compOne.setBounds(0, 0, 500, 300);
compTwo.setBounds(500, 0, 500, 300);
window.add(compOne);
window.add(compTwo);
window.setVisible(true);
}
public static void main(String[] args) {
new TestAnimation();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
if (e.getActionCommand().equals("Do Animation")) {
animation.setAnimationLeftToRight();
} else {
animation.setAnimationRightToLeft();
}
doAnimation.set(true);
}
private class ComponentOne extends JComponent {
double animationX = 0;
public ComponentOne() {
createButton("Do Animation", Color.WHITE, Color.BLACK, this);
}
public void paintComponent(Graphics g) {
g.setColor(new Color(0, 0, 0));
g.fillRect(0, 0, getWidth(), getHeight());
}
}
private class ComponentTwo extends JComponent {
double animationX = 0;
public ComponentTwo() {
createButton("Do Animation2", Color.BLACK, Color.WHITE, this);
}
public void paintComponent(Graphics g) {
g.setColor(new Color(255, 255, 255));
g.fillRect(0, 0, getWidth(), getHeight());
}
}
public void createButton(String text, Color bg, Color fg, JComponent component) {
JButton button = new JButton(text);
button.setBackground(bg);
button.setForeground(fg);
button.setFont(new Font("Arial", Font.BOLD, 17));
button.setBounds(150, 100, 200, 50);
button.addActionListener(this);
component.add(button);
}
private class Animation extends Thread {
private boolean leftToRight = true;
private int speed = 100;
public void run() {
long previousUpdate = System.nanoTime();
while (true) {
long currentTime = System.nanoTime();
long passedTime = currentTime - previousUpdate;
double currentPassedTime = (double) (passedTime * 1e-9);
if (doAnimation.get()) {
doLogic(currentPassedTime);
updateGUI();
}
previousUpdate = System.nanoTime();
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
Logger.getLogger(TestAnimation.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void doLogic(double passedTime) {
if(leftToRight) {
compOne.animationX -= (speed*passedTime);
compTwo.animationX -= (speed*passedTime);
if(compTwo.animationX <= -500) {
compTwo.animationX = -500;
compOne.animationX = -500;
doAnimation.set(false);
}
} else {
compOne.animationX += (speed*passedTime);
compTwo.animationX += (speed*passedTime);
if(compOne.animationX >= 0) {
compOne.animationX = 0;
compOne.animationX = 0;
doAnimation.set(false);
}
}
}
private void updateGUI() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
compOne.setLocation(0 + (int)compOne.animationX, 0);
compTwo.setLocation(500 + (int)compTwo.animationX, 0);
window.repaint();
}
});
}
public void setAnimationLeftToRight() {
leftToRight = true;
}
public void setAnimationRightToLeft() {
leftToRight = false;
}
}
}```