トップページ > 記事閲覧
DrawMaskでマスクを裏画面以外に書き込むとエラー
名前:ttanaka 日時: 2013/08/04 03:19

お世話になっております。 特定の条件下において DrawMask()を使用するとエラーになることから、 私の記法に問題があるのかライブラリ自体のバグであるのか確認したく書き込み致します。 現在、1024*768および800*600の2種類の解像度に対応させるため、通常は1024*768の画面に描画し、 800*600表示モードが選択された場合は、1024*768の画面を縮小して表示する、という手法を取っています。 SetGraphMode(800, 600, 16);//ウィンドウサイズを800*600にする int screen = MakeScreen(1024, 768);//ここに描かれたものを最終的に縮小表示する SetDrawScreen(screen);//書き込み先をscreen画面に設定 SetDrawMode(DX_DRAWMODE_BILINEAR); /* ここでscreen画面に対して色々と書き込む */ SetDrawScreen(DX_SCREEN_BACK); ClearDrawScreen();//裏画面をクリア DrawExtendGraph(0, 0, 800, 600, screen, FALSE);//screen画面を裏画面へ縮小してコピー ScreenFlip();//裏画面を表画面へ反映 SetDrawScreen(screen); ClearDrawScreen();//screen画面をクリア 1024*768の画面を800*600へ縮小して表示する方法自体はこれで問題はないかと思います。 ただ、/* ここでscreen画面に対して色々と書き込む */ の箇所に以下の記述を埋め込むと例外が発生します。 int mask_handle = LoadMask("mask.png"); CreateMaskScreen(); DrawMask(0, 0, mask_handle, DX_MASKTRANS_BLACK); // ← この行で例外が発生します DeleteMaskScreen(); DeleteMask(mask_handle); 画面の縮小を行わず裏画面に対しDrawMaskを行うと例外は発生しないことから、 screen画面に対しDrawMaskを行うことが問題の原因かと思われます。 現在の仕様では、MakeScreenにより作成した画面に対しDrawMaskでマスクを書き込むことは出来ないのでしょうか。 もしくは、この記法が間違っているのでしょうか。 宜しくお願いいたします。
メンテ

Page: 1 |

Re: DrawMaskでマスクを裏画面以外に書き込むとエラー ( No.1 )
名前:ttanaka 日時:2013/08/04 13:01

追記です。 今回マスク画像として使用したもの(mask.png)は1024*768のサイズのものでした。 マスク画像を800*600のものに変更したところ、例外は発生せずマスクを適用した描画が行われました。 しかし画面自体を1024*768から800*600へ縮小しているので、当然ながらマスク画像も縮小されてしまい、 結果として意図した位置とは異なる場所にマスクが適用されてしまいました。 (800*600のマスク画像がさらに0.78125倍に縮小されます)
メンテ
Re: DrawMaskでマスクを裏画面以外に書き込むとエラー ( No.2 )
名前:ttanaka 日時:2013/08/06 23:34

どうやら上記の例では、800*600モードの場合はマスク画像としてこれより小さいサイズの画像は使用できますが、 このサイズよりも少しでも大きいとエラーが発生するようです。 問題の回避のために通常はscreen画面に描画し、マスクのみ裏画面に描画するなどを試してみたのですが、どれもうまく行かず… 何か良い方法は無いものでしょうか。
メンテ
Re: DrawMaskでマスクを裏画面以外に書き込むとエラー ( No.3 )
名前:管理人 日時:2013/08/08 23:24

すみません、マスクの処理が「画面サイズ以上のサイズの仮画面を描画対象にされる」ことを想定していませんでした 修正版をアップしましたので、よろしければお試しになってみてください 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)」をして下さい)
メンテ
Re: DrawMaskでマスクを裏画面以外に書き込むとエラー ( No.4 )
名前:ttanaka 日時:2013/08/09 21:29

管理人様 素早いご対応ありがとうございます。 修正版で確認をしたところ、確かにエラーは出現しなくなったのですが、 マスクが一定のサイズで切れて表示されてしまいます。 お忙しい中大変申し訳ありませんが、ご対応願えませんでしょうか。 以下状況です。 1024*768の画面を縦横それぞれ1.28で割ると800*600になります。 800*600の画面に縮小することで、確かにマスクは縮小されるのですが、 マスクの表示範囲はそれを更に1.28で割った625*468になってしまいます。 サンプルとして使用したマスク画像(1024*768)です。 https://dl.dropboxusercontent.com/u/1926851/mask.png これを800*600に縮小した結果です。625*468の範囲内しかマスクが適用されていません。 https://dl.dropboxusercontent.com/u/1926851/sample.png 再現時のコードです。 https://dl.dropboxusercontent.com/u/1926851/Main.cpp 以下Main.cppの内容です。 #include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウィンドウモードで起動 ChangeWindowMode(true); //画面サイズ SetGraphMode(800, 600, 16); //DXLib初期化 if(DxLib_Init() == -1){ return -1; } //ここに描かれたものを最終的に縮小表示する int screen = MakeScreen(1024, 768); SetDrawScreen(screen); SetDrawMode(DX_DRAWMODE_BILINEAR); //マスク画像をロード int mask_handle = LoadMask("mask.png"); CreateMaskScreen(); DrawMask(0, 0, mask_handle, DX_MASKTRANS_BLACK); //screen画面上にマスクを描き、その上から画面を黄色で塗りつぶす DrawBox(0, 0, 1024, 768, GetColor(255, 255, 0), TRUE); //マスク画面を解放 DeleteMaskScreen(); DeleteMask(mask_handle); //描画先を裏画面へ SetDrawScreen(DX_SCREEN_BACK); //screen画面に描画した マスク+黄色の塗りつぶし を縮小して裏画面にコピー DrawExtendGraph(0, 0, 800, 600, screen, FALSE); //表示 ScreenFlip(); WaitKey() ; // キー入力待ち DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ
Re: DrawMaskでマスクを裏画面以外に書き込むとエラー ( No.5 )
名前:管理人 日時:2013/08/11 14:56

すみません、DrawMask の描画範囲が原点( 0, 0 )から画面のサイズとなっていました 修正版をアップしましたので、よろしければお試しください 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)」をして下さい)
メンテ
Re: DrawMaskでマスクを裏画面以外に書き込むとエラー ( No.6 )
名前:ttanaka(解決) 日時:2013/08/11 18:30

管理人様 ご対応ありがとうございます。 解像度の変更にマスクを対応させることができました。 本当にすぐに対処していただき、感謝の言葉もありません。
メンテ

Page: 1 |

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

   クッキー保存