トップページ > 過去ログ > 記事閲覧
同一アプリケーション内で2回メインループを作る
名前:陽奈 日時: 2010/12/06 14:52

のっけからかなり無茶なことを言っているのは承知ですが 以下の様な事をスムーズに行いたいのです DXライブラリ初期化1回目 ↓ウィンドウの大きさ、描画範囲などを設定 ↓メインループ1……形のないウィンドウを作るため描画の反映方法はソフトウェアイメージの転送 DXライブラリ終了 DXライブラリ初期化2回目 ↓ウィンドウの大きさ、描画範囲などを設定 ↓メインループ2……こちらは640×480で固定の枠ありウィンドウ いくらか試したのですが ライブラリは初期化できてもメッセージ処理でエラーが起きたり、ライブラリ初期化なしだとウィンドウ枠が更新されず、FPSも極端に遅いままだったりと なかなかうまくいきません…… DXライブラリはこのようなことはできるのでしょうか もしくは新たにウィンドウを作らなければいけないのでしょうか? あまりこのような無茶をしたことがないので 誰かやり方を知っている方やアドバイスくれる方、お願いいたします

Page: 1 |

Re: 同一アプリケーション内で2回メインループを作る ( No.1 )
名前:いっち 日時:2010/12/08 18:55

私のテストした範囲では特に問題があるようには見受けられませんでした。 (「メッセージ処理」はよく分からなかったので省いています) 事象の再現するコードをご提供頂けますでしょうか? //-- 以下、テストコード(test1.bmpを使用) --// #include "DxLib.h" float GetFPS( void ) { static int OldTime, NewTime, FrameCount; static float FPS; FrameCount++; if ( !(FrameCount % 60) ) { FPS = (60.0f * 1000) / ((NewTime = GetNowCount( )) - OldTime); OldTime = NewTime; } return FPS; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GGH, SSH, gx, gy; ChangeWindowMode( TRUE ); SetUseBackBufferTransColorFlag( TRUE ); SetWaitVSyncFlag( FALSE ); if( DxLib_Init() < 0 ) return -1; SetDxLibEndPostQuitMessageFlag( FALSE ); GGH = LoadGraph( "Test1.bmp" ); GetGraphSize( GGH, &gx, &gy ); SetGraphMode( gx, gy, 32 ); GGH = LoadGraph( "Test1.bmp" ); SSH = MakeARGB8ColorSoftImage( gx, gy ); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && !CheckHitKey( KEY_INPUT_ESCAPE ) ) { ClearDrawScreen( ); DrawGraph( 0, 0, GGH, TRUE ); DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "FPS=%.2f", GetFPS( ) ); GetDrawScreenSoftImage( 0, 0, gx, gy, SSH ); UpdateLayerdWindowForSoftImage( SSH ); // ScreenFlip( ); <-※修正 コメントにしました } DxLib_End(); ChangeWindowMode( TRUE ); SetUseBackBufferTransColorFlag( FALSE ); SetGraphMode( 640, 480, 32 ); SetWaitVSyncFlag( TRUE ); if ( DxLib_Init() < 0 ) return -1; SetDxLibEndPostQuitMessageFlag( TRUE ); GGH = LoadGraph( "Test1.bmp" ); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && !CheckHitKey( KEY_INPUT_ESCAPE ) ) { ClearDrawScreen( ); DrawGraph( 0, 0, GGH, TRUE ); DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "FPS=%.2f", GetFPS( ) ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: 同一アプリケーション内で2回メインループを作る ( No.2 )
名前:陽奈 日時:2010/12/08 14:02

へぼPCでテストしたので 単に重かっただけかもしれませんが 以下がテストコードです あと一応テスト環境です Win XP SP3 Home (NotePC) RAM 1.25GB VRAM 512MB CPU 1.60GHz Display 1280*720*32 #define GLOBAL_INSTANCE #include "DxLib.h" //ループで必ず行う3大処理 int ProcessLoop(){ if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int screensofthandle; SetWindowStyleMode(2); SetGraphMode(800,600,32); SetWindowSize(800,600); SetWindowInitPosition(0,0); // ウインドウモードで起動 ChangeWindowMode( TRUE ); // ウインドウの透過色モードON SetUseBackBufferTransColorFlag( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; SetDrawMode(DX_DRAWMODE_BILINEAR); // 画面出力用のソフトウエア画像の作成 screensofthandle = MakeARGB8ColorSoftImage( w, h ) ; // 描画先を裏画面に SetDrawScreen( DX_SCREEN_BACK ) ; int c001 = 0; while( ProcessMessage() == 0 ) { if(c001<192) c001++; else goto NEXT001; // 画面をクリア ClearDrawScreen() ; // 画面出力用のソフトウエア画像をクリア FillSoftImage( screensofthandle, 0, 0, 0, 255) ; // 画面出力用のソフトウエア画像を使ってウインドウの表示を更新 UpdateLayerdWindowForSoftImage( screensofthandle ) ; } NEXT001: DeleteSoftImage( screensofthandle ); DxLib_End(); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; ChangeWindowMode(TRUE); SetUseSoftwareRenderModeFlag( FALSE );//ここをコメントアウトすると極度にFPSが下がります SetWindowStyleMode(0); SetGraphMode(640,480,32); SetWindowSize(640,480); SetWindowPosition(0,0);//ほんとは中央に表示するのですが別のファイル群を用いているので代理です SetUseBackBufferTransColorFlag(FALSE); HWND hnd =GetMainWindowHandle();//ここをコメントアウトすると2回目のループでエラーが返ります AddMessageTakeOverWindow(hnd);//上記同様 int x=0; int y=0; int f1=0; int f2=0; while(ProcessLoop()==0) { if(x<640) { if(f1==0) x++; else x--; } if(x>=640)f1=1; if(x<=0)f1=0; if(y<480) { if(f2==0) y++; else y--; } if(y>=480)f2=1; if(y<=0)f2=0; DrawBox(x-16,y-16,x+16,y+16,GetColor(255,0,0),1); ScreenFlip();//裏画面反映 count++; } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } しばらくして自己解決したのですが…… かなりコードが多くなってしまいました こちらが解決後のコードです #define GLOBAL_INSTANCE #include "DxLib.h" //ループで必ず行う3大処理 int ProcessLoop(){ if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int screensofthandle; SetWindowStyleMode(2); SetGraphMode(800,600,32); SetWindowSize(800,600); SetWindowInitPosition(0,0); // ウインドウモードで起動 ChangeWindowMode( TRUE ); // ウインドウの透過色モードON SetUseBackBufferTransColorFlag( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; SetDrawMode(DX_DRAWMODE_BILINEAR); // 画面出力用のソフトウエア画像の作成 screensofthandle = MakeARGB8ColorSoftImage( w, h ) ; // 描画先を裏画面に SetDrawScreen( DX_SCREEN_BACK ) ; int c001 = 0; while( ProcessMessage() == 0 ) { if(c001<192) c001++; else goto NEXT001; // 画面をクリア ClearDrawScreen() ; // 画面出力用のソフトウエア画像をクリア FillSoftImage( screensofthandle, 0, 0, 0, 255) ; // 画面出力用のソフトウエア画像を使ってウインドウの表示を更新 UpdateLayerdWindowForSoftImage( screensofthandle ) ; } NEXT001: DeleteSoftImage( screensofthandle ); SetWindowVisibleFlag(FALSE);/*追加*/ SetWindowStyleMode(0);/*追加*/ DxLib_End(); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; SetWindowStyleMode(0); SetWindowVisibleFlag(TRUE);/*追加*/ SetUseSoftwareRenderModeFlag( FALSE );/*追加*/ SetWindowStyleMode(0); SetGraphMode(640,480,32); SetWindowSize(640,480); SetWindowPosition(0,0); SetUseBackBufferTransColorFlag(FALSE);/*追加*/ HWND hnd =GetMainWindowHandle();/*追加*/ AddMessageTakeOverWindow(hnd);/*追加*/ int x=0,y=0,f1=0,f2=0,c=0; while(ProcessLoop()==0) { if(c=0) { ScreenFlip();/*追加*/ SetActiveWindow(NULL);/*追加*/ SetActiveWindow(GetMainWindowHandle());/*追加*/ c++; } if(x<640) { if(f1==0) x++; else x--; } if(x>=640)f1=1; if(x<=0)f1=0; if(y<480) { if(f2==0) y++; else y--; } if(y>=480)f2=1; if(y<=0)f2=0; DrawBox(x-16,y-16,x+16,y+16,GetColor(255,0,0),1); ScreenFlip();//裏画面反映 count++; } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Page: 1 |