■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第53夜:フェードイン/フェードアウト 今回は、場面転換などで使いたいフェードイン、フェードアウトをインプリメントします。とりあえずアルファブレンドは使わないドットマスク式でいきましょう。書式は以下のように致します。パラメータは…あってもいいですが、今回は定速で簡単にいきましょう(・ω・)ノ
■ドットマスク式? さてドットマスクとは何ぞや…と思う方がいるかもしれませんが、まずは実物を見て頂きましょう。↓これです。 |
|
拡大すると、↓こうなっています。 |
|
そう、白黒の点々で濃淡が表されていて灰色(中間色)がないのが、ドットマスクです。
白から始まって黒に到る順番で、表示されている画像に対しドットマスクをANDすれば、マスクの黒い部分に相当するドットが抜けて黒になります。これを順次くりかえせばフェードアウトになります。 また、画像AにドットマスクをANDし、同じドットマスクを白黒反転して画像BとANDして、そののち画像Aに画像BをORすると、半透明もどきの合成画像になります。マスク濃淡を変えながらこれを行えば、フェードインになります。 さて、理屈がわかったところで実装してみましょう。 ■Mode_stat フェードイン/アウト用にフラグを追加します。値は ON/OFF の2値で処理中/それ以外を表します。 |
struct _Mode_stat {
extern _Mode_stat Mode_stat; |
■コマンド解釈部 せっかくだからフェードアウト/インとも一緒に登録しちゃいましょう。 |
void Command_call() {
|
■フェードアウト ■撃つ ではまず、フェードアウトのコマンド実行部です。なにはともあれマスク画像を読み込まないといけませんので、マスク用のDCとして Fade_DC、ビットマップのハンドルとして hFade_Bitmap を宣言します。ここにマスク画像を読み込みます。あとは、いついものごとくフラグを立ててタイマー撃ちです。 |
//------------------------------------------------------------ HDC Fade_DC; //デバイスコンテキスト(フェード処理用) DWORD fade_timer; void _make_fade_surface()
int Com_fade_out()
|
■回す/締める タイマーでタイミングを計りながら、順次段階的にマスクをバックサーフェイスにOR転送していきます。今回用意したマスク濃度は15段階ありますが、これはカウンタ fade_counter でタスクが呼ばれる毎にカウントアップします。またマスクは横32dot、縦480dotの長方形なので、ローカルカウンタ x でループさせながら順次画面全体にマスク処理します。 fade_counter がマスク濃度15段階分カウントし切ったらフェードアウト終了ですので、フラグを戻しておきます。そのとき、画面が真っ暗になって全面更新状態で終わるので、画面キャッシュを真っ黒画像(ここでは black.bmp)に書き換えておきます。また実質的な改ページに当たるのでSAVEポイント処理(第49夜参照)も行っておきます。 |
int Com_fade_out_task() {
|
■フェードイン ■撃つ フェードインも、同じ要領でインプリメントします。起動部分はほぼ同じです。 |
//------------------------------------------------------------ int Com_fade_in()
|
■回す/締める タスク部分の処理は、単純に黒くなればよかったフェードアウトと比べるとやや複雑です。とはいえ所詮は論理演算なのでそれほど恐れることはないでしょう。BitBlt()
の論理演算指定は最後の引数で行います。内容は以下のようになります。
この SRCERASE なんて指定があるあたり、マイクロソフトの担当者はドットマスク式の画像合成に使うことを想定したのかな…などと思いたくもなりますが、真相のほどははわかりません(・・・そういえば、初期のWindows用ゲームソフトは確かにドットマスク処理が多かったなぁ ^^;)。まあそれはともかく、便利なのでここではそのまま使わせていただきましょう。合成は、本章の最初の方で述べたとおりの手順です。その他 「締め」 の周辺はフェードアウトと同じです。 |
int Com_fade_in_task() {
|
さて、ドットマスクと論理演算で、どのようなフェード処理になるでしょう。 ソースをコンパイルして実行すると、中間色合成ではないため多少のざらつき感はありますが、まずまず使えそうな印象です。アルファブレンドに比べると BitBlt() は圧倒的に高速なので、ドットマスク式の合成は激貧PCにも優しい処理といえるでしょう(ぉぃ |
![]() |
![]() |
![]() |
![]() \(^0^)/ |