トップページ > 過去ログ > 記事閲覧
Paint()で色漏れします。
名前:お父さん 日時: 2007/03/17 22:38

管理人様 いつもお世話になります。このたび、息子のパソコンにDxLibraryをインストールしましたところ、 SetUse3DFlag()をTRUEにすると、画像が正常に描画されませんでした。それで、ビデオカードが古いせいかと思 い、SetUse3DFlag()をFALSEにしますと、普通の描画はうまく行くのですが、Paint()を使うと、色漏れがして、 画面全体を塗りつぶしてしまいます。 ちなみに、DxLibraryのバージョンはBCC55用の2.22eですが、ver2.19bでは、Paint()の色漏れはありませんで した。 パソコンは、NEC LaVie NX(LW23/4)、OSはWindows98です。また、Log.txtには、ビデオカードドライバ macxdd32.dll、ドライバ記述 3D RAGE LT PRO(日本語)となっています。 息子のパソコンでも、SetUse3DFlag()が使えるようにできますでしょうか? また、Paint()の色漏れがしないよ う修正していただくことは可能でしょうか? いつも、古いパソコンでご迷惑をおかけして、申し訳ありません。どうかよろしくお願いいたします。

Page: 1 | 2 |

Re: Paint()で色漏れします。 ( No.9 )
名前:管理人 日時:2007/03/24 11:21

 お父さんさんどうも、DXライブラリの管理人です。  Windows98 の環境で調べてみました。  頂いたプログラムを私の環境で実行した場合に色がはみ出てしまうのは、 DrawBox で描かれた四角が閉じていない為に、そこから色が漏れていたという 単純な理由でした(1ドットだけ隙間がある)。  四角が閉じない原因ですが、これは Direct3D の仕様、なのかどうか はわかりませんが、使用するグラフィックチップやドライバの違いで Direct3D を用いて線を描画すると指定した座標から1ドットずれて 描画されたり、指定した座標まで線がのびていなかったりすることが あります。  特定の環境に合わせて、座標がずれることを前提に描画座標を補正すると 確かに補正対象の環境では予定の座標に正しく線が引かれるのですが、それを してしまうと元々座標がずれない環境では補正した分逆にずれてしまうことに なるので、しょうがないので環境によっては隙間が発生したり正しい座標に 描画されないことがあるとしても、とりあえず本来の座標で描画するという ようにしています。  で、私の環境で Windows2000 では色漏れが発生せず Windows98 では 色漏れが発生してしまった原因は正にこれで、どうやら Windows2000 用の グラフィックデバイスのドライバでは正しく線が引かれて隙間の無い箱が 描かれた為その後の Paint で色漏れが発生せず、Windows98 用のドライバ では正しく線が引かれず隙間のある箱が描かれた為にその後の Paint で 色漏れが発生してしまうということのようでした。  そして、これらは全て Direct3D を使用した場合( SetUse3DFlag( TRUE ); ) の話ですので、Direct3D を使用しないようにしました所( SetUse3DFlag( FALSE ); ) お父さんさんから頂いたプログラムでも色漏れが発生しないようになりました。  で、少し疑問なのですが、お父さんさんから頂いたプログラムは SetUse3DFlag(1); の状態、つまり SetUse3DFlag(TRUE); の状態に なっていたのですが(TRUE は 1 FALSE は 0)、同梱されていた 実行可能ファイルもこの状態でコンパイルされたものでしょうか?  もしそうでしたら、とりあえず私の環境で SetUse3DFlag(FASLE); にして コンパイルした実行可能ファイルをアップしましたので、もし宜しければ こちらでも色漏れが発生してしまうかどうか試してみて頂けないでしょうか? http://homepage2.nifty.com/natupaji/temp/PaintTest.zip  ちなみに Ver2.19b では上記の座標ズレの件があるので、デフォルトでは DrawLine, DrawBox, DrawPixel の3つの関数は SetUse3DFlag( TRUE ); と なっていても、Direct3D は使用しないで SetUse3Flag( FALSE ); の場合と 同じ描画ルーチンを使用して描画するようにしていました。(この仕様は後に DrawLine が重すぎるということで止めました)  Ver2.19b の SetUse3Flag( FALSE ); の描画ルーチンを使用した場合に 色漏れが発生しなかったということは、単純な推理では DxLib_Init の後に SetUse3DFlag( FALSE ); を実行すれば現在のバージョンでも色漏れが 発生しなくなる筈です。
Re: Paint()で色漏れします。 ( No.10 )
名前:お父さん 日時:2007/03/24 13:28

管理人様 すみません。今息子のPCを見てきましたが、SetUse3DFlagとSetUseDirectDrawFlagのことがごっちゃになって、 不正確なご返事になっていましたので、とりあえずこの書き込みは削除させていただきます。 のちほどきちんと確かめてから、改めて結果をご報告いたしますので、よろしくお願いします。どうもすみません。
Re: Paint()で色漏れします。 ( No.11 )
名前:お父さん 日時:2007/03/24 13:51

管理人様 息子のPCでチェックした結果をご報告いたします。 @管理人様に送っていただいたプログラムも色漏れがして、画面が真っ赤になりました。 A上記プログラムのPaint命令の部分を削除して四角形を描いてみましたところ、座標はずれずに、きちんと閉じ た四角形が描けました。 B以上より、息子のPCでは、SetUseDirectDrawFlagをFalseにすれば、正常にPaintできますが、 SetUseDirectDrawFlagがTrueの状態ですと、SetUse3DFlagの設定にかかわらず色漏れしてしまうよう です。 以上です。息子のPC特有の現象であれば修正は難しいかとも思いますが、どうかよろしくお願いします。
Re: Paint()で色漏れします。 ( No.12 )
名前:管理人 日時:2007/03/24 15:31

 お父さんさんどうも、DXライブラリの管理人です。  成る程、私の環境で発生した現象とは違う原因のようですね。  私の環境で不具合が確認できない以上、今後のテストは全て お父さんさんに行って頂く必要がありますので、かなり長期戦に なる可能性があります。(直ぐ解決する可能性もありますが、 長くなる場合は2ヶ月以上お付き合い頂く可能性もあります)  それでもよろしいでしょうか?  了承して頂けた時のことを考えて、最初に試して頂きたいことを 以下に書きます・・・・  まず、前回お渡ししたバージョンに少し手を加えた、こちらの 最新版のDXライブラリをダウンロードして下さい。m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)  とりあえず、こちらを使用してSetUse3DFlag( FALSE ); の状態で 正常に描画できないか試してみて下さい。  それで駄目でしたら、次に DrawBox で四角を描画した描画した後に SaveDrawScreen( 0, 0, 640, 480, "Save.bmp" );  を実行して、四角を描画した直後の画面の状態を保存するという、 以下のプログラムを実行してみて下さい。 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hp, LPSTR lpC, int nC) { SetMainWindowText("テストプログラム"); // ウィンドウのタイトル SetGraphMode(640,480,16); // 画面モードのセット ChangeWindowMode(TRUE); // ウィンドウモードに指定 // SetUseDirectDrawFlag(FALSE); if(DxLib_Init() == -1) return(-1); // DXライブラリ初期化 SetDrawScreen(DX_SCREEN_BACK); // 描画対象画面の指定 SetUse3DFlag(0); // 3D機能を使う while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){ ClsDrawScreen(); // 画面の消去 DrawBox(200,200,300,300,GetColor(0,0,255),0); SaveDrawScreen( 0, 0, 640, 480, "Save.bmp" ); break; Paint(250,250,GetColor(255,0,0),-1); ScreenFlip(); // 画面の切り替え } DxLib_End(); return(0); }  保存された Save.bmp にちゃんと青い四角が描画されているか どうか、ご確認になってみて下さい。m(_ _)m
Re: Paint()で色漏れします。 ( No.13 )
名前:お父さん 日時:2007/03/24 21:06

管理人様 どうもありがとうございます。私の方は、解決までに何ヶ月かかってもかまいません。というより、私はこうい うことが好きですので、管理人様の指示に従って色々試してみるのは楽しくてたまりません。管理人様の方こそど うか気長によろしくお付き合いください。こちらからお願いいたします。 さて、結果をご報告いたします。 @最新版のDxライブラリーをダウンロードして試してみましたが、残念ながら結果は今までと同じでした。 SetUseDirectDrawFlag(TRUE)ですと、SetUse3DFlagの設定にかかわらず、画面が真っ赤に塗りつぶされてしま いました。 ASave.bmpで確認しますと、ちゃんと閉じた青い四角形が描画されていました。 以上のような結果になりました。よろしくお願いいたします。
Re: Paint()で色漏れします。 ( No.14 )
名前:管理人 日時:2007/03/26 14:00

 お父さんさんどうも、DXライブラリの管理人です。 > どうもありがとうございます。私の方は、解決までに何ヶ月かかってもかまいません。というより、私はこうい > うことが好きですので、管理人様の指示に従って色々試してみるのは楽しくてたまりません。管理人様の方こそど > うか気長によろしくお付き合いください。こちらからお願いいたします。  了解です。  まあ、何ヶ月も掛かるなら件のパソコンを郵送して頂いて、直接デバッグした方が手っ取り早いという話もありますが。(汗)  さておき、ご報告頂いた結果を拝見した限りでは VRAM に書き込んだデータが CPU側で一切検出出来ないという訳ではないようです。(画面全体がペイント されてしまうのは閉じられた箱が Paint 関数内で検出出来ていないということなので、 SaveDrawScreen 関数内でも検出出来ていない場合は保存される画像も真っ黒になる筈、 真っ黒ではなく箱が書かれた画像が保存されたということは SaveDrawScreen 関数内 では画面の情報が検出できているということ)  今度は Paint 関数内でアクセスしている画面データに本当に何も書かれて いないのかどうか調べてみたいと思いますので、お手数ですが以下の圧縮ファイル内に ある PaintTest2.exe を実行してみて下さい。m(_ _)m http://homepage2.nifty.com/natupaji/temp/PaintTest2.zip  実行すると、画面の左上に以下のような表示がされますので left:0 right:640 top:0 bottom:480 flag:false color:1f  件のPCで実行した際にどのような表示がされるかご確認になってみて下さい。 (flag:false の場合は Paint 内で箱が検出されたことを示し、flag:true の場合は なにも検出されなかったことを示します)
Re: Paint()で色漏れします。 ( No.15 )
名前:お父さん 日時:2007/03/30 00:52

管理人様 返事が遅くなりました。息子のPC、再インストールをして、DirectXのバージョンを8.0にしてみましたが、や はりだめでした。 PaintTest2.exeを実行しますと、画面全体が赤くなり、文字は読めませんでした。 ただ、不思議なことを発見しました。画像のプロパティを16ビットにすると、PaintTest2は上記のような結果に なりますが、Cわくわくのサンプルゲームは普通に実行できます。ところが、画像のプロパティを32ビットにす ると、PaintTest2は中を赤く塗った正方形が描画されます(文字は出ません)が、Cわくわくのサンプルゲーム は、キャラクタがまったく表示されなくなります。(背景画像だけが表示されます)。 このような結果になりましたが、何かのヒントになりますでしょうか? お手数をかけますがよろしくお願いし ます。
追加レポート ( No.16 )
名前:お父さん 日時:2007/03/30 01:28

管理人様 先ほど書き込みをしたあと、少し調べてみますと、画面の大きさによって違う結果がでることを発見しました。 @1024X768のときは、32bitでは、Cわくわくのサンプルプログラムを実行しますと、背景が表示されるのみで キャラクタはまったく表示されません。 Aこれ以外の大きさ(たとえば800X600など)にすると、今度はキャラクタは表示されますが、背景画像はまった く表示されません。 BPaint関数に関しては、画面モードにかかわりなく、32bitだと正常に赤い四角形が表示されますが、16bitだ と色漏れがして画面全体が真っ赤になってしまいます。 以上追加して、ご報告いたします。
追加レポート2 ( No.17 )
名前:お父さん 日時:2007/03/30 02:21

管理人様 息子のPC、カラーを256色にして、PaintTest2を実行しましたところ、画面に白い縦線がたくさん表示される だけで、図形は表示されませんでしたが、文字が読み取れましたので報告いたします。 left: 0 right:640 top:0 bottom:480 flag: true color: ff000000 このようになっています。ご報告いたします。
Re: Paint()で色漏れします。 ( No.18 )
名前:管理人 日時:2007/03/31 13:17

 お父さんさんどうも、DXライブラリの管理人です。  うーん、ご報告を拝見する限りでは息子さんのPCのグラフィックス機能の VRAM不足、若しくはドライバの不具合としか申し上げることが出来ません。  2.19bでは正常に動作するとのことでしたが、ご報告にある @1024X768のときは、32bitでは、Cわくわくのサンプルプログラムを実行しますと、背景が表示されるのみで キャラクタはまったく表示されません。  等の現象も2.19bでは発生しないのでしょうか?
Re: Paint()で色漏れします。 ( No.19 )
名前:お父さん 日時:2007/04/20 23:18

管理人様 仕事が忙しくパソコンに触れなかったため、返事が大変遅くなりました。申し訳ありません。 さて、Ver2.19で「Cわくわく」のサンプルプログラムをコンパイル実行してみましたところ、何本もの縦線で描かれ たような画像がいくつも表示されて、正常に実行できませんでした。 また、2.19でコンパイルしたものを、画面を32bitにして実行してみますと、画像が設定したWindowからはみだし て表示されてしまいました。 長い間この問題から離れていましたので、私自身少しわからなくなってきています。それで、返事が少しピンぼ けのように思いますし、仕事もまだ少し忙しい日が続きそうですので、返事が遅くなってご迷惑をかけることも あるかと思いますが、管理人様のご指示に従って少しずつでも解決に近づいて行ければ、と思っています。引き 続きよろしくご指示くださいますようお願いいたします。
Re: Paint()で色漏れします。(訂正) ( No.20 )
名前:お父さん 日時:2007/04/20 23:45

管理人様 上の書き込みを修正しようとしましたが、パスワードの設定を忘れたようで、修正できませんので、改めてここで 訂正させていただきます。 >>また、2.19でコンパイルしたものを、画面を32bitにして実行してみますと、画像が設定したWindowからはみだし >>て表示されてしまいました。 先ほど書き込みをしたあと、もう一度確認してみましたら、上記の部分が間違っていました。2.19でコンパイル したものを画面を32bitにして実行しても、16bitの時と同じように、縦線で描かれたような画像が表示されるだ けでした。 いずれかのVersionでコンパイルしたものを、何かの設定で実行しますと、Windowからはみ出す現象が起きるので すが、どういう設定だったか今はわからなくなりましたので、上記部分を削除・修正させていただきます。 まだ、仕事ぼけで頭がパソコン用にうまく切り替わっていないようです。ややこしい書き込みをして、どうもす みません。
Re: Paint()で色漏れします。 ( No.21 )
名前:管理人 日時:2007/04/21 12:49

 お父さんさんどうも、DXライブラリの管理人です。  今回ご報告頂いた「Cわくわく」のサンプルの実行結果は SetUse3DFlag( FALSE ); をされた場合のものでしょうか?  もしそうだとしますと、一番最初のお書き込みにあります > SetUse3DFlag()をFALSEにしますと、普通の描画はうまく行くのですが  というご発言と矛盾してしまうのですが・・・
Re: Paint()で色漏れします。 ( No.22 )
名前:お父さん 日時:2007/04/21 22:52

管理人様 あいまいな報告でどうもすみませんでした。昨日はSetUse3DFlagをTRUEにした状態でテストしておりまし た。 本日改めて、Ver2.19でSetUse3DFlagをFALSEにしてテストしてみましたところ、「Cわくわく」「Paint」とも に正常に動作しました。 ただ、Ver2.19ですと、SetMainWindowTextなど、よく使う関数で実装されていないものがあるようですので、 その点さえなんとかなれば、Ver2.19でSetUse3DFlagをFalseにしてやっていこうかとも思うのですが、いかがで しょうか?
解決しました! ( No.23 )
名前:お父さん 日時:2007/04/21 23:31

管理人様 いろいろお手間をかけましたが、私のテストの仕方が悪かったようです。 ただ今、Ver2.23で、SetUseDirctDrawFlag(TRUE);と明示的にFlagをTRUEにして、コンパイル・実行してみまし たところ、Paint結果も正常で、描画スピードも満足のできるものができました。 前にVer2.23についてのご指示をいただいたときは、SetUseDirectDrawFlagを明示的にTRUEにする必要はな いと思い込み、FALSEにして実験はしましたが、TRUEにしては試していませんでした。 結果がでていましたのに、こちらの不手際でいらぬご心配をお掛けしてどうもすみませんでした。また、いつも 変わらぬ親切なご対応どうもありがとうございます。これからもよろしくお願いします。 追伸: ひとつだけお尋ねしたいのですが、どうしてFlagを明示的にTRUEにするとうまくいくのでしょう?  SetUseDirectDrawFlagはデフォルトがTRUEで、DirectDrawを使う場合はわざわざTRUEにしなくても自動 的にTRUEに設定されるものだと思っていましたが、明示的に設定するのとしないのとでは何か違いがあるのでしょ うか? それとも、息子のパソコンがDirectDrawの設定がデフォルトでFALSEになっているので、明示的にTRUEにしない と、DirectDrawが使えないということでしょうか? どうも気になってしかたがありませんので、もしできましたら管理人様のお考えをお聞かせください。 いずれにしましても、このたびはどうもありがとうございました。
Re: Paint()で色漏れします。 ( No.24 )
名前:管理人 日時:2007/04/22 00:48

 お父さんさんどうも、DXライブラリの管理人です。 > 追伸: ひとつだけお尋ねしたいのですが、どうしてFlagを明示的にTRUEにするとうまくいくのでしょう?  > SetUseDirectDrawFlagはデフォルトがTRUEで、DirectDrawを使う場合はわざわざTRUEにしなくても自動 > 的にTRUEに設定されるものだと思っていましたが、明示的に設定するのとしないのとでは何か違いがあるのでしょ > うか?  申し訳ありません、お書き込みを拝見した後確認してみたところ、SetUseDirectDrawFlag の引数が TRUE でも FALSE と同じ動作をする様になっていました。  つまり、正常に動作したのは SetUseDirectDrawFlag( FALSE ); をして、DirectDraw を 使用しないようにして起動したからだということになります。 (現在アップされているファイルは既に修正してあります)  以前 SetUseDirectDrawFlag( FALSE ); で起動すると動作が遅くて厳しいということでしたが、 現在のバージョンでは問題の無い速度が出ているのでしょうか?  因みにウインドウモードで SetUseDirectDrawFlag( FALSE ); を設定して起動した場合は DXライブラリの SetGraphMode 関数で指定したカラービット深度(デフォルトは16)と デスクトップの設定のカラービット深度が同じ場合と違う場合で ScreenFlip 時の負荷が 何倍も変わりますので、もしかしたらデスクトップの設定のカラービット深度が16に なっていて、高速に動作しているのかもしれません。
Re: Paint()で色漏れします。 ( No.25 )
名前:お父さん 日時:2007/04/22 01:20

管理人様 早速のご返事ありがとうございます。 > (現在アップされているファイルは既に修正してあります) 私は、管理人様の(No.12)のご返事のところにあります、Ver2.23を今日改めてダウンロードして使いました。今、 「DxLibrary置き場」の方を確認しましたら、こちらの最新版が既にVer2.23になっているんですね。明日にでも早 速こちらをダウンロードして試してみます。また、改めて自分の書き込みを読んでみましたら、「最新版で SetDirectDrawFlagをTRUEにすると画面が真っ赤になる」と書いていますが、そうするとなぜ今回はうまくい ったのかよくわかりませんね。明日にでももう一度チェックしてみようと思います。 ただ、SetDirectDrawFlag(TRUE)でも、FALSEと同じ動作をするというのをお聞きして納得したことがありま す。というのは、さきほど息子のパソコンでうまくいったので、私のパソコンにも(No.12)のほうのVer2.23をイ ンストールして、コンパイルしてみましたところ、Ver2.22eでコンパイルしたときより、どうも描画速度が 遅かったのです。最新版なのにどうしてだろう?と不思議に思っていたのですが、これはSetUseDiretDrawFlag がFALSEの状態になっていたからでしょうね。 肝心のご報告が最後になりましたが、今のところ、(No.12)からダウンロードしたVer2.23で満足する速度が 出ています。でも前の自分の書き込みと矛盾する点があるようですので、もういちどチェックして、のちほど改 めてご報告いたします。
Re: Paint()で色漏れします。 ( No.26 )
名前:管理人 日時:2007/04/23 11:56

 お父さんさんどうも、DXライブラリの管理人です。  すみません、No.12 の書き込みにあるリンクからダウンロードできる バージョンは常に最新のものに更新されていまして、現在ダウンロード 出来るものは No.12 の書き込み当時のものではなく、 「SetUseDirectDrawFlag( TRUE );でも FLASE と同じ動作をしてしまう」 というバグを修正した最新のバージョンとなっています。 混乱の元となってしまっていて申し訳ありません。  ただ、それでも SetUseDirectDrawFlag( TRUE ); でも満足出来る速度が 出ている謎の答えにはなりませんが・・・
Re: Paint()で色漏れします。 ( No.27 )
名前:お父さん 日時:2007/04/23 23:21

管理人様 いつもありがとうございます。 その後、「DxLibrary置き場」の方から、最新のバージョンをダウンロードして、試してみました。こちらのバー ジョンでは、おっしゃるとおり、SetUseDirctDrawFlag(TRUE);では、正常に動作せず、Flagを(FALSE)にすると 正常に動作しました。 > ただ、それでも SetUseDirectDrawFlag( TRUE ); でも満足出来る速度が出ている謎の答えにはなりません >が・・・ これは、本当に不思議です。先月投稿したときには、SetUseDirectDrawFlag(FALSE); にすると、速度が遅く て使えないなと思ったのは確かなのですが、全く同じプログラムを今回改めてコンパイル・実行してみましたら、 今度は満足できるスピードで動いてくれました。 自分で書き込んでおきながら、無責任なようで申し訳ありません。私自身も[謎」が解明されないままではどう も落ち着かない気持ちですが、今現在は、Paint関数、描画スピードともに満足のできる結果がでていますので、 これ以上管理人様にいらぬご心配をおかけしないようにするためにも、とりあえずこの状態で使っていこうと思 います。 今後、もし同様の不具合が出て、どんなときに満足できるスピードがでないかということなどが詳しく分かりまし たら、その時改めてご相談させていただきたいと思います。今回もどうもありがとうございました。これからも よろしくお願いします。
Re: Paint()で色漏れします。 ( No.28 )
名前:管理人 日時:2007/04/24 12:11

 お父さんさんどうも、DXライブラリの管理人です。  了解しました、何か分かりましたらご連絡下さい。

Page: 1 | 2 |