2012-08-05 100 views
3

目前我在我的程序中雙緩衝(儘管你應該知道),我有一個存儲BufferedImages和整數的數組列表。目前我的整個屏幕上移動整個陣列列表的代碼是:Java平滑ArrayList運動

public static void MoveMap(final double ammount){ 
    Thread t = new Thread(){ 
     public void run(){ 
      for(int i = 0; i < TileHelper.MAIN_LIST.size();i++){ 
        TileHelper.MAIN_LIST.get(i).changeX(ammount*DATA.speed); 
      } 
     } 
    }; 
    t.start(); 
} 

這樣做可以完成工作,但看起來並不平滑。即使我使用了一個像.25這樣的數字作爲變量(我剛注意到我在我的代碼中拼寫錯了:O)如果我在這個數組中有所有的圖像,我該如何做出很好的平滑移動?順便說一句如果你想知道什麼不順利,這是事實,這是滯後的,每個圖像之間你看到一個巨大的空白。任何幫助都是有利的......謝謝!

渲染代碼:

public class Main extends JFrame { 
public static int worldsize = 1080; 
private static final long serialVersionUID = 6149918602875295087L; 
public static void main(String args[]){ 
    new Main(); 
} 
TileHelper tiles = new TileHelper(TileHelper.MAIN_LIST); 
public Main(){ 

    DATA_IMAGES.initImages(); 

    addDefaultBlocks(); 
    setSize(640,480); 
    setResizable(false); 
    setTitle("Stranded"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 

    setVisible(true); 

    createBufferStrategy(2); 
    GameLoop(); 
    addKeyListener(new KeyListener() { 
     public void keyTyped(KeyEvent e) { 

     } 

     public void keyReleased(KeyEvent e) { 

     } 

     public void keyPressed(KeyEvent e) { 
      int key = e.getKeyCode(); 


      switch(key){ 
      case KeyEvent.VK_LEFT: 
       Movement.MoveMap(3.25); 
       break; 
      case KeyEvent.VK_RIGHT: 
       Movement.MoveMap(-3.25); 
       break; 
      case KeyEvent.VK_UP: 
       DATA.speed++; 
       break; 
      case KeyEvent.VK_DOWN: 
       DATA.speed--; 
       break; 
      case KeyEvent.VK_SPACE: 
       System.out.println(DATA.speed); 
       break; 
      } 
     } 
    }); 
} 
private void addDefaultBlocks() { 
    for(int x = -1000/32; x < worldsize/32; x++){ 
     for (int y = -1000/32; y < worldsize/32; y++){ 
      TileHelper.addBlock(DATA_IMAGES.GRASS, x*32, y*32); 
     } 
    } 
} 
public void GameLoop(){ 
    Thread gameloop = new Thread(){ 
     public void run(){ 
      while(true){ 
       RenderInit(); 
       try { 
        Thread.sleep(30); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    gameloop.start(); 
} 
public void RenderInit(){ 
    BufferStrategy buff = getBufferStrategy(); 
    Graphics g = buff.getDrawGraphics(); 

    g.clearRect(0, 0, getWidth(), getHeight()); 

    Render(g); 

    g.dispose(); 
    buff.show(); 
    Toolkit.getDefaultToolkit().sync(); 
} 
public void Render(Graphics g){ 
    tiles.RenderAll(g); 
} 

}

+0

使用雙緩衝。如果您無法爲您工作,請發佈您最佳嘗試的SSCCE。 – 2012-08-05 22:46:35

+0

問題似乎出現在您的繪圖路由中,而這不屬於您所提交的代碼的一部分。還有你用什麼來畫畫? OpenGL,Swing,AWT? – Mene 2012-08-05 22:49:02

+0

我會發布我的繪圖代碼... – 36redsoxfan 2012-08-05 22:50:19

回答

2

我假設你正在試圖做的sidescroller遊戲,我得到這個工作的方式是使在遊戲中的所有對象,一個精靈。

我創建了一個Sprite類,它包含x,y,xvelocity,yvelocity屬性以及getter和setter。當我想要滾動時,我要麼將速度臨時設置爲相反方向,要麼移動x值。

另一種方法是保存每個精靈中存儲的原始x和y值,並且在繪製到屏幕時,我有一個名爲「offSetX」的變量,該變量被精靈的原始位置添加或減去以獲得統一的移動在屏幕上的所有精靈之間。

如果這不是你要找的,我會刪除它。 :)

注意: 我最近修改了舊的sidescroller遊戲引擎,發現最後一個方法是最好的方法,而不是修改精靈列表中的所有x位置。我的offSetX變量是一個浮點值,當繪製到屏幕時,我使用Math.round(sprite.getX()+ offSetX)來獲得最準確的位置。