トップページ > 過去ログ > 記事閲覧
裏画面に対するブレンド
名前:レッド 日時: 2008/09/15 11:36

いつもお世話になっております。 今回は、ある領域の半透明化について、皆様のお知恵にすがりたく参りました。 現在、RPGのようなゲームを作成しております。 登場人物の台詞やプレイヤーのコマンドといった文字が表示される領域 (メッセージウィンドウと呼んでます)を半透明にして、 メッセージ領域の後ろに描画された画像も表示したいと考えています。 例えばメッセージ領域が青の半透明ならば、 メッセージ領域の後ろに描画されている画像が青みがかって表示される、 といったような感じです。 メッセージ領域の裏側には背景やキャラクターなど 既に複数の画像を描画しているので、 2枚の画像をブレンドするDrawBlendGraphでは思い通りにある領域全体だけを透過する、 といったことができません。 メッセージウィンドウ以外の全ての画像をまず全て裏画面に描画し、 裏画面全体をGetDrawScreenGraphで取り込み、 その取り込んだ画像に対してメッセージ領域をブレンドする、 という処理を考えたのですが、これは効率的にどうなのでしょうか。 メッセージ領域の全ての画像を半透明化するにはどうしたらよいのでしょう。ご教授願います。 また、動的に2次元配列をnewによって確保したいと考えています。Width×Height個のメモリを確保したく以下のコードを書いたのですが、「'int *' 型は 'int' 型に変換できない」と怒られてしまいました。 int *Map=new int[Width]; for(int i=0;i<Width;i++) Map[i]=new int[Height]; どうすれば、Width×Height分の領域をnewを使って確保できるのでしょうか。 (WidthとHeightの値はプログラムを実行してからでないとわかりません) ついでで誠に申し訳ないのですが、よろしければ教えて頂きたいと思います。

Page: 1 |

Re: 裏画面に対するブレンド ( No.1 )
名前:優柔不断 日時:2008/09/15 13:13

>動的に2次元配列をnewによって確保したいと考えています。Width×Height個のメモリを確保したく以下のコードを書いたのですが、 >「'int *' 型は 'int' 型に変換できない」と怒られてしまいました。 Mapの型をint**にしてください。
Re: 裏画面に対するブレンド ( No.2 )
名前:レッド 日時:2008/09/15 14:18

優柔不断さん、ご返信誠にありがとうございます。 コードを以下のように書き直したのですが、 「'int *' 型は 'int * *' 型に変換できない」 とのエラーが出ます。 int** Map; Map=new int[Width+3];//この行でエラー for(int i=0;i<Width+3;i++) Map[i]=new int[Height]; 最初はint**型で2次元の動的配列を作ろうとしていたのですが、 他のC++について解説しているサイトを見ると int*型を用いて2次元のメモリを確保していたため、 途中からint*にしていました。 基本的なことで誠に申し訳ございません。
Re: 裏画面に対するブレンド ( No.3 )
名前:IW 日時:2008/09/15 16:01

>これは効率的にどうなのでしょうか。  描画したデータをメモリに書き戻すことになるのでちょっと重そうですね。 >メッセージ領域の全ての画像を半透明化するにはどうしたらよいのでしょう  単純に考えるなら 1 メッセージウィンドウの下になる背景を描く 2 GetDrawBlendMode()で現在のブレンドステータスを保持する 3 SetDrawBlendMode()で半透明指定(DX_BLENDMODE_ALPHA)をする 4 メッセージウィンドウを描く 5 2で保持したステータスを SetDrawBlendMode()で指定して元に戻す 6 メッセージウィンドウ上のメッセージを描く  でいいのではないでしょうか。
Re: 裏画面に対するブレンド ( No.4 )
名前:レッド 日時:2008/09/15 17:17

IWさん、返信誠にありがとうございます。 お恥ずかしいことに私、 GetDrawBlendMode() と DrawBlendGraph の動きを勘違いしておりました。 てっきり、DrawBlendGraphでないと画像のブレンドができないものと思い込んでおりました・・・。 メッセージウィンドウの半透明化につきましては、 IWさんのやり方をさせて頂きます。 お騒がせして誠に申し訳ございませんでした。
Re: 裏画面に対するブレンド ( No.5 )
名前:優柔不断 日時:2008/09/16 00:20

>Map=new int[Width+3];//この行でエラー int*の動的配列を用意する必要があります。
Re: 裏画面に対するブレンド ( No.6 )
名前: 日時:2008/09/16 01:01

> int** Map; > Map=new int[Width+3];//この行でエラー 型がまるっきり違います。 Mapはint**型ですが、 ここでnewが返すのはint*型になります。 優柔不断さんが仰るとおりint*型の配列が必要です まず、intのポインタのポインタ変数を宣言します。 int** Map; 次に、このポインタのポインタに対し、 intのポインタの配列を確保 Map = new int* [M]; 用意したM個のポインタのそれぞれに、 N個の領域をそれぞれ確保します。 for( int i = 0; i < M; i++ ){ Map[ i ] = new int [N]; } ただし、これらの領域はMap[0][0]のように 扱うことは出来ても、メモリ領域上では まとまっている訳ではないので扱いには 注意が必要です。 開放も確保したそれぞれの配列と Mapに対して行う必要があります。 C/C++での基礎部分ですので、上記の説明で わからないなら無理に使わない方が無難です。
Re: 裏画面に対するブレンド ( No.7 )
名前:レッド 日時:2008/09/16 16:39

優柔不断さん、通さん、返信誠にありがとうございます。 おかげさまで任意のサイズの2次元配列を動的に確保することができました。 細かい説明、本当にありがとうございます。 基本的な事柄でお騒がせしてしまい、本当に申し訳ございません。 精進するよう努力いたします。 本当にありがとうございました。

Page: 1 |