お世話になります
C++の質問です。
WindowsXP
Visual C++ 2008 Express Edithionを使っています。
現在シューティングゲームを作っています。
画像の読み込みと破棄、音楽の再生と停止、クラスの生成と破棄はそれぞれコンストラクタとデストラクタで行っているのですが、ウィンドウの閉じるボタンを押して終了したときにデバッグが終わらず、
ウィンドウを閉じた後も音楽を再生しては停止、再生しては停止…を繰り返してしまいます。
その場合タスクマネージャからプロセスを終了させないと止まりません。
クラスの流れ
Main ─ Game ┬ Menu
└ Shooting ┬ MyShip
├ Enemy
└ 以下略
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
Game game;
if(DxLib_Init() == -1) return -1; //ここでウィンドウサイズ(640,480)、裏画面描画、ログ出力の有無の設定を行う。
SetDrawScreen(DX_SCREEN_BACK);
game.Run();
DxLib_End();
return 0;
}
void Game::Run() {
menu = new Menu(FPS);
while(menu->Select() != 0) { // メニュー画面
RunStg();
}
//RunStg();
delete menu;
menu = NULL;
}
void Game::RunStg() {
stg = new Shooting(FPS);
stg->Run(); //シューティングの処理へ
delete stg;
stg = NULL;
}
参考
Shooting::Shooting(double fps) {
WaitTime = (int)(1000/fps);
PlayMusic("./music/sorato.mid", DX_PLAYTYPE_LOOP);
FrameCount = 0;
ship = new MyShip;
shot = new Shot;
enm = new Enemy;
blt = new Bullet;
scene = new Scene;
}
Shooting::~Shooting() {
StopMusic();
if(ship != NULL) {
delete ship;
ship = NULL;
}
if(shot != NULL) {
delete shot;
shot = NULL;
}
if(enm != NULL) {
delete enm;
enm = NULL;
}
if(blt != NULL) {
delete blt;
blt = NULL;
}
if(scene != NULL) {
delete scene;
scene = NULL;
}
}
てっきりウィンドウの閉じるボタンを押した場合もデストラクタは呼び出されると思ってこのように
書いていたのですが、これだとマズいのでしょうか?
少し前の段階で
void Game::Run() {
menu = new Menu(FPS);
RunStg();
delete menu;
menu = NULL;
}
このようにメニュー用のループを入れていない時は普通に終了していました。
すみません、ソースが断片的過ぎるかとは思いますがこの辺りから推測できる
問題点はありますでしょうか。
それと、閉じるボタンを押された場合は特別な解放処理がなんかが必要なんでしょうか。
追記:
出力ウィンドウには
スレッド 'Win32 スレッド' (0x1f8) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
スレッド 'Win32 スレッド' (0xbc0) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
スレッド 'Win32 スレッド' (0x5e4) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
スレッド 'Win32 スレッド' (0xbac) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
スレッド 'Win32 スレッド' (0xa0c) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
このような出力が繰り返されます。
