2012-11-27 12 views
7

私はJavaの新種です。私はゲームを作りたい。多くの研究の後、私はする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. createBufferStrategy(2);を呼び出すと、JFrameBufferStrategyを構成します。 BufferStrategyは、特定のインスタンスJFrameに属していることがわかります。検索してbsフィールドに格納しています。
  2. あなたのものを描くときは、Graphics2Dbsから検索しています。このGraphics2Dオブジェクトは、bsが所有する内部バッファの1つに結び付けられています。描画すると、すべてがそのバッファに入ります。
  3. 最後にbs.show()を呼び出すと、bsは、先ほど描画したバッファをJFrameの現在のバッファにします。それはどのように行うのかを知っています(ポイント1を参照)。

これがすべてです。

あなたのコードにコメントする...あなたの描画ルーチンを少し変更する必要があります。この代わりに:the docsによると、時折発生する可能性があり、失われたバッファ・フレーム、に対して保護されます

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

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

次のようなループを持っている必要があります。

+0

バッファをshow()する前に、なぜdispose()する必要がありますか?私は、グラフィックオブジェクトはグラフィックス機能しか持たないと仮定していますが、必要がないときは「ツールとリソースを解放してください」とバッファリングされたイメージを表示します。 –

+1

@someFolk - この順番で実行する必要はありません。 'bs.show()'への呼び出しを 'try'ブロックの中で移動することができます。しかし、特別な理由はありません。システムリソースが不要になるとすぐにシステムリソースを解放することをお勧めします。 –

関連する問題