2012-05-08 26 views
5

Vì vậy, trong trò chơi tôi đang làm việc trên, tôi có một viên đá cẩm thạch theo con chuột, nhưng khi nó làm điều này màn hình nhấp nháy.Làm thế nào để bạn đệm đôi trong java cho một trò chơi?

Nền bao gồm hai hình chữ nhật và 9 hình chữ nhật. Làm thế nào tôi sẽ đi về đệm đôi này? Đây là mã cho cửa sổ chính.

/** 
* Write a description of class Window here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class Window extends JApplet implements MouseMotionListener 
{ 
    private BufferedImage image; 
    private BufferedImage side; 
    private int mouseX; 
    private int mouseY; 

    public Window(){ 
     try { 
      image = ImageIO.read(new File("Backgrounds/violet.jpg")); 
      side = ImageIO.read(new File("Backgrounds/side margin.jpg")); 
     } catch (IOException ex) { }  
    } 

    private void delay(int delay) 
    { 
     try { 
      Thread.sleep(delay); 
     } catch (InterruptedException e) {} 
    } 

    public void init() 
    { 
     this.addMouseMotionListener(this); 
    } 

    public void paint (Graphics page) 
    { 
     page.drawImage(image, 0, 0, null); 
     page.setColor(Color.blue); 
     page.fillRect(0, 0, 160, 160); 
     page.setColor(Color.black); 
     page.fillRect(15, 15, 130, 130); 
     page.setColor(Color.green); 
     page.fillRect(340, 0, 160, 160); 
     page.setColor(Color.black); 
     page.fillRect(355, 15, 130, 130); 
     page.setColor(Color.yellow); 
     page.fillRect(0, 340, 160, 160); 
     page.setColor(Color.black); 
     page.fillRect(15, 355, 130, 130); 
     page.setColor(Color.red); 
     page.fillRect(340, 340, 160, 160); 
     page.setColor(Color.black); 
     page.fillRect(355, 355, 130, 130); 
     page.drawImage(side, 500, 0, null); 
     page.drawString(Score.getScore(), 560, 110); 
     //conveyors 
     page.setColor(Color.gray); 
     page.fillRect(235, 0, 30, 160); 

     //marble 
     delay(100); 

     page.fillOval(mouseX, mouseY , 40, 40);   
    } 

    public void mouseMoved(MouseEvent e) 
    { 
     mouseX = e.getX(); 
     mouseY = e.getY(); 
     repaint(); 
    } 

    public void mouseDragged(MouseEvent e) 
    { 

    } 
} 

Trả lời

16

Đệm đôi là khái niệm khá đơn giản, thay vì vẽ từng đối tượng, bạn vẽ chúng lên một ảnh và sau đó yêu cầu trình kết xuất vẽ toàn bộ hình ảnh đó. Điều này giúp loại bỏ sự nhấp nháy.

Dưới đây là một ví dụ về cách bạn có thể làm điều này (source)

class DoubleBufferedCanvas extends Canvas { 

    public void update(Graphics g) { 
    Graphics offgc; 
    Image offscreen = null; 
    Dimension d = size(); 

    // create the offscreen buffer and associated Graphics 
    offscreen = createImage(d.width, d.height); 
    offgc = offscreen.getGraphics(); 
    // clear the exposed area 
    offgc.setColor(getBackground()); 
    offgc.fillRect(0, 0, d.width, d.height); 
    offgc.setColor(getForeground()); 
    // do normal redraw 
    paint(offgc); 
    // transfer offscreen to window 
    g.drawImage(offscreen, 0, 0, this); 
    } 
} 

Nowdays, bạn không cần phải thực hiện điều này bản thân, bạn có thể sử dụng BufferStrategy và các lớp releated. Xem câu trả lời của lakam99 cho một ví dụ về điều đó.

+0

cảm ơn rất nhiều :) –

+0

câu trả lời hay, nhưng bạn không cần phải làm điều này vì Swing đã cung cấp đệm đôi. Xem câu trả lời của tôi để biết chi tiết .... – mikera

+0

@dfb Sau khi bạn vẽ (offgc); ' làm thế nào để hình ảnh offscreen được cập nhật? Tôi không thấy biến màn hình bị thay đổi ở bất cứ đâu. –

1

Tôi nghĩ rằng sự cố của bạn không phải là bộ đệm kép. Bạn phải thêm super.paint(page); vào dòng đầu tiên của phương thức vẽ.

2

Swing hỗ trợ tự động đệm đôi, vì vậy bạn không cần phải mã hóa bất kỳ thứ gì.

Chỉ cần gọi setDoubleBuffered(true) trên thành phần cấp cao nhất của bạn (thường là JPanel) và tất cả sẽ hoạt động.

Xem: setDoubleBuffered

2

Một giải pháp khác là sử dụng thư viện sẽ tăng gấp đôi bộ đệm cho bạn. Vì bạn đang sử dụng Java2D, tôi giả sử bạn muốn giữ mọi thứ khá nhẹ và thấp hơn. Tôi nghĩ Slick2D thực hiện một công việc tuyệt vời là cung cấp các chức năng vẽ và nhập 2d đơn giản mà không bị cản trở. Nó giống như một phiên bản Java2D thanh lịch hơn, nhưng được viết trên OpenGL. Một khi bạn thực hiện một vài ứng dụng với Java thuần túy, tôi nghĩ chuyển sang Slick2D là một ý tưởng tuyệt vời. Đây không phải là giải pháp trực tiếp cho vấn đề của bạn, nhưng vì nó đã được giải quyết, tôi nghĩ Id cung cấp một số lời khuyên giúp cuộc sống phát triển trò chơi Java của bạn dễ dàng hơn. Hãy khám phá nếu bạn có cơ hội http://slick.cokeandcode.com/

Các vấn đề liên quan