Delphiでゲーム制作:画像を表示させてみる

前回はキー入力だったんで、今回は画像表示。

Delphiでの画像表示を行うコンポーネントに「Image」があるけど、ゲームとは用途がちょっと用とが違うっぽい。そんなわけで、メモリー上に画像を読み込んで直接描画するよー。

ちょろっと調べてみると、Delphiで画像を扱うクラスにTBitmapと言うのがあるとか。
こいつを使ってやれば、普通にビットマップを読み込む事が出来るみたい。
まずは、使用するグローバル変数を宣言。

private
{ Private 宣言 }
//キャラクター画像読み込み用
CharaImage: TBitmap;

そしてTForm1.FormCreateにて使用できるようにする。

procedure TForm1.FormCreate(Sender: TObject);
begin
//ウインドウのサイズを指定
Form1.Width := 640;
Form1.Height := 480;
//ウインドウの最大化を阻止
Form1.BorderIcons := [biSystemMenu,biMinimize];
Form1.BorderStyle := bsSingle;
Form1.Color := clWhite;
//描画タイミング
Timer1.Interval := 10;
Timer1.Enabled := True;
//キャラクターファイルの読み込み
CharaImage := TBitmap.Create;
CharaImage.LoadFromFile('Character.bmp');

end;

上の方のウインドウ固定とかはおまけ。デフォルトだと普通にフォームが変更できるので。
後、描画処理はタイマーを使って処理する事にした。

なお、CreateしたらFreeしないといけないみたいなんで、TForm1.FormDestroyに取得したメモリー領域を開放するように記述した。

procedure TForm1.FormDestroy(Sender: TObject);
begin
CharaImage.Free;
end;

そんな感じで、後はFormに画像をそのまま書き出すだけ。その書き出す方法はいろいろあるけど、今回は次のようにTForm1.Timer1TimerにてWin32APIのBitBltをそのまま叩いて描画した。

//フォームを白で塗りつぶす
BitBlt(Form1.Canvas.Handle, 0, 0, 640, 480, Form1.Canvas.Handle, 0, 0, WHITENESS);
//キャラクターを描画
BitBlt(Form1.Canvas.Handle, CharaX, CharaY, CharaImage.Width,
CharaImage.Height, CharaImage.Canvas.Handle, 0, 0, SRCCOPY);

そんな感じで作ったのがこちら:ImageDisplay.zip

実行してみると分かるけど、次のようにチラつく。
ImageDisplay-1.gif
うはwwww 絵へたくそwwww
じゃなくて、チラチラする。

どうもこの原因は、描画するタイミングとディスプレイのリフレッシュレートが関係してるみたい。

現状では画面のFormを白で塗りつぶしたあと、キャラクターを描画しているんですけど、ディスプレイの更新周期がキャラ描画前に来てしまい、結果的にキャラクターを描画していない瞬間が一瞬だけ現れることによってチラついているとか。
つまり、画面そのものに描画せずに、裏で描画すれば解決する話っぽい。

今回は分かりやすく裏画面って場所を作って、そこにキャラクターを描いた後に画面に表示させた。
なお、裏画面のことをDirectXなどではバックサーフェイスなどと言うとか。
意味的にはどっちも同じっぽい。

とりあえず、画面への描画を次のように変更することによって、チラつかなくなった。

//裏画面を白で塗りつぶす
BitBlt(BackCanvas.Canvas.Handle, 0, 0, 640, 480, BackCanvas.Canvas.Handle, 0, 0, WHITENESS);
//キャラクターを描画
BitBlt(BackCanvas.Canvas.Handle, CharaX, CharaY, CharaImage.Width, CharaImage.Height,
CharaImage.Canvas.Handle, 0, 0, SRCCOPY);
//裏画面をフォームに描く
BitBlt(Form1.Canvas.Handle, 0, 0, BackCanvas.Width, BackCanvas.Height,
BackCanvas.Canvas.Handle, 0, 0, SRCCOPY);

できたファイルがこちら:ImageDisplay2.zip

うむ、バッチリだね。絵心以外w

さ~て、画像も表示できるようになったし、ちょっとしたミニゲームでも製作しますか!
とりあえず、定番のもぐらたたきとかテトリスとか、あとブロック崩しとか。

がんばるぞー。

| コメント(0) | トラックバック(0) |
■Yahoo!オークション おすすめ商品■
Web Services by Yahoo! JAPAN

トラックバック(0)

トラックバックURL: http://type-y.com/mt/mt-tb.cgi/697

コメントする