前回作った「火の玉」ですが、あれは何個も何個も加色合成を繰り返して
それっぽい画像にたどりついていたんですが、それだとゲームで使うのには重すぎますね。
少ない数だといいんですが、あれだと10個も出るともうFPSががた落ちするでしょう。
そこで、なんとかして高速化する必要が出てきます。 高速化のポピュラーな手法として、出てくる計算を前もって計算して配列にいれておき、それを 配列から取り出す、という「テーブル」という技術があります。画像でも同じことです。 リアルタイムに作り出すのが無理なら、あらかじめ合成した画像を作っておけばいいのです。 つまり、前回作った「火の玉」をファイルに保存してしまえばいいのです。そうすれば いつでもリアルな画像を高速に使うことができます。というわけで、長い導入部になってしまいましたが、 今回のネタはずばり「ビットマップの保存」です。 依然使っていた「Quadruple D」コンポーネントは、標準でサーフェースの内容をBMPファイルとして 保存できたのですが、DelphiXはBMPファイルの保存ができないので、自分で作る必要性が出てきました。 さて、どうするか...。 僕の思いついた中で多分一番簡単だと思われるのが「TBitmapオブジェクトを使う」方法です。 TBitmapオブジェクトはファイル保存機能がついているので、それを使おう、というわけです。 さてそれではいったいどうやってTDirectDrawSurfaceからTBitmapへ画像を送るのか? っちゅーことですが、幸いどちらも「TCanvas」オブジェクトをもっているので 「CopyRect」関数を使えば画像の内容のコピーはいとも簡単にできます。 そんなわけで、あるサーフェースの指定領域をファイルに保存する関数です。
procedure SaveBitmap(const FileName:String;const Surface:TDirectDrawSurface; const Rec:TRect); var tempBmp:TBitmap; begin tempBmp:=TBitmap.Create; tempBmp.Width :=GetRectWidth(Rec); tempBmp.Height:=GetRectHeight(Rec); tempBmp.Canvas.CopyRect(Rect(0,0,GetRectWidth(Rec),GetRectHeight(Rec)), Surface.Canvas,Rec); Surface.Canvas.Release; tempBmp.SaveToFile(FileName); tempBmp.Free; end;さてこれでファイルへ保存する準備ができましたので実行あるのみです。 便利クラスのひとつ「TIntervalMover」を継承した「TSurfaceCapturer」というクラスを作成して、 50ms(ミリ秒)ごとにBMPファイルを出力し(全部で10枚)、それを減色・加工して出来上がったのがこれです。
これには枠がついていますが、枠をとってしまえば十分ゲームでも使えるでしょう。 とりあえず人間の手で絵を描いたものよりはリアルなはずです。これでリアルさがたりないっていう場合は 20msごとにBMPファイルを出力してみればもっときれいになるはずです。ちなみに画像は32×32が10コマで256色 画像ですが、ファイルサイズはたったの11kByteなので全然問題ないと思います。どうぞお試しあれ。 今回はどちらかというとビットマップの保存、というよりも「プログラムを使って画像を作り出すことができる」 ことが本題となってしまいました。プログラマ兼ゲームクリエイターさんの中には「リアルな絵が描けない」 とお嘆きの方がいるかもしれませんが、「それなら画像を作り出そう」という考えにたどりつけると より面白くなるんじゃないかなあ、と思います。また、こういうのが好きな人は「メガデモ」っちゅー やつに向いてるのかもしれませんね。非常に刺激的なジャンルですので、一度みてみるといいと思います。
|
※FPS フレーム・パー・セカンドの略称。一秒間に何回画面を更新できたかを表す。 この数値が高いほど、画面がなめらかにアニメーションする。
※高速化
※減色
|