2013-02-09 117 views
0

我已經開始用Java編寫一個小而簡單的引擎(用於遊戲)。當我重新繪製屏幕時,它有時會閃爍。我查了這個問題的答案,並且回答建議使用swing定時器(這正是我正在做的)。下面是代碼中的相關片段(我在一些添加註釋):(Java)屏幕閃爍

public class Game extends JPanel implements ActionListener { 
private static final long serialVersionUID = 1L; 

private static Window window; 
private static ObjectUpdater objects; 
private static Timer timer; 

private static boolean init = false; 


public Game(){ 
    timer = new Timer(30,this); 
    timer.start(); 
} 

public static void main (String[] self){ 
    new Game(); 
} 

private static void initialize(){ 
    //Tests 
    //Setting up the window 
    window = new Window(); 

    //Setting up the updater 
    objects = new ObjectUpdater(); 

    new Picture(Path.images+Path.img_black,10); 
    // These are just some objects for the game... 

    Entity r = new Entity(new Picture(Path.images+Path.img_lapras,0)); 
    r.setVelocity(0.5,0); 
    Entity r2 = new Entity(new Picture(Path.images+Path.img_lapras,1)); 
    Vector i = new Vector(0,0.5); 
    r2.setVelocity(i.values()[0],i.values()[1]); 
} 
// This is where repaint(); is called. 
public void actionPerformed(ActionEvent e) { 
    setDoubleBuffered(true); 
    if (init == false){ 
     initialize(); 
     init = true; 

    } 

    objects.update(); // This updates all the game object's information 
    window.update(); // This updates the window itself, it's literally: repaint(); 

} 
} 

這裏是window對象的代碼,因爲這是東西也發生。

public class Window extends JFrame{ 
private static final long serialVersionUID = 1L; 

public static int refresh_rate = 25; 
public static Picture[] image_list = new Picture[0]; // All the images I want to render 
private static String win_title = "Window"; // The name of the window 
private static int[] win_xy = {640,360}; // The size of the window 

public Window(){ 
    //initializes window 
    setTitle(win_title); 
    //setUndecorated(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setSize(win_xy[0],win_xy[1]); 
    setLocationRelativeTo(null); 
    setVisible(true); 
    setResizable(false); 

} 

public static int[] getWinSize(){ 
    return win_xy; 
} 

// Here I'm just "painting" everything in the image_list array... 
public void paint(Graphics g) { 
    super.paint(g); 
    Graphics2D g2d = (Graphics2D) g; 
    for (Picture i:image_list){ 
     g2d.drawImage(i.getPic(), i.getXY()[0], i.getXY()[1], null); 
    } 
    Toolkit.getDefaultToolkit().sync(); 
    g.dispose(); 
} 


public static void addPicture(Picture element){// This adds images to the image_list 
    Picture[] result = Arrays.copyOf(image_list, image_list.length +1); 
    result[image_list.length] = element; 
    image_list = result; 
    Arrays.sort(image_list); 

} 

public void update() { 
    repaint(); 

} 

} 

就是這樣......謝謝!

+3

在'Window'類的'paint'方法中調用'super.paint(g)'是閃爍的原因,此外,您應該重寫'paintComponent'而不是'paint'基於應用。 – 2013-02-09 14:32:49

+0

有什麼理由我應該使用'paintComponent'而不是'paint'?我的意思是更具體? – Linkxgl 2013-02-09 14:59:45

+0

檢查*** [this](http://stackoverflow.com/questions/9389187/difference-between-paint-paintcomponent-and-paintcomponents-in-swing)***頁面。 – 2013-02-09 15:05:25

回答

1

頂級包含(如JFrame)不是雙緩衝。這是我們不推薦從頂級容器延伸的原因之一。

相反,創建你自己(從JPanel例如)自定義組件,替代它的paintComponent方法(不要忘記調用super.paintComponent

退房

對於一些例子

+0

謝謝!我會投你一票,但我的名聲還不夠高...... – Linkxgl 2013-02-15 00:54:14

+0

如果你發現答案有用,你可以把它標記爲正確的(右邊的小勾),否則,當你有更多的時候記住我聲譽;) – MadProgrammer 2013-02-15 01:02:13