1. ホーム
  2. ジャワ

[解決済み] BufferStrategyを理解する

2022-03-03 13:50:56

質問

私は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..
   }
  }

どうしたものか... ずっと勉強してきたんだけど...全然ダメで... もしかしたら、全てはそこにあって、本当に明確でシンプルなのですが、私があまりにも愚かで、それに気づかないだけなのかもしれません......。

いろいろとありがとうございました... :)

解決方法は?

その仕組みはこうです。

  1. JFrame を構築します。 BufferStrategy を呼び出すと createBufferStrategy(2); . その BufferStrategy の特定のインスタンスに属していることを知っています。 JFrame . あなたはそれを取得して bs フィールドを使用します。
  2. いざ、自分のものを描こうとすると、取得するのは Graphics2D から bs . これは Graphics2D オブジェクトが所有する内部バッファの 1 つに関連付けられます。 bs . 描画すると、すべてがそのバッファに入ります。
  3. を最終的に呼び出すと bs.show() , bs のカレントバッファになります。 JFrame . この方法を知っているのは、(ポイント 1 を参照) JFrame へのサービスである。

それだけなんです。

あなたのコードへのコメントですが、描画ルーチンを少し変更したほうがいいでしょう。この代わりに

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

のようなループになるはずです。

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

これにより、バッファーフレームの損失から保護されます。 ドキュメント が、時折発生することがあります。