DirectX覚え書き
どうもHSPDX.DLLにはバグ(仕様かも)が少なからず潜んでいるようなので、自分が普段HSPDX.DLLを使ってて気がついたことを書いておきます。バグ情報以外にも何か書くかもしれません。
自分はDirectX(HSPDX.DLLのことではない)や窓プログラミングに関してはド素人なので一部で変なこと書いているかもしれません。したがってあまり深く突っ込みすぎてる部分はアテにしない方がいいかも。
DLLの再構築もしくは他のDLLへの乗り換えしか解決策がない問題は書いても意味がないので書きません。
2000/12/23追記:VC++6.0 Professional Edition購入にともない、現在自らの手でこれらの不具合を修正しています。と言うわけで、それまでのしのぎ的対策を列挙したページとなります。リリースしたら消すかも。というか、おにたまさんがデバッグしてくれているかもしれませんがその辺の事情は知りません(^^;。
2000/12/25追記:ソフトウェアダウンロードページにてHSPDXFIX.DLL公開しました。以下に書かれている不具合は全て取り除かれています。
●RGB=(0,0,0)でも画像が透過しない(2000/02/28)
DLL内部では「RGB=(0,0,0)となっていて一番パレット番号の若いパレットを透過色とする」ようになっています。したがって黒が2色ある場合、パレット番号の大きい方は透過せずにそのまま表示されることになる・・・はずなのですが、実際には「透過色として扱われるのはパレット0のみ」のようです。でもってDirectXでは透明色はパレット番号で指定するものなので色は何でも良かったりするようです。
なぜ推定形かというと、自分は常にパレット番号0に(0,0,0)を入れて画像を作るため、この事実に気がつかなかったからです。しかし256色に特化したグラフィックツールではWindowsカラーを考慮してパレット0は(0,0,0)になっていますので普通に絵を描けばこの問題に気づくことはないはずなのですが(減色ツールなどを用いてパレットを統合すると崩れる可能性はあります。Paint
Shop Pro6の場合は暗い色から順にパレットを作っていくようなのであまり問題はありません)。
→透明色はパレット0を使いましょう。
2000/12/23追記:パレット取得のバグかと思ったらカラーキーの設定自体が実装されていない・・・。
●es_byeするとプログラムが終了する(2000/02/28)
es_byeを実行するとバッファ用に確保したメモリやシステムを解放して元のウィンドウモードに戻るはずなのですが、ここで見事に落ちています。試しにes_iniを実行せずにいきなりes_byeを実行してみると分かります。システムの初期化ができていないときは何も起こらないはずですが(実際ソースにもそう記述されている)、なぜか「不正な処理を行ったので強制終了」させられます。そうでもありませんでした。でもes_screenを実行した後でes_byeを行うと、そこより後の命令がことごとく無視されているため、es_byeで落ちていることは間違いないと思います。(2000/12/02追記)
DirectX内で完結するプログラムを組む分には全く問題ありませんが、ウィンドウモードに戻してファイル管理などをしたいときにこのバグはかなりのダメージを受けます。
→ウィンドウモードに戻さなくてもよいようにプログラムを組む。ダイアログが欲しいなら自前でそれっぽいインターフェイスを作成しましょう。(簡単に言うな)
↑ちなみにこのバグですが、es_byeを実行したときにWindowsに「このウィンドウを消去し、プログラムを終了せよ」という旨のメッセージが送られていたために起こったようです。HSPDXFIX.DLLでは改善されていますが、副作用としてstopがきかなくなっています(何でじゃ)。
●消えたスプライトに衝突する(2000/02/28)
es_killやes_clearで消去したスプライトがes_checkで衝突判定を行ったときに検出されることがあります。↑嘘っぽい。今日試したけどそんなの出なかった。デムパってたかもしれません(意味不明)。出たら直します。(2000/12/23)
●オフスクリーンバッファが0〜7までしか使えない(2000/12/02)
マニュアルには0〜9まで使えると書いてありますが、内部でオフスクリーンバッファを8個しか用意していないため、実際に使えるのは0〜7までと言うことになります。どちらが間違いなのかは分かりません。
→8つでうまくやりくりして下さい。
●es_windowの挙動が変。横だけを変えたのに縦の位置がずれる(2000/12/02)
スプライトの描画ルーチンにバグがあり、es_window
p1,p2,p3,p4とes_window p1,p1,p3,p4が同じ動作になってしまうようです。と言うわけで、es_windowは使えません。
ではどうするかというと、まず普通に画面を一通り描画し、最後に不要な部分を画像などで上書きして潰します。こうすることで同等の処理が行えます。
→画面を描画した後に画像で潰す。
●es_clear消しすぎ。ていうか全部消える(2000/12/23)
別件の修正のためにソースを眺めていたら発見しました。es_clearの第2パラメータが見事に無視されています。動作確認していませんが、おそらくp1で指定した番号以降のスプライトは全部消滅すると思います。
→repeat+es_killで消す。
●es_copyで画面からはみ出るようにコピーすると表示されない(2000/12/23)
es_copyとes_zoomはクリッピングを行っていません。よって画面からはみ出ると描画されないようです。
→自力でクリッピングする。
●es_palfadeを使うと突然画面が真っ黒・真っ白になったりフェードイン・アウトが止まらない(2001/02/06)
輝度カウンタの管理の仕方が(直球で言ってしまえば)変なのでこのような現象が起こるようです。具体的に言うと、前者の場合は128(-128)で止まるようにホワイト(ブラック)フェードすると目標値に到達した瞬間輝度を最大にするために真っ白(真っ黒)になり、後者の場合は255→0へ6ステップずつとかやると、ちょうど0にならないためにストップがかからない、ということです。
→輝度がピッタリ0になるように調節する。また、中途半端な輝度で止めない。
●ウィンドウがフルカラーになっているとes_iniで落ちる(2001/02/06)
es_iniを実行するとまずウィンドウのパレットから透明色を割り出そうとします。で、このときウィンドウがフルカラーモードになっていると存在しないはずのパレットを参照しようとし、ありもしないメモリを読みに言って落ちてしまうのだと思います(推測)。
→まずはパレットモードに切り替えておくこと。
他にも何か見つかったら書き足していきます。