/ / Java Swing Les minuteries vont à différentes vitesses - java, swing, timer

Java Swing Timers à différentes vitesses - java, swing, timer

Je réalise une plate-forme 2D en Java et je m’utiliseun minuteur Swing, il est réglé à un intervalle de 5 millisecondes. Cependant, parfois, il s’agit d’un mouvement fluide à une bonne vitesse, mais alors, au hasard, il deviendra très rapide et parfois très lent. Quelle pourrait en être la raison?

Code:

public Board() {
addKeyListener(new KeyListener());
setFocusable(true);
setBackground(new Color(204,250,255));

//draws the object off the screen in memory, then brings it in
setDoubleBuffered(true);

...(other code not relevant)...

timer = new Timer(5, this);
timer.start();
}

public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;

//draw platform
for(int i = 0; i < platform.length; i++) {
//g2d.setColor(new Color(0,0,0));
//g2d.drawRect(platform[i].getX(), platform[i].getY(), platform[i].getWidth(), platform[i].getHeight());
g2d.drawImage(platform[i].getImage(), platform[i].getX(), platform[i].getY(), this);
}

//draw guy
g2d.drawImage(guy.getImage(), guy.getX(), guy.getY(), this);

//destroy unneeded process
Toolkit.getDefaultToolkit().sync();
g.dispose();
}

Fondamentalement, la fonction cycle décide si le personnage doit ou non bouger et le déplace si c'est le cas.

Réponses:

0 pour la réponse № 1

Il est difficile de faire fonctionner Java en temps réelsystèmes…. en raison de facteurs inconnus, tels que le moment où le système d'exploitation planifie l'exécution de votre processus et de la GC. Puisque vous essayez de mettre à jour le jeu à 200 ips (si mes calculs sont corrects), vous voudrez peut-être essayer l’approche suivante. Pour rendre le jeu plus fluide, j'essayais de trouver le temps entre le dernier événement déclenché et le dernier événement déclenché. Théoriquement, cela pourrait être 5 ms, mais parfois ce sera 7 ms (très lent) et parfois 3 ms (très rapide) ). Si vous avez le temps entre les deux événements, je calculerais où l'animation devrait être, donc si le temps est de 3ms, l'animation sera un peu avant le temps de 5ms. Prenons un exemple simple où vous essayez de mettre à jour la position X d’une image de 5 px toutes les 5ms.

//your current code
newX = X + 5px

//new code
//this wont always be 5ms
timeDiff = currentEventTime – lastEventTime;

newX = X + 5px (timeDiff/5ms)