Napisałem prosty program animacyjny Java w Ubuntu 14.4.1. Piłka poruszająca się wewnątrz JPanela. Ale na egzekucji piłka porusza się dość nerwowo w JPanelu. Ten problem trwa, dopóki nie przesunę myszki wewnątrz JPanel. W momencie poruszania myszą wewnątrz JPanel ruch kulki jest dość płynny. Należy powiedzieć, że uruchomiłem ten program w systemie Windows 10 i nie wystąpił problem. Kod mojego programu jest następujący:Programy do animacji Java pracujące w systemie Linux
import java.awt.*;
import javax.swing.*;
public class BouncingBall extends JPanel {
Ball ball = new Ball();
void startAnimation() {
while(true) {
try {
Thread.sleep(25);
ball.go();
repaint();
} catch(InterruptedException e) {}
} // end while(true)
} // end method startAnimation()
protected void paintComponent(Graphics g) {
super.paintComponent(g);
ball.draw(g);
} // end method paintComponent
// inner class Ball
class Ball {
int x;
int y;
int diameter = 10;
int xSpeed = 100;
int ySpeed = 70;
void go() {
x = x + (xSpeed*25)/1000;
y = y + (ySpeed*25)/1000;
int maxX = getWidth() - diameter;
int maxY = getHeight() - diameter;
if(x < 0) {
// bounce at the left side
x = 0;
xSpeed = -xSpeed;
} else if(x > maxX) {
// bounce at the right side
x = maxX;
xSpeed = -xSpeed;
} else if(y < 0) {
// bounce at the top side
y = 0;
ySpeed = -ySpeed;
} else if(y > maxY) {
// bounce at the bottom size
y = maxY;
ySpeed = -ySpeed;
} // end if-else block
} // end method go()
void draw(Graphics g) {
g.fillOval(x , y , diameter , diameter);
} // end method draw
} // end inner class Ball
public static void main(String[] args) {
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BouncingBall animation = new BouncingBall();
animation.setPreferredSize(new Dimension(500 , 500));
animation.setBackground(Color.white);
window.add(animation);
window.pack();
window.setVisible(true);
animation.startAnimation();
} // end method main
} // end class BouncingBall
Na czym polega problem? Czy muszę zmienić niektóre ustawienia w moim Ubuntu? Ja również umieścić jakiś kod testowy wewnątrz metody paintComponent następująco:
protected void paintComponent(Graphics g) {
System.out.println("paintComponent call number: " + counter);
++counter;
super.printComponent(g);
ball.draw(g);
}
o zmiennej licznika wartości początkowej 0 zadeklarowanej w klasie MovingBall. Zauważyłem, że liczba wywołań paintComponent na sekundę jest znacznie większa niż rzeczywista częstotliwość odświeżania JPanela, tak jak się wydaje.
println w ramach metody paintComponent spowolni działanie i może mieć zauważalny efekt. Będziesz chciał to stamtąd. –
Główny problem pojawił się przed dodaniem println. Deklaracja println jest tylko instrukcją testowania, aby dowiedzieć się więcej o tym problemie. – Hedayat
Chciałbym również uzyskać przyrosty w czasie rzeczywistym w ramach metody animacji i obliczyć najlepszą pozycję sprite'a na podstawie przyrostów w czasie rzeczywistym. W ten sposób piłka porusza się w tej samej odległości, jeśli animacja jest szybka lub wolna. –