2012-08-05 55 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)来获得最准确的位置。