トップページ > 記事閲覧
マスク画像の拡大縮小
名前:だんごさん 日時: 2014/07/12 16:09

マスクを表示させるDrawMaskですが、これの拡大縮小ができるものはないでしょうか? ウィンドウを自由に変形できるようにしているのですが、DrawMaskだと固定サイズしか表示できないので困っています。 もし差支えなければ作成していただけませんでしょうか? よろしくお願いいたします。 [追記] 現在、事前に用意したソフトイメージ画像で、マウスの座標判定を行おうとしています。 クリックしたときにソフトイメージの色をマウス座標と比較、取得して判定を行う感じです。(これが正当な方法かは分かりませんが…) ただ同様にウィンドウのサイズが変更可能なため、用意したソフトイメージも拡大縮小を行いたいのですがどのようにすればよいでしょうか?
メンテ

Page: 1 | 2 |

Re: マスク画像の拡大縮小 ( No.1 )
名前:管理人 日時:2014/07/12 19:23

DrawMask の拡大描画版はありません すぐに実装するのも難しいので、今のところ MakeScreen と SetBlendGraphParam を使用した 擬似マスク処理しか方法がありません 1.MakeScreen の第三引数を TRUE にしたアルファチャンネル付きの、  マスクを適用したい描画を一時的に保存しておくためのグラフィックハンドル(A)と、  マスク画面の代わりとなるグラフィックハンドル(B)を作成 2.マスク画像としたい画像を LoadMask ではなく、LoadGraph で読み込む、ただ、LoadGraph の  前に SetUsePremulAlphaConvertLoad( TRUE ) ; を実行して「乗算済みα」の画像として読み込むようにしておく 3.メインループ開始 4.SetDrawScreen で (A)を描画対象にして、マスクを適用したい描画を行う、  このとき描画ブレンド設定は DX_BLENDMODE_PMA_ALPHA などの乗算済みαの画像を描画  する設定にしておく必要があります 5.SetDrawScreen で (B)を描画対象にして、適用したいマスク画像を描画する  マスク画像と言っても「マスク画像として使用する普通の画像」なので、描画には  DrawGraph や DrawExtendGraph などの通常の画像を描画する関数を使用して行います  尚、このとき描画ブレンド設定は DX_BLENDMODE_PMA_ALPHA などの乗算済みαの画像を描画  する設定にしておく必要があります 6.SetDrawScreen で描画対象を裏画面に変更 7.SetBlendGraphParam で第一引数に(B)を、第二引数を DX_BLENDGRAPHTYPE_ALPHA にして呼び、  DrawGraph で描画する画像に対して(B)のα値を適用するように設定する 8.DrawGraph で画面に(A)を描画する  ( SetBlendGraphParam の設定によって、(B)のα値と合成されて描画されるので、擬似的にマスクの処理を行うことができます )  尚、このときの描画ブレンド設定も DX_BLENDMODE_PMA_ALPHA などの乗算済みαの画像を描画  する設定にしておく必要があります 上記で頻繁に出てくる「乗算済みα」についての解説はこちらをご覧ください http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html アルファチャンネルを持つ画像に対して描画を行う場合、「乗算済みα」を使用しないと正常な 描画結果が得られないので、アルファチャンネル付きの画面用画像を MakeScreen で作成した場合は 必ず使用することになります 上記の方法を使って擬似マスク処理を行うサンプルを作成しましたので、よろしければご覧になってみてください 実行すると Test1.bmp の形をしたマスクが左右に移動します #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int SubScreenHandle ; int MaskScreenHandle ; int i ; int GrHandle ; int x ; int add_x ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 『マスクを適用する描画結果を一時的に保存するための画面』用のグラフィックハンドルを作成 SubScreenHandle = MakeScreen( 640, 480, TRUE ) ; // 『適用するマスクとなる画面』用のグラフィックハンドルを作成 MaskScreenHandle = MakeScreen( 640, 480, TRUE ) ; // 乗算済みαのグラフィックハンドルを作成する設定にする SetUsePremulAlphaConvertLoad( TRUE ) ; // 画像の読み込み GrHandle = LoadGraph( "Test1.bmp" ) ; // 設定を元に戻す SetUsePremulAlphaConvertLoad( FALSE ) ; // 画面内を左右に移動するマスク画像の移動処理用変数の初期化 x = 0 ; add_x = 8 ; // メインループ while( ProcessMessage() == 0 ) { // 画面内を左右に移動するマスク画像の移動処理 x += add_x ; if( x <= 0 || x >= 640 ) { add_x = -add_x ; } // 描画先を『マスクを適用する描画結果を一時的に保存するための画面』用のグラフィックハンドルに変更 SetDrawScreen( SubScreenHandle ) ; // 画面を初期化 ClearDrawScreen() ; // 乗算済みαの画像を描画する設定にする SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ; // 読み込んだ画像を横に並べて描画 for( i = 0 ; i < 6 ; i ++ ) { DrawGraph( i * 119, 0, GrHandle, TRUE ) ; } // 描画先を『適用するマスクとなる画面』用のグラフィックハンドルに変更 SetDrawScreen( MaskScreenHandle ) ; // 画面を初期化 ClearDrawScreen() ; // 乗算済みα描画をする設定にする SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ; // 画面内を左右に移動するマスク画像の描画 DrawGraph( x, 0, GrHandle, TRUE ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 画面を初期化 ClearDrawScreen() ; // 描画する画像にブレンドする画像として『適用するマスクとなる画面』用のグラフィックハンドルを設定 SetBlendGraphParam( MaskScreenHandle, DX_BLENDGRAPHTYPE_ALPHA ) ; // 乗算済みαの画像を描画する設定に変更 SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ; // 『マスクを適用する描画結果を一時的に保存するための画面』用のグラフィックハンドルを描画 // SetBlendGraphParam の設定により MaskScreenHandle のα値と合成されて描画されます ) DrawGraph( 0, 0, SubScreenHandle, TRUE ) ; // ブレンドする画像の設定を解除 SetBlendGraphParam( -1, -1 ) ; // 裏画面の内容を表画面に変更 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } あと、今回のサンプルプログラムを作成する過程で SetBlendGraphParam 関係のバグが見つかり、 修正しましたので、お手数で申し訳ありませんがこちらのバージョンをお使いください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) > ただ同様にウィンドウのサイズが変更可能なため、用意したソフトイメージも拡大縮小を行いたいのですがどのようにすればよいでしょうか? ウインドウのサイズが変更可能とのことですが、サイズの変更はどのようなタイプでしょうか? 1.ウインドウのサイズを変更すると、ウインドウのサイズに応じてウインドウ内の描画が単純に拡大される  主にゲームソフトでよくあるタイプ 2.ウインドウのサイズを変更すると、ウインドウのサイズに応じてウインドウ内の描画は拡大されずに、  表示されるもの( 表示される範囲、情報量 )が多くなる一般的なウインドウソフトのタイプ
メンテ
Re: マスク画像の拡大縮小 ( No.2 )
名前:だんごさん 日時:2014/07/12 21:00

ご返答ありがとうございます。 マスク画像については後ほど試してみます。ありがとうございます。 ウィンドウのサイズについてですが、 2の、ウインドウのサイズを変更すると、ウインドウのサイズに応じてウインドウ内の描画は拡大されずに、表示されるものです。 DxLib側ではSetUserWindowで自前にしていますので、最初にデスクトップサイズを取得して描画範囲を設定しています。
メンテ
Re: マスク画像の拡大縮小 ( No.3 )
名前:管理人 日時:2014/07/12 21:37

ご返答ありがとうございます ウインドウ内の描画は拡大されないのですか・・・ としますと > ただ同様にウィンドウのサイズが変更可能なため、用意したソフトイメージも拡大縮小を行いたいのですがどのようにすればよいでしょうか? ウインドウのサイズが変化するとソフトイメージを拡大縮小をしなければならないのは何故なのでしょうか?
メンテ
Re: マスク画像の拡大縮小 ( No.4 )
名前:だんごさん 日時:2014/07/12 23:07

> ウインドウのサイズが変化するとソフトイメージを拡大縮小をしなければならないのは何故なのでしょうか? ただその画像はウィンドウのサイズによって変化するためです。 拡大したマスク画像をもとにマウスの当たり判定を付けたいので、別途判定用画像を用意し、クリックしたときにソフトイメージから マウス座標を元に色を取得し、白なら範囲内というような感じで使用したいと思っています。 マスク画像とソフトイメージの画像のサイズを同期させたい狙いです。 ただ最初に書いた通りこれが正当な方法かはちょっと分からないですが…
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存