5.ダブルバッファリング

5.1ダブルバッファリングについて

アニメーションのちらつきをなくす方法。 表の画面と裏の画面を用意して表の画面をスクリーンイメージとする。 裏の画面にはじめの絵を描画し、表の画面に切り替える。 その間に裏の画面に次のイメージを描画する。このような処理をダブルバッファリングという。 以下に図を示す。


5.2 ダブルバッファリングの使い方
 SAnimationをダブルバッファリングにするために必要な処理を追加する。
1.まず最初に裏画面とそこに描画するためのGraphicsオブジェクトを保持するためのインスタンス変数を生成する。
  public class Simple extends Applet implements Runnable {
      Image ura_im;      
      Graphics ura_g;    
  }
2.init()の中でImage型とGraphics型のオブジェクトを生成し、create()メソッドによってImageのインスタンスを生成する。   また、Graphicsオブジェクトを取得するためにgetGraphics()メソッドを呼び出す。
 public class Simple extends Applet implements Runnable {
      Image ura_im;      
      Graphics ura_g;   

     public void init() {
   
          if (ura_g == null)
          {
           ura_im = this.createImage(150,250);  
           ura_g = ura_im.getGraphics();          
          } 
    }
 }
3.裏画面に描画させるために、ura_g.drawImage()を用いて、paint()メソッドで裏画面を表画面に描き出す。
 public class Simple extends Applet implements Runnable {
      Image ura_im;      
      Graphics ura_g;   

     public void init() {
          if (ura_g == null)
          {
           ura_im = this.createImage(150,250);  
           ura_g = ura_im.getGraphics();          
          } 
     }

       ・・・・・・・

     public void paint (Graphics g) {
          ura_g.setColor(getBackground());
          ura_g.fillRect(0,0,150,250);
          ura_g.drawImage(images[current],0,0,this);     //(0,0)の位置から描画を行う  
          g. drawImage(ura_im, 0, 0, this);        //表画面に描画を行う
       }
 }
4.update()をオーバーライドして画面を消さないようにする。
 public class Simple extends Applet implements Runnable {
      Image ura_im;      
      Graphics ura_g;   

     public void init() {
          if (ura_g == null)
          {
           ura_im = this.createImage(150,250);  
           ura_g = ura_im.getGraphics();          
          } 
     }

       ・・・・・・・

     public void paint (Graphics g) {
          ura_g.setColor(getBackground());
          ura_g.fillRect(0,0,150,250);
          ura_g.drawImage(images[current],0,0,this);      
          g. drawImage(ura_im, 0, 0, this);       
       }

         public void update (Graphics g) {
            paint(g);
         }
 }

次のページ      ホームに戻る