■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第23夜:画面切替え@ BMPの転送が出来るようになったところで、ノベルによくある画面切替えの簡単なエフェクトをつくってみましょう。単純な転送だけだと味気ないですし、「撃つ」「回す」「締める」タイプのコマンドとして画面切替えは格好の素材です(^^)。とりあえず切り替えエフェクトは3種類ほど作ることにしましょう。今回は、単純に左から右へカーテンのように画像が切り替わるタイプを作ります。ソースはこちらです。
今回は読み込みパラメータは無しで行きます。 ■処理の概要 BG面からバックサーフェイスへ、コマ送りの要領で順次画像データをコピーしていきます。バックサーフェイスがすっかりコピー元のデータで置き換わったら終了します。なお、結果的にバックサーフェイスに展開している文字データを上書きすることになりますので、テキスト表示の立場からは実質的な改ページとなります。そこで終了時には文字表示位置を初期化して戻るようにします。 ■フラグ main.cpp の _Mode_stat のメンバに以下のフラグを追加します。 |
struct _Mode_stat {
}; |
■コマンド解釈部 定型作業ですね。以下のように処理関数を登録しておきます(TextEngine.cpp)。 |
void Command_call() {
|
■撃つ では、コマンドのファーストショットです。だんだんコマンドも増えてきましたので、サンプルソースを分割して新たに Text_Com_02.cpp として記述してあります。そうそう、別ファイルに分けた場合、ヘッダファイルの作成および他のソースでのインクルードを忘れちゃいけませんよ♪ 処理内容としては定型通りです。Mainloop() で処理分けに使用しているフラグを操作して、テキスト表示を停止したうえで切替処理のフラグをONにしています。そして、毎回の画像転送量をカウントする g_chane_frame_counter をリセットし、タイマーを撃ちます。 |
DWORD g_change_timer; //大麻・・・じゃなくてタイマ int Com_g_change()
} |
■回す/締める Mainloop() から呼ばれるタスク部分は、以下のように記述します。まず、指定時間経過していなければそのまま処理を戻す関所を設けておきます(ここでウェイトを取っている訳ですね)。指定時間経過した場合は、次回に向けたタイマーショットを放ったうえで、BitBlt()で縦長の矩形領域(1コマ分)を背景画面 → バックサーフェイス に転送してやります。 1回分の転送が終ったら、フレームカウンタを調べて画面全体の転送が終ったかどうかを判定します。ここでは横10ピクセルずつ転送を繰り返していて、カウンタもこの転送ピッチで加算を繰り返しています。これが画面の横サイズ=640に達したかどうかで終了判定が出来る訳ですね。 もし画面転送がすべて完了したら、フラグ類を元に戻したうえで、文字表示位置をリセットしておきます。転送によって表画面の文字は消えてしまいますから、実質的な改ページと一緒の扱いをする訳ですね。 |
int Com_g_change_task() {
|
さて、実行してみるとどうあるでしょう? 左から右へ、つつつ・・・と画面が切り替わる様子が見られると思います。スピードに関しては皆さんのお好みで適宜増減調整願います。 |
|
ところで、ここでは解説の都合上、タスク部分での矩形転送を単純に1回だけに限ってインプリメントしました。これだけですとちょっと寂しいので、少しお化粧?をしてみましょう。ソースに以下のようなタスク処理がコメント文の形で書いてありますので、こちらを実行してみて下さい。これなら、ちょっとだけ実用になりそうでしょう?(^^) みなさんも、適宜工夫して面白いエフェクトを編み出して下さい。 |
int Com_g_change_task() {
} そんな訳で、今回はここまで♪(^^) |
(^0^) |