/ / Java Swing Timers - различни скорости - java, swing, timer

Java Swing Таймери с различни скорости - Java, swing, таймер

Аз правя 2D платформа в Java и използвамТаймер за завъртане, той е настроен на интервал от 5 милисекунди. Въпреки това, понякога е гладко движение с добра скорост, но след това случайно ще стане супер бързо и понякога супер бавно. Каква може да е причината за това?

Код:

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();
}

По принцип, функцията на цикъла решава дали характерът трябва да се движи или не и го премества, ако го направи.

Отговори:

0 за отговор № 1

Трудно е да се направи Java работа в реално времесистеми .... поради неизвестни фактори, като например, когато операционната система ще планира процеса ви да работи и GC. Тъй като се опитвате да актуализирате играта с 200 кадъра в секунда (ако моята математика е правилна), можете да опитате следния подход. За да направим играта по-гладка, ще се опитам да намеря времето между текущото събитие и последното събитие, сега теоретично това може да бъде 5ms, но понякога ще бъде 7ms (става супер бавно) и понякога ще бъде 3ms (става супер ). Тези, които имате време между двете събития бих изчислил къде трябва да бъде анимацията, така че ако времето е 3ms, анимацията ще бъде малко преди времето за 5ms. Да вземем прост пример, в който се опитвате да актуализирате позицията X на изображението 5 px на всеки 5ms.

//your current code
newX = X + 5px

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

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