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

削除された内容 追加された内容
半透明レイヤーを重ねるコードを書く際、どうコードを書けばいいかというと、答えは直感に反しますが、答えは、レイヤーで隠される画像側のプログラムのほうにコードを書くことになるかと思います。(隠す側の画像のプログラムではないのです。)
半透明レイヤーの問題の解決策。隠される側の画像のコードに、半透明処理を書く必要がある。
819 行
学校の授業だと関数や構造体などによる階層化の手法を習うので、初心者はついつい階層化したくなりがちなので、ソレを意識的に封印する必要があります。制作開始の直後はまだ、階層化のタイミングではないのです。
 
 
==== Windowsによる画面消去 ====
== 画像関係 ==
=== 半透明のレイヤー合成を使いたい場合 ===
たとえばRPGでは、戦闘に入ったときなど、マップ画面の上に半透明の黒レイヤーでマップをやや隠して、その上に戦闘画面の画像を描画したいような場合もあるかと思います。
 
RPGツクール作品とかウディタ作品とかの戦闘シーンでも、そういう描画のゲームがよくあります。
 
もし、自前のプログラムでこういう半透明レイヤーを描画したい場合は、GDI+ のインクルードで出来ます。または、最初から同等の命令が組み込んである C# などを使えば出来ます。
 
Win32API で半透明レイヤーを使いたい場合の方法については、wikibooks では『[[Windows API/画像の操作]]』に説明があります。
 
Direct X を使わなくても、Windows 製のゲームで半透明レイヤーの画像合成をする事は可能です。
 
 
なお、実際にそのまま半透明レイヤーを乗せると、描画に少し時間(コンマ数秒ほど)が掛かります。
 
 
このため、もしも、キー入力するたびに背景ごと毎回描画してしまうと、画面がチラついてしまいます。
 
 
なので、対策として、たとえば、
:裏画面の描画を使うとか、
:または、(win32 API やGDI + だけのプログラミングをあきらめて) Direct X を使うなど、
いろいろと対策しましょう。
 
 
 
半透明レイヤーを重ねるコードを書く際、どうコードを書けばいいかというと、答えは直感に反しますが、答えは、レイヤーで隠される画像側のプログラムのほうにコードを書くことになるかと思います。(隠す側の画像のプログラムではないのです。)
 
たとえば、戦闘中に背景でマップ画面が半透明の黒レイヤーで隠されている場合、戦闘画面用コードではなく、マップ画面の描画コード側に、半透明処理を描くことになります。このため、フラグ管理をする事になり、たとえば「レイヤー変数 reiyaa が 1なら、このマップ画像に半透明レイヤーを載せる」のようなコードをマップ側に書く必要があるのです。
 
コレはなぜそうなるかというと、理由は、windowsでは何故かHDCで宣言した画像ハンドルをグローバル変数としては保管できないからです。形式的にグローバル変数として宣言すれば、コンパイルは通りますが、しかし関数の終了時にwindowsが勝手に画像データを消去してしまうので、このときに半透明処理の演算結果も処理されてしまいます。(後述の別の節でも説明しましたが、つまりwindowsでは、何故か画像データをグローバル変数的に別の関数から呼び出すことが出来ないのです。)
 
winodwsには、こういった制約があるので、なので戦闘画面の背景マップの例の場合なら、どうすれば背景マップだけ黒色の半透明レイヤーで隠せるかというと、結果的にマップ画面側に黒色の半透明レイヤー処理を書かなければなりません。(でないと、レイヤーが無効になったりします。)
 
そして、半透明レイヤーで演算したあとに、最後に裏画面を本画面に転写すればいいのです。
 
 
==== Windowsによる画面消去 ====
Windowsでは、プログラマーが画面クリアの命令を書いてなくても、OSがなんらかの理由で強制的にいったん画面クリアする場合があります。
 
1,969 ⟶ 2,007行目:
と比べると、符号がいくつも間違っており(1個目と2個目と4個目が違う)、解決策2ではエラーの波及が大きいことが分かります。
 
== 画像関係 ==
=== 半透明のレイヤー合成を使いたい場合 ===
たとえばRPGでは、戦闘に入ったときなど、マップ画面の上に半透明の黒レイヤーでマップをやや隠して、その上に戦闘画面の画像を描画したいような場合もあるかと思います。
 
RPGツクール作品とかウディタ作品とかの戦闘シーンでも、そういう描画のゲームがよくあります。
 
もし、自前のプログラムでこういう半透明レイヤーを描画したい場合は、GDI+ のインクルードで出来ます。または、最初から同等の命令が組み込んである C# などを使えば出来ます。
 
Win32API で半透明レイヤーを使いたい場合の方法については、wikibooks では『[[Windows API/画像の操作]]』に説明があります。
 
Direct X を使わなくても、Windows 製のゲームで半透明レイヤーの画像合成をする事は可能です。
 
 
なお、実際にそのまま半透明レイヤーを乗せると、描画に少し時間(コンマ数秒ほど)が掛かります。
 
 
このため、もしも、キー入力するたびに背景ごと毎回描画してしまうと、画面がチラついてしまいます。
 
 
なので、対策として、たとえば、
:裏画面の描画を使うとか、
:または、(win32 API やGDI + だけのプログラミングをあきらめて) Direct X を使うなど、
いろいろと対策しましょう。
 
 
 
半透明レイヤーを重ねるコードを書く際、どうコードを書けばいいかというと、答えは直感に反しますが、答えは、レイヤーで隠される画像側のプログラムのほうにコードを書くことになるかと思います。(隠す側の画像のプログラムではないのです。)
 
たとえば、戦闘中に背景でマップ画面が半透明の黒レイヤーで隠されている場合、戦闘画面用コードではなく、マップ画面の描画コード側に、半透明処理を描くことになります。このため、フラグ管理をする事になり、たとえば「レイヤー変数 reiyaa が 1なら、このマップ画像に半透明レイヤーを載せる」のようなコードをマップ側に書く必要があるのです。
 
コレはなぜそうなるかというと、理由は、windowsでは何故かHDCで宣言した画像ハンドルをグローバル変数としては保管できないからです。形式的にグローバル変数として宣言すれば、コンパイルは通りますが、しかし関数の終了時にwindowsが勝手に画像データを消去してしまうので、このときに半透明処理の演算結果も処理されてしまいます。(別の節でも説明しましたが、つまりwindowsでは、何故か画像データをグローバル変数的に別の関数から呼び出すことが出来ないのです。)
 
winodwsには、こういった制約があるので、なので戦闘画面の背景マップの例の場合なら、どうすれば背景マップだけ黒色の半透明レイヤーで隠せるかというと、結果的にマップ画面側に黒色の半透明レイヤー処理を書かなければなりません。(でないと、レイヤーが無効になったりします。)
 
そして、半透明レイヤーで演算したあとに、最後に裏画面を本画面に転写すればいいのです。