トップページ > 記事閲覧
LoadDivMask が一度しか使えない
名前:青虫 日時: 2018/05/24 01:28

こんにちわ、Dxlib にはいつもお世話になっております。 只今、マスク画像を利用した描画をしようとしています。 しかしどういう訳でしょうか、上手くマスクが適用されませんでした。 そこで原因を模索していたのですが、どうやら分割する画像が PNG 画像の時だけ(?)、 LoadDivMask 関数を2回以上呼び出すと、"おかしな動作"をするようです。 この"おかしな動作"と言う表現は、とりあえずプログラムを数回に渡って実行していただくと分かります。 下記にある画像とサンプルコードを準備して、一度だけプログラムを実行します。 次に、/*!ココ!*/と言う部分の5つある LoadDivMask 関数。これらの実行順を適当に並び替えてから、もう一度だけ実行します。 ・・・上記の通りしてみると、マスク画像が1つのハンドルにしか格納されていなかったりなど、正常に動作していない事が分かると思います。 お手数ですが、どうか修正の方よろしくお願いしますm(_ _)m こちらが、実際に使おうとしている PNG 画像です。お手数ですが、ファイル名を「File0014_b64.png」と変更してください。 (サイズが大きいので、読み込みが長いです・・・すみません。) get.secret.jp/pt/file/1527091594.png 以下のコードが、そのバグを再現できるサンプルコードです。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE); //ウィンドウモードに設定 SetGraphMode(640, 480, 32); //DXライブラリの描画可能な領域サイズ設定 if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } SetDrawScreen( DX_SCREEN_BACK ) ; // マスク画面を作成します CreateMaskScreen() ; SetUseMaskScreenFlag(FALSE); // マスクデータをロードします int MaskHandle[2][350]={} , MaskHandle2[3][350]={}; /*!ココ!*/ LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle[0]); LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle[1]); LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle2[0]); LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle2[1]); LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle2[2]); while( !ProcessMessage() && !FillMaskScreen(0) && !ClearDrawScreen() ) { // MaskHandle[0]の描画 if(DrawMask( 0 , 0 , MaskHandle[0][10] , DX_MASKTRANS_NONE ) != 0 ) { DrawBox( 0, 0, 64, 64, GetColor( 0 , 0 , 255 ), TRUE ); } else { SetUseMaskScreenFlag(TRUE); DrawBox( 0 , 0 , 64 , 64 , GetColor( 255 , 0 , 0 ) , TRUE ) ; SetUseMaskScreenFlag(FALSE); } // MaskHandle[1]の描画 if(DrawMask( 128 , 128 , MaskHandle[1][10] , DX_MASKTRANS_NONE ) != 0 ) { DrawBox( 128, 128, 192, 192, GetColor( 0 , 0 , 255 ), TRUE ); } else { SetUseMaskScreenFlag(TRUE); DrawBox( 128 , 128 , 192 , 192 , GetColor( 255 , 0 , 0 ) , TRUE ) ; SetUseMaskScreenFlag(FALSE); } // MaskHandle2[0]の描画 if(DrawMask( 256 , 256 , MaskHandle2[0][10] , DX_MASKTRANS_NONE ) != 0 ) { DrawBox( 256, 256, 320, 320, GetColor( 0 , 0 , 255 ), TRUE ); } else { SetUseMaskScreenFlag(TRUE); DrawBox( 256 , 256 , 320 , 320 , GetColor( 255 , 0 , 0 ) , TRUE ) ; SetUseMaskScreenFlag(FALSE); } // MaskHandle2[1]の描画 if(DrawMask( 192 , 192 , MaskHandle2[1][10] , DX_MASKTRANS_NONE ) != 0 ) { DrawBox( 192, 192, 256, 256, GetColor( 0 , 0 , 255 ), TRUE ); } else { SetUseMaskScreenFlag(TRUE); DrawBox( 192 , 192 , 256 , 256 , GetColor( 255 , 0 , 0 ) , TRUE ) ; SetUseMaskScreenFlag(FALSE); } // MaskHandle2[2]の描画 if(DrawMask( 64 , 64 , MaskHandle2[2][10] , DX_MASKTRANS_NONE ) != 0 ) { DrawBox( 64, 64, 128, 128, GetColor( 0 , 0 , 255 ), TRUE ); } else { SetUseMaskScreenFlag(TRUE); DrawBox( 64 , 64 , 128 , 128 , GetColor( 255 , 0 , 0 ) , TRUE ) ; SetUseMaskScreenFlag(FALSE); } ScreenFlip() ; } // マスクデータを削除します InitMask() ; // マスク画面を削除します DeleteMaskScreen() ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ

Page: 1 |

Re: LoadDivMask が一度しか使えない ( No.1 )
名前:青虫 日時:2018/05/24 01:30

すみません、URLの先頭には http:// をつけてください。
メンテ
Re: LoadDivMask が一度しか使えない ( No.2 )
名前:管理人 日時:2018/05/27 12:36

ご返信が遅くなり申し訳ありません 再現用プログラムを載せていただきありがとうございます 正常に動作しない原因はマスクハンドルの数の限界に達していたからでした マスクハンドルの最大数が 512 と異常に少ない数になっていたので、 グラフィックハンドルなどと同じ 32768 に増やしたところ正常に動作するようになりました こちらに修正版をアップしましたので、よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: LoadDivMask が一度しか使えない ( No.3 )
名前:青虫 日時:2018/06/02 20:14

こちらこそ返信が遅れてしまいました・・・。大変申し訳ありません。 試してみたところ、 LoadDivMask 関数が正常な動作するようになりました!ありがとうございます。 ・・・ただ、今開発中のプロジェクトで DxLib_End 関数を呼び出すと、 「〜〜〜でハンドルされていない例外が発生しました: 0xC0000005: Access violation」 と出るようになってしまいました・・・。 (LoadDivMask 関数の呼び出しに関係なく。上のサンプルコードでは上記のようなエラーが発生しませんでした。) もう一度だけ、以前より自分が使っていたライブラリをリビルドして確認してみましたが、こちらではエラーが発生しませんでした。 以前のライブラリが2017年11月にダウンロードしたモノなので、その間に他の関数になにか変更があってのエラーだと思いますので、 一応そちらの方だけ報告させていただきます。 開発中のプロジェクトでは、画像読み込みの無駄を省くために LoadDivMask 関数から、 SetMaskScreenGraph 関数の使用に変更したので、差支えありません。 (お忙しい中、わざわざご修正していただいたにもかかわらずに、 このような失礼な振る舞いで、大変申し訳ありません・・・。) また話題が変わるのですが、その SetMaskScreenGraph 関数について質問したい事があります m(_ _;)m SetMaskScreenGraph 関数を使ったマスク処理も試していた所、 こちらの関数でマスクスクリーンにセットしたグラフィックハンドルが、 FillMaskScreen 関数でクリアー出来ない事は仕様なのでしょうか? メインループで、裏画面と一律にマスク画面のクリアーも行いたい為、while の条件式内に入れるつもりだったのですが、 イメージと仕様の食い違いがありまして、少し困っています。 他に代用できそうな関数も探してみましたが、 ○ClearDrawScreen 関数では、いちいち SetDrawScreen 関数で描画先を切り替えなくてはいけません。 ○FillGraph 関数では、再読み込みなどで SetGraphMode 関数を呼び出した際にグラフィックハンドルが全て削除される為、  条件式を !FillGraph(MaskScreenHandle, 0, 0, 0, 0) とする場合、関数は失敗を吐くので、条件式が偽になってしまいます。 ・・・などと言った現状です。 知識不足な上、存じ上げないのですが、もしも指定のグラフィックハンドルが使用できるかどうか判断する関数があれば助かるのですが、 そのような関数がございませんか?
メンテ
Re: LoadDivMask が一度しか使えない ( No.4 )
名前:管理人 日時:2018/06/05 01:21

> 以前のライブラリが2017年11月にダウンロードしたモノなので、その間に他の関数になにか変更があってのエラーだと思いますので、 > 一応そちらの方だけ報告させていただきます。 必ずエラーが発生するとのことでしたら、もし不都合がなければ青虫さんが開発中のプロジェクトを ご提供いただけないでしょうか? エラーが発生する箇所を直接確認できれば容易に修正が可能だと思いますので・・・ もしご提供していただける場合は、プロジェクトのフォルダを圧縮した状態でこちら BQE00322(あっとまーく)nifty.com ( (あっとまーく)を@に置き換えてください ) に送ってください m(_ _)m ただ、上記のメールアドレスに一度に送れる容量が10MB程度なので、もしそれ以上のサイズの場合は 何処かのファイルアップローダーにアップしたあと、上記のメールアドレスにアップ先を教えてください m(_ _;m > こちらの関数でマスクスクリーンにセットしたグラフィックハンドルが、 > FillMaskScreen 関数でクリアー出来ない事は仕様なのでしょうか? はい、SetMaskScreenGraph は標準のマスクスクリーン機能とは別に後から追加した毛色の異なるマスク機能なので FillMaskScreen や DrawMask などの標準のマスクスクリーンの機能は使うことができません ご面倒で申し訳ありませんがクリアの際は SetDrawScreen で描画対象にしたうえで ClearDrawScreen でクリアしてください > 知識不足な上、存じ上げないのですが、もしも指定のグラフィックハンドルが使用できるかどうか判断する関数があれば助かるのですが、 > そのような関数がございませんか? GetGraphSize の戻り値が -1 になるかどうかで有効かどうかを判断できます
メンテ
Re: LoadDivMask が一度しか使えない ( No.5 )
名前:青虫 日時:2018/07/06 00:13

またしても返信が遅くなって大変申し訳ありません・・・。諸事情でネットが使えなかったので、どうしても返信が出来ない状況でした。 現状としましては、どうしてもエラーが発生してしまうのでライブラリを以前のモノに戻して、代わりに SetMaskScreenGraph 関数を利用しています。 特に処理に問題はなく、良好な進行状況です。 > 必ずエラーが発生するとのことでしたら、もし不都合がなければ青虫さんが開発中のプロジェクトを > ご提供いただけないでしょうか? プロジェクトのファイルサイズが200MB弱に及ぶ上、アップローダーに上げるのは正直不安なので、 申し訳ないのですが遠慮させていただきます・・・。お気遣いを無下にするようで本当にごめんなさい。 繰り返して言う事になりますが、修正の方ありがとうございました!
メンテ
Re: LoadDivMask が一度しか使えない ( No.6 )
名前:管理人 日時:2018/07/06 00:53

了解です また何かありましたらお書き込みください m(_ _)m
メンテ

Page: 1 |

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

   クッキー保存