2012-05-08 2 views
5

그래서 내가하고있는 게임에서 마우스를 따라 대리석을 가지고 있습니다.하지만 이렇게하면 화면이 깜박입니다.게임에서 자바에서 어떻게 이중 버퍼링합니까?

배경에는 2 개의 jpeg와 9 개의 직사각형이 있습니다. 어떻게하면 이중 버퍼링을 할 수 있습니까? 다음은 메인 윈도우의 코드입니다.

/** 
* 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) 
    { 

    } 
} 

답변

16

더블 버퍼링이 아닌 하나 하나의 오브젝트를 그리는, 개념적으로 매우 간단하다, 당신은 이미지를 그려 그 전체 이미지를 그릴 렌더러를 말한다. 이렇게하면 깜박임이 사라집니다.

여기이 (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을 수행하는 방법의 예를 들어, 당신은 당신이 BufferStrategy가와 releated 클래스를 사용할 수 있습니다, 자신이 구현할 필요가 없습니다. 그 예를 들어 lakam99의 답변을 참조하십시오.

+0

고마워요 :) –

+0

좋은 답변이지만, 스윙은 이미 더블 버퍼링을 제공하므로 이것을 할 필요가 없습니다. 자세한 내용은 내 대답을 참조하십시오 .... – mikera

+0

@ dfb '페인트 (offgc); 이미지 오프 스크린은 어떻게 업데이트 되나요? 변수가 화면 밖으로 변경되는 것을 볼 수 없습니다. –

1

당신의 문제는 이중 버퍼링이 아니라고 생각합니다. 페인트 방법의 첫 번째 줄에 super.paint(page);을 추가해야합니다.

2

스윙은 자동으로 이중 버퍼링을 지원하므로 아무 것도 코딩 할 필요가 없습니다.

최상위 구성 요소 (일반적으로 JPanel)에서 setDoubleBuffered(true)으로 전화하면 모든 것이 작동합니다.

참조 : setDoubleBuffered

2

또 다른 해결책은 당신을 위해 버퍼를 두 배로 라이브러리를 사용하는 것입니다. Java2D를 사용하고 있기 때문에 모든 것을 꽤 가볍고 낮은 수준으로 유지하려고한다고 가정합니다. 나는 Slick2D가 당신의 길을 가지지 않고 단순한 2D 드로잉과 입력 기능을 제공하는 훌륭한 일을한다고 생각한다. 자바2D의 더 우아한 버전처럼 느껴지지만 OpenGL로 작성되었습니다. 순수 Java로 몇 가지 애플리케이션을 만들면 Slick2D로 옮겨가는 것이 대단한 아이디어라고 생각합니다. 이것은 당신의 문제에 대한 직접적인 해결책은 아니지만, 이미 해결 되었기 때문에 ID가 당신의 Java 게임 개발을 더 쉽게 할 수 있도록 조언을 줄 것이라고 생각했습니다. 당신이 기회가 있다면 그것을 확인하십시오 http://slick.cokeandcode.com/