トップページ > 記事閲覧
マスク用の画像を拡大縮小等を行いたい
名前:ben 日時: 2015/06/21 15:57

マスク用の画像を拡大縮小や自由変形などの処理をしたものを マスクデータとして使用したいのですが、そのような機能はありますか? 具体的には、「DrawRotaGraph3」や「DrawModiGraph」のマスクハンドル版です。
メンテ

Page: 1 |

Re: マスク用の画像を拡大縮小等を行いたい ( No.1 )
名前:管理人 日時:2015/06/23 23:26

そのような機能が無かったので、機能を追加しました ただ、現在のマスクスクリーンへの描画を行う DrawMask や SetDataToMask などに拡大描画や変形描画を 追加すると関数の数が結構増えてしまうので、MakeScreen で作成した 「描画対象にできるアルファチャンネル付きのグラフィックハンドル」をマスクスクリーンとして 使用できるようにする機能を追加しました よろしければこちらをダウンロードしてください https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました // マスクスクリーンとして使用するグラフィックのハンドルを設定する、-1を渡すと解除 // ( 引数で渡すグラフィックハンドルは MakeScreen で作成した // 「アルファチャンネル付きの描画対象にできるグラフィックハンドル」である必要があります // ( アルファチャンネルがマスクに使用されます ) ) int SetMaskScreenGraph( int GraphHandle ) ; MakeScreen の第三引数に TRUE を渡して呼び出すと 「描画対象にできる( SetDrawScreen の引数として渡せる )アルファチャンネル付きのグラフィックハンドル」 が作成できますが、そのグラフィックハンドルを SetMaskScreenGraph に引数として渡して呼び出すと そのグラフィックハンドルがマスクスクリーンとして機能します ( そしてグラフィック中のアルファチャンネルの部分が「マスク」として使用されます ) MakeScreen で作成したグラフィックハンドルは SetDrawScreen に引数として渡すことで描画対象とすることができますので、 マスクスクリーンへの書き込みは DrawMask 等ではなく通常の描画関数である DrawGraph や DrawBox などで行います この機能を使用して画像を DrawExtendGraph で拡大したものをマスクとして使用するサンプルを作成してみましたので、 よろしければご覧ください #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GraphHandle ; int ScreenHandle ; int x, add ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込み GraphHandle = LoadGraph( "Test1.bmp" ) ; // マスクスクリーンに使うアルファチャンネル付きの描画対象にできるグラフィックハンドルを作成 ScreenHandle = MakeScreen( 640, 480, TRUE ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // マスク機能の初期化を行う CreateMaskScreen() ; // マスクスクリーンに使用するグラフィックハンドルとして MakeScreen で作成したグラフィックハンドルをセット SetMaskScreenGraph( ScreenHandle ) ; // 画像の移動処理用の変数を初期化 x = 0 ; add = 8 ; // メインループ while( ProcessMessage() == 0 ) { // 画像の移動処理 x += add ; if( x < 0 || x > 640 ) { add = -add ; } // 描画先をマスク用の画像に変更 SetDrawScreen( ScreenHandle ) ; // マスク用の画像をクリア ClearDrawScreen() ; // 画像を横に2倍拡大して描画 DrawExtendGraph( x, 0, x + 119 * 2, 480, GraphHandle, TRUE ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 裏画面をクリア ClearDrawScreen() ; // マスクを有効にする SetUseMaskScreenFlag( TRUE ) ; // 画面いっぱいに黄色い四角形を描画 DrawBox( 0, 0, 640, 480, GetColor( 255,255,0 ), TRUE ) ; // マスクを無効にする SetUseMaskScreenFlag( FALSE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } あと、SetDrawBlendMode( DX_BLENDMODE_ALPHA, 128 ) ; などを使用して「マスクスクリーンに見立てる描画対象にできるグラフィックハンドル」に対して 半透明の描画を行った場合、マスクも半透明になりますので、それを利用して半透明マスクの効果を得ることもできます、 これは今までのマスク機能には無かったので新しい表現ができるかもしれません よろしければお試しください m(_ _)m
メンテ
Re: マスク用の画像を拡大縮小等を行いたい ( No.2 )
名前:ben(解決) 日時:2015/06/24 02:32

お忙しい中ありがとうございます!早速使ってみたいと思います!
メンテ
Re: マスク用の画像を拡大縮小等を行いたい ( No.3 )
名前:ben 日時:2015/06/24 15:37

すみません、上記の処理を自作のゲームに組み込んだところ、正しく動きませんでした。 似たような処理をサンプルプログラムのメイン処理に直接書き込んだ場合はうまく動くのですが、 専用のクラスに処理を移した場合マスク処理がかからなかったり、その前後のマスク描画がおかしくなったりします。 サンプル:ttp://w w w1.axfc.net/u/3491635?key=dxlib_ben (NGワードにひっかかったのでwの間にスペースが入っています) それと、厚かましいようで恐縮ですが、これと逆の「透過していない場所に描く」や 「従来のマスク処理と同様、白い場所or黒い場所にだけ描く」ようなバージョンも欲しいです。
メンテ
Re: マスク用の画像を拡大縮小等を行いたい ( No.4 )
名前:管理人 日時:2015/06/25 01:24

アップしていただいたサンプルを拝見しました サンプルコードの中では CreateMaskScreen() ; が呼ばれていなかったので Curtain.cpp の // マスクスクリーンに使用できるようにする SetMaskScreenGraph(mScreen_Mask); ↑こちら前に CreateMaskScreen() ; という記述を増やしてみたところ、マスク処理が実行されるようになりました これが benさんが遭遇された不具合の原因ではないと思いますが、よろしければお試しください m(_ _)m > 「透過していない場所に描く」 SetMaskReverseEffectFlag( TRUE ) ; を実行するとマスクスクリーンの効果が逆転しますので、よろしければお使いください ( 元に戻す場合は SetMaskReverseEffectFlag( FALSE ) ; を実行してください ) > 「従来のマスク処理と同様、白い場所or黒い場所にだけ描く」 すみません、もう少し詳しくご説明していただけないでしょうか? ( アルファチャンネルのアルファ値ではなくRGBの色で判断してほしいということでしょうか? )
メンテ
Re: マスク用の画像を拡大縮小等を行いたい ( No.5 )
名前:ben(解決) 日時:2015/06/25 13:41

ソースを記述したところ、無事に動作しました!ありがとうございます! 「従来のマスク処理〜」については、「透過してない場所に描く」機能さえあれば不要なのでこのままで問題ありません。
メンテ

Page: 1 |

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

   クッキー保存