2012-11-27 1 views
7

저는 자바를 처음 접했습니다. 나는 게임을 만들고 싶다. 많은 연구 후, BufferStrategy가 어떻게 작동하는지 나는 ... 당신이 나중에 창에 투입 할 수있는 오프 스크린 이미지 오브젝트를 작성합니다 .. 나는 기본을 알고 .. 을 이해할 수없는 나는이버퍼 스 트래 티지 이해

public class Marco extends JFrame { 
    private static final long serialVersionUID = 1L; 
    BufferStrategy bs; //create an strategy for multi-buffering. 

    public Marco() { 
     basicFunctions(); //just the clasics setSize,setVisible,etc 
     createBufferStrategy(2);//jframe extends windows so i can call this method 
     bs = this.getBufferStrategy();//returns the buffer strategy used by this component 
    } 

    @Override 
    public void paint(Graphics g){ 
     g.drawString("My game",20,40);//some string that I don't know why it does not show 
     //guess is 'couse g2 overwrittes all the frame.. 
     Graphics2D g2=null;//create a child object of Graphics 
     try{ 
     g2 = (Graphics2D) bs.getDrawGraphics();//this new object g2,will get the 
     //buffer of this jframe? 
     drawWhatEver(g2);//whatever I draw in this method will show in jframe, 
     //but why?? 
     }finally{ 
     g2.dispose();//clean memory,but how? it cleans the buffer after 
     //being copied to the jframe?? when did I copy to the jframe?? 
     } 
     bs.show();//I never put anything on bs, so, why do I need to show its content?? 
     //I think it's a reference to g2, but when did I do this reference?? 
    } 

    private void drawWhatEver(Graphics2D g2){ 
     g2.fillRect(20, 50, 20, 20);//now.. this I can show.. 
    } 
    } 
있어

나는 잘 모르겠다. 나는 오랫동안 이것을 연구 해왔다. 운이 없다. 나는 모른다. 어쩌면 그것은 모두 거기 있고, 그것은 정말로 분명하고 단순하다. '.. 모든 도움

감사를보고 너무 멍청 해요 .. :)

다음

답변

18

는 작동 방법은 다음과 같습니다

,
  1. JFramecreateBufferStrategy(2);을 호출 할 때 BufferStrategy을 구성합니다. BufferStrategyJFrame의 해당 특정 인스턴스에 속한다는 것을 알고 있습니다. 검색하여 bs 필드에 저장하고 있습니다.
  2. 물건을 그릴 시간이되면 Graphics2Dbs에서 검색하고 있습니다. 이 Graphics2D 개체는 bs이 소유 한 내부 버퍼 중 하나에 연결됩니다. 그리면 모든 것이 버퍼에 저장됩니다.
  3. 마지막으로 bs.show()을 호출하면 bs은 방금 그려진 버퍼가 JFrame의 현재 버퍼가되도록합니다. 그것은 이것을 수행하는 방법을 알고 있습니다 (1 번 포인트를 참조하십시오) 어떤 서비스가 무엇인지 알기 때문입니다.

그게 전부입니다.

코드에 주석으로 ... 그리기 루틴을 약간 변경해야합니다. 대신이의 :

do { 
    try{ 
     g2 = (Graphics2D) bs.getDrawGraphics(); 
     drawWhatEver(g2); 
    } finally { 
      g2.dispose(); 
    } 
    bs.show(); 
} while (bs.contentsLost()); 

, the docs에 따라, 때때로 일어날 수있는 손실 버퍼 프레임에 대해 보호됩니다

try{ 
    g2 = (Graphics2D) bs.getDrawGraphics(); 
    drawWhatEver(g2); 
} finally { 
     g2.dispose(); 
} 
bs.show(); 

는이 같은 루프를 가져야한다.

+0

버퍼를 show()하기 전에 왜()를 처리해야합니까? 나는 그래픽 객체가 오직 그래픽 기능 만 가지고 있다고 가정하지만, 필요하지 않을 때 우리는 "툴과 리소스를 릴리스"하고 버퍼링 된 이미지를 보여주는 것보다? –

+1

@someFolk -이 순서대로 수행하지 않아도됩니다. 'bs.show()'에 대한 호출은'try' 블록 내에서 이동할 수 있습니다. 그러나 이렇게 할 특별한 이유가 없으며 필요하지 않은 즉시 시스템 리소스를 해제하는 것이 좋습니다. –