「ゲームプログラミング」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
UL化、cleanup
タグ: 2017年版ソースエディター
→‎Windowsの場合: DXライブラリの透明色の機能について勘違いしてたので修正。(0,0,0)が透明色という仕組み
318 行
つまり、ファミコンのスーパーマリオ1やドラクエ1のようなゲームですら、Windowsでは、キャラクター画像の周囲を透過させないと、そういうシステムのゲームは作成できないのです。
 
なお、実はDXライブラリによる透明の機能は、PNGなどの透明部分を黒色 (R,G,B)=(0,0,0) に変換しています。そして(0,0,0)のドット部分だけ描画をしないという仕組みで、DXライブラリでは透明を実装しています。なので、DXライブラリ用の画像には、(0,0,0)を色としては使用できません。むりやり使用しても(0,0,0)のドット部分が描画されないので下の画像が見えてしまいます。なのでゲーム用のイラストを描く場合などは色(0,0,0)の使用を避けなければなりません。なお、たとえ色が(20,20,20)くらいでも人間の目では充分に黒色に見えます。(1,1,1)だと保存などの際に色情報が変化した場合に(0,0,0)になって透明化してしまいかねないので、もし黒色を使うなら余裕をもって(20,20,20)くらいにしておきましょう。裏を返すと、実は2Dゲームでは、完全な黒色を再現するのは基本的に無理です。もし仮に透明色を変更したとしても、今度はその色が使えなくなります。
 
なお、これはゲームだけなく、実写映像の合成なども同じような仕組みです。実写撮影では青色がよく透明色に使われます。だからよく、合成シーンの撮影では、青色の背景ボードの前で役者が演技してたりします。テレビ番組の収録映像などで、そういう撮影シーンを見たことある人もいるでしょう。(おそらく、当然ですが、そういう合成シーンの撮影では、役者の服などでは青色を使えなくなるハズです。)
よってゲームのキャラクターチップ画像の作成のため、ビットマップ画像には透過の情報がないので、PNG画像を使う必要があります。
 
実を言うと、上述のようなDXライブラリの透明色の仕組みは、DXライブラリを使わない場合の透明の実装方法と原理的には同じです。つまり、windowsAPIには特定の一色を描画しない機能によって、透明機能を実装する機能があります。そして実はDXライブラリの透明機能は、windowsAPIのその機能を流用しています。
 
なので原理的にはPNG画像を使わなくてもwindowsAPIだけでも透明の機能は実装できるのですが、まあ、せっかくPNGという規格があるのでそれを活用したほうがラクだし、ゲーム処理速度などの都合でDXライブラリを使うほうが効率的でしょう。
DirectX以外の GDI や CImage の提供する関数群(たとえば CImage の Draw 関数など)を使うことで、チラツキはありますが、とりあえず、マップ上にキャラクターチップのPNG画像の背景部を透過させる事だけなら可能です。
 
 
さて参考知識を述べるなら、 DirectX以外の GDI や CImage の提供する関数群(たとえば CImage の Draw 関数など)を使うことで、チラツキはありますが、とりあえず、マップ上にキャラクターチップのPNG画像の背景部を透過させる事だけなら可能です。
 
しかし、Windows標準の GDI+ や CImage の提供する関数群は、ダブルバッファリングに対応していないのです。一方、Windowsが標準で提供するダブルバッファ用のBitBlt などの関数は ビットマップ用に作成されているので、その際に HBITMAP ハンドルを定義して画像をそのハンドルに代入しなければいけないのですが、そのHBIMTMAPへの代入の際に(元のPNG画像には存在していた)透過情報が失われてしまい背景が塗りつぶされているビットマップ画像に変換されてしまうので、もはやキャラクター周囲が透過しなくなり、せっかくPNG画像を使っていた意味が無くなってしまいます。