トップページ > 過去ログ > 記事閲覧
DrawCircleで不具合らしき現象があります
名前:oda_9119 日時: 2012/03/28 00:55

お世話になっております。DXLIBを使わせていただいて、ゲームを作っている者です。 Ver 3.07dでDrawCircleに不具合らしきものがあったので報告いたします。 画面内に入りきる大きさの円にしないとフリーズ(クラッシュ)するのです。 たとえば、解像度を640*480にしている場合、 DrawCircle( 320, 240, 239, GetColor(16, 32, 64 ), true ) ; ならOKですが、 DrawCircle( 320, 240, 240, GetColor(16, 32, 64 ), true ) ; だとフリーズします。 画面外にはみ出す場合も同様にフリーズします。 以上です。よろしくお願いいたします。

Page: 1 |

Re: DrawCircleで不具合らしき現象があります ( No.1 )
名前:いっち 日時:2012/03/29 20:21

私の環境で試してみましたが、特に問題ないようでした。 再現するためのコードをご提供いただけますか?
Re: DrawCircleで不具合らしき現象があります ( No.2 )
名前:oda_9119 日時:2012/04/02 23:57

お返事ありがとうございます。返事が遅くなりすみません。 かなりの大作であまりにも長いコードなので、その問題の部分だけのコードだけ抜き出して記載します。 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( true ) ; // ウインドウモード SetOutApplicationLogValidFlag( false ); if(DxLib_Init() == -1) return -1;//初期化と裏画面化 SetWindowText( "TEST" ) ; ChangeWindowMode( true ) ; // ウインドウモード SetGraphMode( 320 , 240 , 32 ) ; //画面モード320*240 32ビット SetTransColor( 255 , 0 , 255 ) ; //抜き色 while(1){ DrawCircle( 320, 240, 241, GetColor(16, 32, 64 ), true ) ; if ( CheckHitKeyAll() == 1 ) break; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } 以上です。DrawCircleの3番目の引数が239以下ならOKです。 一応DrawCircleは使わないことにしたのでゲーム製作には支障はありません。私の環境でしか起きないのでしたら、この問題は解決という事にしていただいても構いません。
Re: DrawCircleで不具合らしき現象があります ( No.3 )
名前:坂本龍 日時:2012/04/03 05:35

私もDrawOvalにて似たような問題に悩まされまして、ここへ来ました。 最新版のDXライブラリ適用前は正常に動作していたのですが…… DXライブラリのバージョンは3.07dで、OSはWinXP HE SP3で、Visual C++ 2008 EEを使っています。 以下は問題が発生した部分のコードを簡略化して示したものです。 #include "include/DxLib.h" int ProcessLoop(){ if(ProcessMessage()!=0)return -1; if(ClearDrawScreen()!=0)return -1; return 0; } void DrawBlackOut(){ int tempScreen; int X_Base=80; int Y_Base=160; int NowBlack_X=X_Base+40; int NowBlack_Y=Y_Base+40; int PastBlack_X=X_Base+100; int PastBlack_Y=Y_Base+100; int bright1=255; int bright2=192; tempScreen = MakeScreen(160,320,FALSE); SetDrawScreen(tempScreen); SetDrawArea(0,0,160,320); SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0); DrawOval(NowBlack_X,NowBlack_Y,80,80,GetColor(bright1,bright1,bright1),TRUE); DrawOval(PastBlack_X,PastBlack_Y,80,80,GetColor(bright2,bright2,bright2),TRUE); SetDrawScreen(DX_SCREEN_BACK); SetDrawArea(240,96,240+160,96+320); SetDrawBlendMode(DX_BLENDMODE_MUL,255); DrawGraph(240,96,tempScreen,FALSE); SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0); DeleteGraph(tempScreen); SetDrawArea(0,0,640,480); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ ChangeWindowMode(true); SetOutApplicationLogValidFlag(false); if(DxLib_Init()==-1||SetDrawScreen(DX_SCREEN_BACK)!=0)return -1; while(!ProcessLoop())DrawBlackOut(); DxLib_End(); return 0; } 呼び出し履歴は以下のとおりです。 Test.exe!DxLib::DxCheckAlloc() + 0x2e1 バイト C++ Test.exe!DxLib::DxFree() + 0x5f バイト C++ Test.exe!DxLib::SetUserBlendInfo() + 0x10da5 バイト C++ Test.exe!DxLib::DrawOval() + 0x10f バイト C++ > Test.exe!DrawBlackOut() 行 24 + 0x28 バイト C++ Test.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00161f15, int nCmdShow=1) 行 38 + 0xe バイト C++ Test.exe!__tmainCRTStartup() 行 263 + 0x2c バイト C Test.exe!WinMainCRTStartup() 行 182 C kernel32.dll!7c817077() [下のフレームは間違っているか、または見つかりません。kernel32.dll に対して読み込まれたシンボルはありません。] Test.exe!DxLib::NS_ProcessMessage() + 0x4c2 バイト C++ Test.exe!DxLib::NS_ProcessMessage() + 0x49b バイト C++ Test.exe!DxLib::SetFogStartEnd() + 0x63 バイト C++ Test.exe!DxLib::ConvBitmapToGraphImage() + 0x1654 バイト C++ Test.exe!DxLib::NS_ProcessMessage() + 0x49b バイト C++ Test.exe!DxLib::ConvBitmapToGraphImage() + 0x1654 バイト C++ Test.exe!DxLib::ConvBitmapToGraphImage() + 0x1654 バイト C++ Test.exe!DxLib::NS_ProcessMessage() + 0x49b バイト C++ Test.exe!DxLib::ConvBitmapToGraphImage() + 0x1654 バイト C++ Test.exe!DxLib::ConvBitmapToGraphImage() + 0x1654 バイト C++ Test.exe!DxLib::NS_ProcessMessage() + 0x49b バイト C++ Test.exe!DxLib::SetFogStartEnd() + 0x63 バイト C++ Test.exe!DxLib::ConvBitmapToGraphImage() + 0x1654 バイト C++ Test.exe!DxLib::SetFogStartEnd() + 0x63 バイト C++ Test.exe!DxLib::ConvBitmapToGraphImage() + 0x1654 バイト C++ なお、簡略化したコードの方では発生しなかったのですが、簡略化前のコードにてウォッチ式を追加したところ、 次のようなエラーが発生していました。 Y_Base CXX0017: エラーです: シンボル "Y_Base" が見つかりません PastBlack_X CXX0017: エラーです: シンボル "PastBlack_X" が見つかりません PastBlack_Y CXX0017: エラーです: シンボル "PastBlack_Y" が見つかりません bright1 CXX0017: エラーです: シンボル "bright1" が見つかりません
Re: DrawCircleで不具合らしき現象があります ( No.4 )
名前:坂本龍 日時:2012/04/03 05:56

追記です。 DXライブラリのバージョンを一つずつ下げて行き、どの段階で正常動作するようになるかを試したところ、 3.07cから3.07aに下げた時点で正常動作するようになりました。
Re: DrawCircleで不具合らしき現象があります ( No.5 )
名前:いっち 日時:2012/04/04 02:12

リリースビルドで試してみたところ再現しました。 (デバッグビルドでは再現せず) //- 以下、テストコード -// #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { ChangeWindowMode( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; int white = GetColor( 255, 255, 255 ); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawFormatString( 0, 0, white, "TEST" ); DrawCircle( 320, 240, 241, GetColor(16, 32, 64 ), TRUE ); ScreenFlip( ); } DxLib_End( ); return 0; } 野暮な突っ込みですが・・・。 oda_9119さん> > if ( CheckHitKeyAll() == 1 ) break; CheckHitKeyAll の戻り値は 0 か -1 だと思います。 坂本龍さん> > SetDrawBlendMode(DX_BLENDMODE_MUL,255); 真っ黒な背景と乗算ブレンドをしても真っ黒になるだけだと思います。 それと ScreenFlip が無いです。
Re: DrawCircleで不具合らしき現象があります ( No.6 )
名前:坂本龍 日時:2012/04/05 01:45

いっちさん> すみません、問題があると思われる部分のコードを他のコードから切り離すために簡略化を行ったのですが、 エラーがでるかどうかが問題だったので、表示されるかどうかを気に留めていませんでした。 しかし、3.07dでは起動直後にエラーで落ちていたのが、 3.07aに差し替えたことでエラーが出ずに真っ黒な画面が表示されるようになったので、 とにかくバージョンを下げればエラーは出なくなるということを検証しました。
Re: DrawCircleで不具合らしき現象があります ( No.7 )
名前:管理人 日時:2012/04/09 02:36

ご報告ありがとうございます 修正版をアップしましたので、よろしければお試しください 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/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 今回のエラーの原因は確保メモリ以上の領域にアクセスしていたことが原因でした 尚、最近厳しくしたライブラリ内のメモリの不正なアクセスのチェック処理に 引っかかったことで表面化しただけで、このバグ自体はかなり前から存在していました m(_ _;m
Re: DrawCircleで不具合らしき現象があります ( No.8 )
名前:oda_9119(解決済み 日時:2012/04/11 00:21

管理人さん> ご対応ありがとうございます。最新版使わせていただきます。 いっちさん> CheckHitKeyAll の戻り値は確かに0か-1ですね。ご指摘ありがとうございます。

Page: 1 |