2011-12-03 42 views
3

我正在用Java製作一個2D平臺,並且我使用了一個Swing定時器,它被設置爲5毫秒間隔。但是,有時它會以很快的速度平穩運動,但隨後它會變得超快速,有時甚至會超慢。這可能是什麼原因?Java Swing定時器的速度不同

代碼:

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

*「這可能是什麼原因?」*您選擇不包含的代碼?爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

非常抱歉,我的代碼只是一個簡單的搖擺計時器,我更新了我的第一篇文章 – Qasim

+1

我沒有建議你發佈'代碼',而是'SSCCE'。請閱讀鏈接,以免浪費你的時間,更重要的是,我的。 –

回答

0

很難使Java成爲實時系統......。因爲像操作系統將安排您的進程運行和GC一樣的未知因素。由於您試圖以200 fps更新遊戲(如果我的數學正確),您可能需要嘗試以下方法。爲了使遊戲更加流暢,我會嘗試找出當前事件被觸發和上一次被觸發事件之間的時間,現在理論上可能是5ms,但有時候會是7ms(超慢),有時候會是3ms(超快)。你有兩次事件之間的時間,我會計算動畫應該在哪裏,所以如果時間是3ms,那麼動畫會在5ms之前有點點。讓我們舉一個簡單的例子,你試圖每5ms更新一次圖像的X位置5px。

//your current code 
newX = X + 5px 

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

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