トップページ > 過去ログ > 記事閲覧
画面がフラッシュ(点滅)します。
名前:うさぎ 日時: 2010/01/17 13:19

ソースはあまりにも長いので出すのはむりなんですが、 ttp://homepage2.nifty.com/natupaji/temp/MaximizeBox.cppのページを見せてもらい最大化すると 画面が点滅してしまいます。ですが、Windowモードを設定しないで最大化すると点滅しません。 原因はどう推測されますか? ちなみに 関数の中身は void ChangeCallback( void *Data ) { image0[0] = LoadGraph("img/mark/a.bmp"); image0[1] = LoadGraph("img/mark/b.bmp"); image0[2] = LoadGraph("img/mark/c.bmp"); image0[3] = LoadGraph("img/mark/d.bmp"); image0[4] = LoadGraph("img/mark/e.bmp"); image0[5] = LoadGraph("img/mark/f.bmp"); image0[6] = LoadGraph("img/mark/g.bmp"); image0[7] = LoadGraph("img/mark/h.bmp"); image0[8] = LoadGraph("img/mark/i.bmp"); image0[9] = LoadGraph("img/mark/j.bmp"); image0[10] = LoadGraph("img/mark/k.bmp"); image0[11] = LoadGraph("img/mark/m.bmp"); } のような感じです。原因不明なので 多分起こってる可能性の示唆でもかまいませんので よろしくお願いします。

Page: 1 |

Re: 画面がフラッシュ(点滅)します。 ( No.1 )
名前:いっち 日時:2010/01/17 16:09

事象が掴みきれていないのですが、下記のようなソースを実行し、 Alt+Enterキーを押下して画面を最大化←→最小化を繰り替えして見ましたが、 画面が点滅し続けると言うような事象は起こりませんでした。 ChangeWindowModeをコメントにしても見ましたが、 画面の初期状態が違うだけで別段かわった様子は見受けられませんでした。 (DxLibのバージョンは3.01でテストしました) うさぎさんの環境で実行してみた場合どの様になるのか試して頂けますでしょうか? 私の勘違いや不備がありましたらご指摘下さい。 #include "DxLib.h" int image[10]; const char* file[2] = { "Tex1.bmp", "Tex2.bmp" }; void ChangeCallback( void *Data ) { for ( int i = 0; i < 10; i++ ) image[i] = LoadGraph( file[i % 2] ); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { SetUseASyncChangeWindowModeFunction( TRUE, ChangeCallback, NULL ); ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; ChangeCallback( 0 ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { for ( int i = 0; i < 10; i++ ) { DrawGraph( i*64, 0, image[i], FALSE ); } } DxLib_End( ); return 0; }
Re: 画面がフラッシュ(点滅)します。 ( No.2 )
名前:うさぎ 日時:2010/01/17 18:58

>いっちさん 確かそれでは点滅しませんでした。 もし、ゲームを作ったことがあって↓の様な ループでゲーム制作してるなら試してくれませんか? while(ProcessMessage()==0&&CheckHitKey(KEY_INPUT_ESCAPE)==0) { ClearDrawScreen(); switch(game_state) { case GAME_INIT: First_Init(); //初期化 game_state=GAME_TITLE; break; case GAME_TITLE: Draw_GameTitle(); //タイトル画面 break; case GAME_MAIN: GAME_MAIN(); //ゲームメイン break; case GAME_OVER: break; case GAME_CLEAR: break; } FpsTimeFunction(); //60FPS制御処理 ScreenFlip(); } このようなループでゲームを作ってます。 ただ単に最大化すると何も不備がないのですが、 ChangeCallback( void *Data )で最大化すると fpsも一気に落ち点滅して可笑しくなります。 ChangeCallbackの宣言と位置はいっちさんと同様です。何が原因と考えられるのでしょうか?
Re: 画面がフラッシュ(点滅)します。 ( No.3 )
名前:いっち 日時:2010/01/17 20:12

画像の描画の前後にClearDrawScreenとScreenFlipを入れてみましたが、再現しませんでした。 (Draw_GameTitle関数やGAME_MAIN関数に関してはさすがに千差万別すぎるので試していません) 事象としてはおそらくScreenFlip関数がうまく機能していないのだと思います。 以下の5点を確認させて下さい 1.(No.2)のソースからswitch文とFpsTimeFunction関数を取り除き、 かわりに単純な画像描画(DrawGraph)などを行った場合も同様の事象になるか? (ChangeCallback関数の中身は出来るだけ変えずに試して下さい) 2.ChangeCallback関数の完全な中身。割愛や要約の無い状態を拝見したいです。 それでも大きいようでしたらアップローダでお願いします。 3.DxLib_Init関数前後で行っているDxLib関係の初期化や設定(SetDrawScreenなど)。 DxLibの前か後かは重要な場合があるので、わかる形で教えて下さい。 4.SetUseASyncChangeWindowModeFunction以外にコールバック関数を使用していないか? 5.DxLibのバージョン 以上です。お手数とは思いますがよろしくお願いします。
Re: 画面がフラッシュ(点滅)します。 ( No.4 )
名前:うさぎ 日時:2010/01/18 01:22

ChangeCallback関数以外なにも不都合が起こらないので 関数の中身を変数以外変えず書きました。 void ChangeCallback( void *Data ) { image0[0] = LoadGraph("img/mark/a.bmp"); image0[1] = LoadGraph("img/mark/b.bmp"); image0[2] = LoadGraph("img/mark/c.bmp"); image0[3] = LoadGraph("img/mark/d.bmp"); image0[4] = LoadGraph("img/mark/e.bmp"); image0[5] = LoadGraph("img/mark/f.bmp"); image0[6] = LoadGraph("img/mark/g.bmp"); image0[7] = LoadGraph("img/mark/h.bmp"); image0[8] = LoadGraph("img/mark/i.bmp"); image0[9] = LoadGraph("img/mark/j.bmp"); image0[10] = LoadGraph("img/mark/k.bmp"); image0[11] = LoadGraph("img/mark/m.bmp"); image1[0] = LoadGraph("img/mark/a.bmp"); image1[1] = LoadGraph("img/mark/b.bmp"); image1[2] = LoadGraph("img/mark/c.bmp"); image1[3] = LoadGraph("img/mark/d.bmp"); image1[4] = LoadGraph("img/mark/e.bmp"); image1[5] = LoadGraph("img/mark/f.bmp"); image1[6] = LoadGraph("img/mark/g.bmp"); image1[7] = LoadGraph("img/mark/h.bmp"); image1[8] = LoadGraph("img/mark/i.bmp"); image1[9] = LoadGraph("img/mark/j.bmp"); image1[10] = LoadGraph("img/mark/k.bmp"); image1[11] = LoadGraph("img/mark/m.bmp"); image2[0] = LoadGraph("img/mark/a.bmp"); image2[1] = LoadGraph("img/mark/b.bmp"); image2[2] = LoadGraph("img/mark/c.bmp"); image2[3] = LoadGraph("img/mark/d.bmp"); image2[4] = LoadGraph("img/mark/e.bmp"); image2[5] = LoadGraph("img/mark/f.bmp"); image2[6] = LoadGraph("img/mark/g.bmp"); image2[7] = LoadGraph("img/mark/h.bmp"); image2[8] = LoadGraph("img/mark/i.bmp"); image2[9] = LoadGraph("img/mark/j.bmp"); image2[10] = LoadGraph("img/mark/k.bmp"); image2[11] = LoadGraph("img/mark/m.bmp"); aa = LoadGraph("img/mark/aa.bmp"); bb= LoadGraph("img/mark/bb.bmp"); cc = LoadGraph("img/mark/cc.png"); dd = LoadGraph("img/mark/dd.png"); ee = LoadGraph("img/mark/ee.jpg"); ff= LoadGraph("img/mark/ff.png"); gg = LoadGraph("img/mark/gg.png"); hh = LoadGraph("img/mark/hh.PNG"); ii = LoadGraph("img/mark/ii.PNG"); jj = LoadGraph("img/mark/jj.PNG"); kk= LoadGraph("img/mark/kk.PNG"); ll= LoadGraph("img/mark/ll.bmp"); mm = LoadGraph("img/mark/mm.bmp"); nn = LoadGraph("img/mark/nn.png"); oo= LoadGraph("img/mark/oo.PNG"); pp= LoadGraph("img/mark/pp.PNG"); qq = LoadGraph("img/mark/qq.png"); rr = LoadGraph("img/mark/rr.png"); ss = LoadGraph("img/mark/ss.png"); tt = LoadGraph("img/mark/tt.png"); uu = LoadGraph("img/mark/uu.PNG"); char fire[sizeof("img/fire/fire13.png")]; int i; for( int i=0 ; i<14 ; i++ ) { sprintf( fire, "img/fire/fire%d.png", i ); aaa[i] = LoadGraph( fire ) ; } char number[sizeof("img/number/number9.PNG")]; for( int i=0 ; i<10 ; i++ ) { sprintf( number, "img/number/number%d.PNG", i ); bbb[i] = LoadGraph( number ) ; } }
Re: 画面がフラッシュ(点滅)します。 ( No.5 )
名前:うさぎ 日時:2010/01/18 01:30

DxLib_Init関数の前後は SetUseASyncChangeWindowModeFunction( TRUE, ChangeCallback, NULL ); ChangeWindowMode( TRUE ) ; SetOutApplicationLogValidFlag(FALSE); if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ) ; ChangeCallback( 0 ); です。ただの全画面化はまったく不都合がおきませんので、たぶんChangeCallback関数に問題がある思います。ライブラリのバージョンはたしか3.0です。よろしくお願いします。
Re: 画面がフラッシュ(点滅)します。 ( No.6 )
名前:いっち 日時:2010/01/18 02:14

ご提供頂いたソースを組み込んで実行してみましたが、問題となるような事象は発生しませんでした。 ChangeCallback関数と初期化処理には特に問題は見受けられないと思います。 とりあえず、DxLibのバージョンを最新のものにしてリビルドを行ってみてください。 (バージョン3.00と3.01ではだいぶ違います) それと( No.3 )の項目1と4についてもご解答下さい。 よろしくお願いします。
Re: 画面がフラッシュ(点滅)します。 ( No.7 )
名前:いっち 日時:2010/01/18 02:30

うさぎさんのおっしゃる事象の解決策となるかわかりませんが、 ChangeCallback関数の最後に以下の行を追加してみてください。 SetDrawScreen( DX_SCREEN_BACK );
Re: 画面がフラッシュ(点滅)します。 ( No.8 )
名前:うさぎ 日時:2010/01/18 03:25

>いっちさん >ChangeCallback関数の最後に以下の行を追加してみてください。 SetDrawScreen( DX_SCREEN_BACK ); をいれて正常に動きました。ありがとうございます。 これは一体どういう原因だったと推測されますか? 最後によろしくお願いします。
Re: 画面がフラッシュ(点滅)します。 ( No.9 )
名前:いっち 日時:2010/01/18 12:38

ChangeWindowModeのヘルプを読むとわかりますが、 > ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R11N1 以下の設定系関数は画面の最大化<-->最小化を切り替えると再設定を行う必要があります SetDrawArea, SetDrawScreen, SetDrawMode, SetDrawBlendMode, SetDrawBright うさぎさんの事象の場合、画面モードの変更をしたためSetDrawScreenの設定が DX_SCREEN_BACKからDX_SCREEN_FRONTに戻り、ScreenFlip関数による描画が 2フレームに1回になってしまったため、画面が点滅しているように見えたのだと思います。

Page: 1 |