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

削除された内容 追加された内容
編集の要約なし
→‎2Dの画面出力: Windowsでゲームをつくる際、マイクロソフト社の提供する開発ツールを使ってゲーム開発する場合には、画像レイヤー表現のための描画機能の都合により、実質的に DirectX プログラミングだけに開発ツールが限られます。
291 行
 
=== 2Dの画面出力 ===
==== 概要 ====
画面出力の場合にも入力機器の場合と同じで、これらを操作する方法はOSごとに異なっています。先ほどあげたGTK+, Qt, SDLなどのライブラリはクロスプラットフォームの画面出力を提供しているため、これらを利用することで全てのプラットフォームで動くプログラムを作ることができます。
<!--
298 ⟶ 299行目:
;例:ブロックくずし
:『[[ゲームプログラミング/ブロック崩し]]』で説明。
 
==== Windowsの場合 ====
Windowsでゲームをつくる際、マイクロソフト社の提供する開発ツールを使ってゲーム開発する場合には、画像レイヤー表現のための描画機能の都合により、実質的に DirectX プログラミングだけに開発ツールが限られます。
 
なぜなら、PNGやJPEGなどビットマップ以外の画像形式のダブルバッファリングをしようとしても、DirectX 以外の GDI+ や CImage などのWindows標準の画像開発ツールでは不可能だからです<ref>[https://oshiete.goo.ne.jp/qa/5707972.html 『ActiveBasic 透過画像の作り方 -ゲームを作っています。そのときに、背- その他(プログラミング・Web制作) | 教えて!goo』質問日時:2010/02/26 16:09] 2021年に2月11日に閲覧して確認</ref>。ダブルバッファ用画面を作成するときに必要になるハンドル HBITMAP には透明色がないので、原理的に絶対、GDI+ や CImage では透明化をできないのです。
 
重要な点としては、作成しようとしているゲームがたとえ3次元ポリゴンを駆使したゲームでなくても、たとえファミコン的な平面的グラフィックのゲームであっても、DirectXのレイヤー表現の機能が必要になってしまうという事です。
 
なお、DirectX の文法は Visual C++ の文法に則して書かれるので、Visual C++ の知識自体は、無駄にならず、再活用できます。
 
さて、参考リンク先のサイト(『教えて!goo』の質問掲示板)がいつまでも存続するとは限らないので当wikiでリンク先の説明内容の概要を述べておきます。
 
 
まず、ゲーム制作では画面のチラツキを押さえるために、ほとんどのゲームで「ダブルバッファリング」という手法が必要になります。
 
そして、ゲーム開発では、PNGなどの背景の透過のある画像が必要です。なぜなら、もし背景を透過させないと、たとえばマップ上を歩くキャラクター画像を背景上に表示したい場合でも、キャラの周囲の画像ファイル幅の四角い枠ごと表示されてしまうからです。そのせいで、背景の一部が、キャラ周囲の四角い枠で塗りつぶされてしまいます。
 
つまり、ファミコンのスーパーマリオ1やドラクエ1のようなゲームですら、Windowsでは、キャラクター画像の周囲を透過させないと、そういうシステムのゲームは作成できないのです。
 
 
よってゲームのキャラクターチップ画像の作成のため、ビットマップ画像には透過の情報がないので、PNG画像を使う必要があります。
 
 
DirectX以外の GDI や CImage の提供する関数群(たとえば CImage の Draw 関数など)を使うことで、チラツキはありますが、とりあえず、マップ上にキャラクターチップのPNG画像の背景部を透過させる事だけなら可能です。
 
しかし、Windows標準の GDI+ や CImage の提供する関数群は、ダブルバッファリングに対応していないのです。一方、Windowsが標準で提供するダブルバッファ用のBitBlt などの関数は ビットマップ用に作成されているので、その際に HBITMAP ハンドルを定義して画像をそのハンドルに代入しなければいけないのですが、そのHBIMTMAPへの代入の際に(元のPNG画像には存在していた)透過情報が失われてしまい背景が塗りつぶされているビットマップ画像に変換されてしまうので、もはやキャラクター周囲が透過しなくなり、せっかくPNG画像を使っていた意味が無くなってしまいます。
 
このため、GDI+やCImageによる、提供されたAPIをそのまま利用するような標準的な方法では(あくまで「標準的な」との条件付きですが)、標準の方法では絶対にPNG画像のダブルバッファができないのです。
 
非標準な方法なら、可能です。ビットマップ関連の関数には、画像を1ドットずつ読み取って特定の一色を透過させる機能があるので(Win2000以降なら「TransparentBlt」という関数があります)、そういった関数を利用する方法もあります。ですが、それだと、
:・特定の一色が使用不可能になる欠点がある事。また、もしキャラクターの画像内部にその色が使われていると、キャラクターが透過してしまい、ゲーム中での画像バグになっていまう。
:・わざわざ透過専用の処理を書く必要があり、労力がかなり増える。
:・PNGなどと違い、画像の国際規格などとしては規格化されてないので、他のアプリでは使い回しが聞かない。
などの欠点があり、大変に不便です。
 
あるいは、透過機能をもった独自の画像形式などを作って、それを読み書きする関数を使えば、透過自体は可能ですが、しかし労力が多すぎて、実質的な意味がないです。また、独自機能なので、ハードウェアの支援なども受けられず、処理速度が低下する可能性が高くあり、そういう理由からも実質的な意味がないです。
 
 
なので、透過画像のダブルバッファ対応のため、Windwosゲームプログラミングでは開発ツールの画像ライブラリが、DirectXまたはその互換ライブラリ(たとえば『DXライブラリ』という日本人の作成した無料ライブラリがある)に、事実上の選択肢は限られてきます。
 
原理的には OpneGL など別の画像ライブラリでもレイヤー表現は可能かもしれませんが、せっかく DirectX というゲ-ム用の画像ライブラリがあるのだから、 Windowsゲーム制作では DirectX を用いるほうが合理的でしょう。
 
== サブページへのリンク集 ==