目前我在我的程序中雙緩衝(儘管你應該知道),我有一個存儲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);
}
}
使用雙緩衝。如果您無法爲您工作,請發佈您最佳嘗試的SSCCE。 – 2012-08-05 22:46:35
問題似乎出現在您的繪圖路由中,而這不屬於您所提交的代碼的一部分。還有你用什麼來畫畫? OpenGL,Swing,AWT? – Mene 2012-08-05 22:49:02
我會發布我的繪圖代碼... – 36redsoxfan 2012-08-05 22:50:19