DirectX小技集

DirectX7を使ってゲームを作る際の「小技」を紹介する。

  1. DirectX7のインストール
  2. DirectXを使うためのVCの設定
  3. DirectX7日本語HELP
  4. 左上1ピクセルの色を抜き色に選ぶ
  5. 色が壊れたり、透明にならない
  6. ベタ絵での横スクロール
  7. ベタ絵での横スクロール・実はできるぞ
  8. ベタ絵での横スクロール・やっぱり無理?
  9. 画像を使わず、バック・サーフェイスを任意の色で塗りつぶす
  10. OutputDebugStringの薦め

DirectX7のインストール

インストール自体はとっても簡単だが、注意する点がひとつだけある。それはインストールの時に聞いてくる「Run-Time Type」だ。「Retail」と「Debug」の2つがあるが、自分でプログラムを作るなら迷わず「Debug」だろう。しかし作ったプログラムを配るなら「Retail」だ。

本当なら開発用と配布時ビルド用に2つのマシンを用意し、開発は「Debug」のマシンで行い、完成したら「Retail」のマシンでリビルドするのがベストなのかもしれない。

Menu

DirectX7を使うためのVCの設定

VCでDirectXの命令を使うためには設定が必要である。

  1. VCを起動
  2. 「ツール」→「オプション」を選択
  3. オプションウィンドウから「ディレクトリ」タブを選択
  4. 「表示するディレクトリ」を「インクルードファイル」に設定
  5. 3つのディレクトリの下の空欄をクリックし、C:\MSSDK\INCLUDEを設定
  6. 設定したディレクトリを[↑]ボタンで一番上に移動させる
  7. 続いて「表示するディレクトリ」を「ライブラリファイル」に設定
  8. 2つのディレクトリの下の空欄をクリックし、C:\MSSDK\LIBを設定
  9. 設定したディレクトリを[↑]ボタンで一番上に移動させる

これをやっておかないとDirectX関係の命令を使ったときにエラーが出る。
なお、これはVCインストール時に一回設定しておけばよい。

Menu

DirectX7日本語HELP

待ちに待ってた日本語HELPが出た。知らない人は早速ダウンロードしよう。
英語版のHELPでもよく読めばちゃんと判るし、それくらい調べる位の根性がないと話にならないということをよく聞くが、日本の参考書の内容すらさっぱり理解できない私に英文マニュアルを解析するなんて全く不可能である。
そういった意味でこの日本語HELPの存在はまさに救いの神!
まずはこれに書いてあることを理解し、それが出来たら英文もある程度判るようになれると信じている。って、今だろくに見てはいないが・・・

Menu

左上1ピクセルの色を抜き色に選ぶ

これはDirectX実践プログラミングのサンプルや、MSSDKのサンプルのバグである。
透明にする色(カラーキー)を指定するにはSetColorKeyという関数を使うが、RGBで色を指定する方法と、左上1ピクセルの色を指定する方法がある。前者は問題無いが、後者のサンプルプログラムを見ると何故かRGBを指定しているため、見た目は変わらないが、例えば画像を自分で用意してみると後者は透明にならない。
左上1ピクセルの色を透明色として指定するには、SetColorKeyの2つめの引数にRGBではなくCLR_INVALIDを指定しよう。

Menu

色が壊れたり、透明にならない

複数の画像ファイルを扱うときは注意が必要である。例えば背景画像とキャラクタ画像の2つのファイルがある場合、背景画像を変えたらゲームの色が変になったという現象がよく起こる。

これは、画像ファイルごとにパレットが違うために起こる現象である。パレットの生成方法を思い出してほしい。パレットを生成するにはDDLoadPalette関数を使うが、パレット情報は画像ファイルから取得する。つまり、この時使った画像ファイルのパレット情報とは違うパレットを持つ画像ファイルの画像を表示すると、その画像の色情報がおかしくなる訳である。

これを解決するには、複数の画像ファイルを用意する時には、すべて共通のパレットを使わなければならない。Draw系のソフトを駆使して何とかしよう。
(私もそうだが)良く分からない人は、画像ファイルを全て1つにまとめてしまおう。これなら悩むことはないだろう。

ちなみにPhotoShopで画像を作り、256色のBitMapに変換する際、Windows標準のパレットを使うを選択すると、多少色が壊れるかもしれないが、すべての画像をこの方法で保存すればパレットを統一させることができる(と思うのだが、まだ試していない・・・)。

Menu

ベタ絵での横スクロール

去年の授業で横シューティングを作らせていた時のこと。背景画像を横長のベタ絵(3200×480)で作っていたのだが、その画像ファイルではどうしてもオフスクリーン・サーフェイスが作成できなかった。色々やってみたのだが、どうやらビデオカードが対応していないらしく、横のサイズが640ピクセルまでの画像しか使えなかった。(その時使ってたのがFM-V 5100D4で、ビデオはオンボードであった)
仕方がないので横長画像を640ピクセルずつにぶった切り、下に配置して使っていたのだが、スクロールなど、結構めんどくさいプログラムになってしまった。

この経験で、横の長さが640ピクセルを超える画像は使えないと思い込んでいたのだが、別のパソコンでは出来ることが今年になって判明した。最近のパソコンならまず出来るのだろう。去年のあの苦労はいったいなんだったのか・・・

なお、正確には640ピクセルを超えることができないのではなく、プライマリ・サーフェイスの横幅を超えるオフスクリーン・サーフェイスは作成できないビデオカードがあるということである。覚えておこう。

Menu

ベタ絵での横スクロール・実はできるぞ

ビデオカードによって、フルスクリーンの横幅(640ピクセル)以上のオフスクリーンが作成できないものがあるという話しをしたが、サーフェイス作成時にあるオプションをつけることにより、可能になることが分かった。

ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAN;

という行を、以下のように変更する。

ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAN | DDSCAPS_SYSTEMMEMORY;

これは、サーフェイスをVRAM上とシステムメモリ上のどちらにでも作成できるという指定のようだが、この設定により、何故だか分からないが、横幅が640ピクセルを超える画像を元にオフスクリーン・サーフェイスを作れるようになった。
プログラムのイメージでは、システムメモリ上に作ってしまい、動作が遅くなるような気がするが、VRAMがあまっている限りはシステムメモリは使われないようである(基本プログラムでは違いが体験できなかった)。
で、私のプログラムでは、DirectDraw関係の関数はラッパー関数を利用しているので、DDraw.cppを直接触ることになる。この指定無しではエラーが出ていたマシンで一度試してみて欲しい。

Menu

ベタ絵での横スクロール・やっぱり無理?

上記の設定により、プライマリ・サーフェイスの横幅を超えるオフスクリーン・サーフェイスが作成できるようにはなったが、その設定をしてゲームを作ってたら、FPSがやけに遅くなるときがあることが判明した。動作確認程度ではなんともなかったのだが・・・
やはり使わないほうがいいのかもしれない。

Menu

画像を使わず、バック・サーフェイスを任意の色で塗りつぶす

Blt関数を使えば、バック・サーフェイスをパレット内の任意の色で塗りつぶすことができる。プログラムは次のとおり。

DDBLTFX ddbltfx;
ZeroMemory(&ddbltfx, sizeof(ddbltfx));
ddbltfx.dwSize = sizeof(ddbltfx);
ddbltfx.dwFillColor = 128;
g_pDDSBack->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);

ここで重要なのは「128」という数値をセットしていることだ。これはパレットに設定されている色のうち、128番目の色を使うということであり、128がどんな色なのかは決まっていない。つまり、パレットの情報によって128の色が何色であるかが変わる。

Menu

OutputDebugStringの薦め

開発中、例えば「本当にこの関数(処理)が実行されているのか」とか、「この変数の値はどうなっているのか」を調べたくなることが多い。Visual C++にはさまざまなデバック機能があり、それを利用して調べることができるが、もっとお手軽に調べる方法がある。それは、OutputDebugString関数を利用することである。
この関数は、puts関数と同様に使える。どこに表示されるかというと、アウトプット・ウィンドウである。使い方は次の通り。

  1. プログラム内にOutputDebugString関数を埋め込む。
  2. ビルドを行い、エラーが無いことを確認。
  3. プログラム実行時、通常の「実行」ではなく、デバッグ・モードで実行する。
  4. 適当なところでプログラムを終了する。
  5. アウトプット・ウィンドウの下のほうを見ると、OutputDebugString関数が実行されていれば、その内容が表示されている

Menu


[ TOP ]