「ちらつき」を無くす-2

Sprite を切り替える の演習「タイマ設定でアニメーション」のプログラムが完成したでしょうか。
実行すれば解るのですが、時々「画面がチラツク」でしょう。 (^_^;)
これではせっかくのアニメーションも台無しです。
「ちらつき」を無くす-1 では「OnPaintBackground() をオーバーライド」したのですが、 背景描画のメソッドをパスする方法もあります。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 空のプロジェクトを作成して、ソースプログラムをプロジェクトに追加して下さい。
    今回のプログラムは、以下の説明を元に各自で作成して下さい。
  2. 大きな画像から Sprite を切り出して、タイマの設定で Sprite を切り替えます。
    このようなプログラムでは MyHandler() で毎回ファイルからイメージをロードするのでは如何にも無駄です。 (^_^;)
    そこで最初に一度だけ画像をロードして、描画の準備を整えます。
    前回は MyForm() の Constructor で画像をロードしたのですが、スマートな方法とは言えませんでした。
    今回は Main() メソッドの最初で画像をロードして下さい。
    bmp の宣言に注目して下さい。
    Main() とは Class が異なるので public で宣言します。
    また Main() が static なので bmp も static で宣言して下さい。
        public  static Bitmap  bmp;
    
        public static void Main()
        {
            // Load Image
            try
            {
                 MyForm.bmp= new Bitmap("c:\\data\\test\\girl.gif");
            }
            catch
            {   MessageBox.Show("イメージが取得できません", "Error");
                return;
            }
        
  3. Sprite を描画するメソッドは Frame Class の OnPaint() をオーバーライドします。
    今回は画像のロードに失敗した判定は不要です。
  4. 肝心の「チラツキ」を無くす方法です。
    SetStyle() で Opaque を true に設定すると OnPaintBackground() が呼び出され無くなります。
        // MyForm
        Name = "MyForm";
        SetStyle(ControlStyles.Opaque, true);
        

【演習】

  1. Sprite を切り替える では画像のロードに失敗したときに、一瞬ウインドウが表示されたのですが、 表示されなくなったことを確認して下さい。
    ソースコードもスマートになったでしょう。 <(`^´)>
  2. このままではウインドウの背景(描画されない部分)が変ですね。 (;_;)
    そこで最初の一度だけウインドウをクリアして下さい。
    ウインドウをクリアするソースコードです。
    g.Clear(Color.LightGray);
  3. また、最初に一度しか画面をクリアしないのでは、透明色の部分が重ね書きされて画像が崩れます。
    透明色を使ったアニメーションを行うときは、次の方法を用います。
    1. 毎回、背景画像を描画した上からアニメーション画像を描画する。
    2. より抜本的な方法は、ダブルバッファを使うことです。
      ダブルバッファを使う方法は、この後で説明します。

超初心者のプログラム入門(C# Frame Work)