アヒルくんウォーズ北国編・開発後記と更新履歴



■更新履歴
2003/06/20 ver1.3公開
        ・実行速度がとても遅いと、非常に難しくなるミッションがあったので調整
2003/05/31 ver1.2公開
        ・実行速度が10fps以下の環境でクリア出来ないミッションがあったバグ修正
        ・スプライト系のクリッピングを少し修正
2003/04/12 ver1.1公開
        ・ボス一匹倒すとBGM停止するバグ修正
        ・ゲーム用コントローラ対応
2003/03/17 ver1.0公開



■古いバージョンをインストール済みで、新たなバージョンをインストールする方へ
古いバージョンを一度アンインストールしてから、新しいバージョンをインストールして下さい。
アンインストールしてもSAVEデータ(snow.dat)だけは残るので、前回の続きから始めたいという場合は、 以前のsnow.datを新しいインストールしたフォルダへ(手動で)コピーすればOKです。
デフォルトでインストールした場合、"C:\Program Files\流体力学研究所\アヒルくんウォーズ 北国編\X.XX"にデータがあります。(X.XXはバージョン)



■開発後記[2003/03/17]
DirectXを始めてから約1年、そろそろ1本まとまったモノを何か作りたいと思い、 「のんびりしてて、簡単操作で簡単なルール」「多くの環境で動作する」を目標に作りました。
ここでは、自分がDirectX8.1で引っかかった部分などを書き残しておきたいと思います。

■DirectXの機種依存問題?
GeForce2MX200という、今となってはかなり貧弱なビデオカードで開発を行いましたが、 GeForce系以外のグラフィックカード(RADEON9700、Matrox Millennium...)で 雪面に出るはずの「影」が表示されないという不具合があることが分かりました。
IFさんのご好意で、RADEONでの動作確認にご協力頂きました。ありがとうございました。

アヒルくんウォーズの影はVertexShaderでやってるので、その当たりを調べてみたのですが、 何も特殊な事はしていないので、もっと単純な事では?と、設定しているTextureStageやRenderStateを 調べつつ、マニュアルを眺めていると、「テクスチャ ブレンディング処理と引数」の項目に 「カラーブレンディングが有効のときにアルファ処理を D3DTOP_DISABLE に設定すると、 その動作は不定である。」という注意書きを発見。
どうやらこの「不定」というのに、引っかかっていたようです。
この不定動作がGeForce系のカードでは都合よく動き、それ以外のカードでは、 うまく動かないというのが原因でした。
COLOROPとALPHAOPはセットで設定しましょう(当たり前)。

〜具体的な実例〜
ステージ0はDiffuseColor、ステージ1に影のソーステクスチャを指定。
下記の設定だとGeForce系では2ステージが合成され、うまく表示されますが 他のカードではステージ1が出ません。
ステージ1のALPHAOPはデフォルト状態(Disable)になっています。


dev->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
dev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
dev->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_MODULATE);
dev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
dev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT);

他のカードでも、うまく表示させるには、ステージ1のALPHAOPを、しっかり設定してあげましょう。


dev->SetTextureStageState( 1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
dev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);


以上、機種依存か?と思われた、影出ない問題。
実はALPHAOP未設定というイージーミスだった事が判明し解決したかに思われました...。


(DirectXにあるデモの影が出ない場合、これが原因だったと思われます)

これで、無事にGeForceとRADEONで影がブレンドされて描画されるようになりました。
しかし、上の設定でも、一部のカード(Intel 82810E Graphics Controller 4.12.01.2586とか) ではまだ正常に表示されませんでした。他にもあるかもしれません。
これまで雪面のブレンドは、


dev->SetTexture( 0, NULL );
dev->SetTexture( 1, 影テクスチャ );

というように、ステージ0番のテクスチャはNULLで、カラー指定だけでした。
いろいろ調べてみた所、このカードは、NULLが設定されていると、それ以降のステージを見てくれないようです。
オペランドはカラー指定になっているので、Texture=NULLでもOKだと思っていたのですが、カードによっては、ダメな場合もあるようです。
試しにステージ0番に適当なテクスチャを指定すると、ブレンドされて表示されました。

■雪面
雪面は Perlin Noise 高低差を作っています。
(CGネタで自分的に新しい事は、これだけ)

■マウスのボタン
このゲームには全然関係ない話ですが、気がついた事。
マウスの左右ボタン同時押しを検出してくれない環境があるようですね。
(例えば、右ボタン押しながら、左ボタンを押しても、左ボタンが押されている事にはならない)
同時押しする場面なんて普通ありませんが、ちょっと気になったのでメモ。

流体力学研究所

戻る