フェードアウト、フェードインとは、画面の転換時に画面全体が徐々に暗くなって画面が変わったり、暗い画面に徐々に画面が浮かび上がってくる効果です。プログラムの中でカラーテーブルを使うと、こうしたフェードインやフェードアウトの画像処理を効率的に実装することができます。 明るさを変化させるにはまず、256段階グレースケールのビットマップを考えてみましょう。このカラーテーブルは0がRGBで(0、0、0)、1が(1、1、1)、2が(2、2、2)....と続いて最後の255が(255、255、255)となるはずですね。このビットマップを「暗く」するには、言い換えればRGBの値を全体に「小さく」するにはどうすれば良いでしょうか? 単純な答えとしては、「カラーテーブルの値を小さくしていく」というのがあります。つまり、カラーテーブルのRGB値をひとつづつ減らしていくのです。これで行くと、カラーテーブル0が(ー1、ー1、ー1)、1が(0、0、0)、2が(1、1、1)、255が(254、254、254)となりそうですが、カラーテーブルの値は0ー255なので0未満の値は0にします。そして、これを255回続けるとカラーテーブルがすべて(0、0、0)になって画像が真っ暗になります。逆に、画像全体を明るくする時はRGBを増やしていって、最後にはRGBがすべて(255、255、255)、つまり真っ白になります。 ・カラーテーブルの配列(Palette[512])を作るプログラム for (i=-255;i<1;i++) for (j=0;j<256;j++) if (i+j>=0) { Palette[i+255][j].rgbRed=i+j; Palette[i+255][j].rgbGreen=i+j; Palette[i+255][j].rgbBlue=i+j; } else { Palette[i+255][j].rgbRed=0; Palette[i+255][j].rgbGreen=0; Palette[i+255][j].rgbBlue=0; } for (i=256;i<<512;i++) for (j=0;j<<256;j++) if ((i-256)+j<256) { Palette[i][j].rgbRed=i-256+j; Palette[i][j].rgbGreen=i-256+j; Palette[i][j].rgbBlue=i-256+j; } else { Palette[i][j].rgbRed=255; Palette[i][j].rgbGreen=255; Palette[i][j].rgbBlue=255; } こうしてカラーテーブルを作ったら、フェードアウトの時にはだんだん「暗い」カラーテーブルに換えて行き、フェードインならだんだん「明るい」カラーテーブルに換えて行きます。カラーテーブルを換えるタイミングは、タイマを使ったり適当なウエイトを入れたメインループ内で換えたり、という方法が考えられます。また、RGBを増減する値は別に1でなくても良いわけで、このあたりはカラーテーブルを換える周期と併せていろいろ試してみましょう。 プログラム今回のプログラムでは、20msのウエイトを入れたメインループ内でカラーテーブルを変更しています。実行するとグレースケールのビットマップが表示され、「開始」ボタンを押すと画面が暗くなってフェードアウトするようにしました。 画像が真っ暗になると今度はだんだんに明るくなり、真っ白になるとまた暗くなって行く。以降はこの繰り返しなので、だんだんとビットマップが「浮かび上がって」きたり、「かき消されて」行く様子を確認してください。 |