第2回:画面表示(1) 背景の表示



第2回から第4回にわたって、画面表示の処理を記述します。
第4回まで完了すると、図2-1の画面を表示できるようになります。

図2-1:画面表示サンプル

第2回では、背景画像を表示するところまでやります。
最初にして面倒なところですが、この技術は応用が効きますので
ぜひともマスターして頂きたいです。

背景表示では「表画面と裏画面」という概念を使用します。
表画面というのは実際にユーザに見せる画面で、裏画面というのは
表画面を作成する時に使用する一時的な画像置き場、といったところです(図2-2)。

  表画面(空)
 
裏画面1(背景)
転送
表画面
 
裏画面2(立ちキャラ)
転送
表画面
図2-2:表画面と裏画面

この概念を用いて、裏画面には背景画像を格納し、
必要に応じて表画面に転送することで背景画像を表示することができます。

それでは実装に入りましょう。
DelphiかC++ Builderを起動してください。

起動したら、空のプロジェクトが1つ表示されているはずです。
[ファイル|プロジェクトに名前を付けて保存]を選択し、適当なフォルダに
pascalファイルをmain.pas、プロジェクトファイルをsample.dprとして保存します。
(C++ Builderではmain.cpp、sample.bpr)

では、何もしていませんがいきなり実行してみましょう。F9キーです。
図2-3のような画面が表示されます。

図2-3:何も行っていない状態での実行結果

何もありません。灰色のフォームが表示されるだけです。
閉じるボタンを押して終了させてください。

図2-1は、図2-3で表されるフォームに背景画像、立ちキャラ、
メッセージウインドウ、そしてメッセージを載せたものです。

背景画像は、640x480ピクセル、24ビットカラーのビットマップファイルを
使用することにします。
各自で用意して頂けると愛着が沸いて宜しいかと思いますが、
そんなのどうでも良い方のためにdataフォルダの中に用意しました。
このビットマップファイルを裏画面に格納し、表画面に転送します。

表画面として、画像表示コンポーネントTImageを1つ、フォームに貼り付けます。
TImageは画面上部のパレットでAdditionalタブを選択すると見つかります。
貼り付けたら、画面左下にあるオブジェクトインスペクタで
フォームと表画面のプロパティを以下のように変更します。

フォームのプロパティ
プロパティ名 設定値 備考
AutoScroll False スクロールバーを表示させない
BorderIcons.biMaximaze False 最大化ボタンを表示させない
BorderStyle bsSingle ウィンドウサイズの変更を不可にする
Caption Sample タイトルバーに表示される文字
ClientHeight 480 ウィンドウ描画領域の高さ
ClientWidth 640 ウィンドウ描画領域の幅
Name MainForm フォームの名前
Position poScreenCenter フォームを表示する位置を画面中央にする

表画面のプロパティ
プロパティ名 設定値 備考
Align alClient 親のクライアント領域(MainForm)のサイズにする
Name PrimImage TImageの名前

以後、フォームはMainForm、表画面はPrimImageと呼ぶことにします。

表画面はこれで良いとして…裏画面は?

裏画面は、プログラム上で動的に生成します。
ソースコードmain.pasの中にimplementationと書かれている箇所を探し、
その下に次のようにグローバルで使用する定数として
背景画像の幅と高さ、変数として背景画像オブジェクトとその番号を宣言します。
以後、この部分をグローバル宣言部と呼びます。

            
implementation
            
            
const
  WIN_W : Integer = 640; //背景画像の幅
  WIN_H : Integer = 480; //背景画像の高さ
var
  BackBmp : TBitmap; //背景を格納する裏画面
  CurBack : Integer; //表示中の背景の番号
            

ここでBackBmpはまだ宣言されただけで、実体はありません。
MainFormのFormCreateイベント内で実体を生成します(リスト1)。
オブジェクトインスペクタでMainFormを選択し、
[イベント]タブのOnCreateの横にある四角の部分をダブルクリックすると
そのイベントの雛形が自動生成されます。

(リスト1)
            
procedure TMainForm.FormCreate(Sender: TObject);
begin
            
            
   //変数の初期値を代入
   CurBack := 1;

   //オブジェクトの実体を生成する
   BackBmp := TBitmap.Create;
   with BackBmp do
   begin
      Width := WIN_W;  ------------------------------------------------(1)
      Height := WIN_H;  ----|
      PixelFormat := pf24bit;
      HandleType := bmDIB;
      LoadFromFile(Format('..\\..\\data\\bg%.2d.bmp',[CurBack]));  ----(2)
   end;
   //表画面に背景を転送
   PrimImage.Picture.Assign(BackBmp);  --------------------------------(3)
            
            
end;
            

実体を生成したら、(1)でサイズを設定して(2)で背景画像bg01.bmpを格納し、
(3)で表画面に転送します。

もう一つ、忘れてはならないのが、生成したオブジェクトの解放です。
これを行わないとメモリリークが発生してしまい、
メモリリークが度重なると、Windowsが落ちてしまいます。
オブジェクトの解放は、アプリケーション終了時に行えば良いので、
FormDestroyイベントを用意して、そちらで行います(リスト2)。
FormDestroyイベントもFormCreateイベント同様、オブジェクトインスペクタの中、
OnDestroyの横の四角をダブルクリックして雛形を作成します。

(リスト2)
            
procedure TMainForm.FormDestroy(Sender: TObject);
begin
            
            
   //オブジェクトを解放
   BackBmp.Free;
            
            
end;
            

ここまで出来たら、F9を押して実行してみましょう。
図2-4のようになれば、成功です。
終了するには、出現したウィンドウの閉じるボタンをクリックします。
また、ソースコードと同じフォルダにsample.exeというファイルが出来ています。
こちらが実行ファイルなので、これを実行するだけでDelphiを起動していなくても
アプリケーションを起動することができます。
図2-4:背景を表示


第3回へ
アドベンチャーゲーム設計論トップへ戻る
開発分室へ戻る
トップページへ戻る