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;
}
|
|