STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#1

投稿記事 by 天江 衣 » 11年前

環境  
 [1] OS : Windows7
 [2] コンパイラ名 : VC++ 2008EE, Borand C++

STGを作っています。
ステージは5個作り、スタート画面からどのステージにするか選べ、1ステージ終了後、またスタート画面にもどるというプログラムを作っています。
実際に、プログラムはできたのですが、1場面・2場面とやっていくと2場面で処理落ちしてしまいます。なぜでしょうか?1場面1場面メモリーの初期化をしないとダメなんでしょうか・・・ するとしてもやり方がわかりませんorz
プログラムは

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

extern int DrawGraphFd( int xd, int yd, int GrHandle, int TransFlag);
int DrawRotaGraph( int x, int y,double ExtRate, double Angle,int GrHandle , int TransFlag , int TurnFlag ) ;
int DrawRotaGraph2( int x, int y,int cx, int cy,double ExtRate, double Angle,int GrHandle, int TransFlag, int TurnFlag ) ;

//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();  //現在のパッド入力処理を行う
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
/*====================================================================================*/
int time_cnt=0,time_cnt1=0,time_cnt2=0;
int m,c=0,pat=0,patt=0,patt2=0;
int i=0,o=0;
/*=======================================================================================*/
	while(ProcessLoop()==0){//メインループ
		music_ini();
		time_cnt++;
		switch(func_state){

			case 0://初回のみ入る処理
				first_ini();//初回の初期化
				load();		//データロード
				func_state=10;
				break;
			
			case 10://選択画面
				DrawGraphFd(-20,-30,img_back[1],TRUE);
				m=font[1];
				DrawStringToHandle(105 ,100 ,"シューティングゲーム" ,GetColor(150, 200, 255) ,m);
				DrawString(200, 250, "ゲームスタート" ,GetColor(255,255,255));
				DrawString(200, 285, "難易度" ,GetColor(255,255,255));
				DrawString(330, 285, ":" ,GetColor(255,255,255));
				DrawString(350, 285, "簡単" ,GetColor(255,255,255));
				DrawString(400, 285, "普通" ,GetColor(255,255,255));
				DrawString(450, 285, "難しい" ,GetColor(255,255,255));
				DrawString(200, 320, "場面設定" ,GetColor(255,255,255));
				DrawString(330, 320, ":" ,GetColor(255,255,255));
				DrawString(350, 320, "1場面" ,GetColor(255,255,255));
				DrawString(400, 320, "2場面" ,GetColor(255,255,255));
				DrawString(450, 320, "3場面" ,GetColor(255,255,255));
				DrawString(500, 320, "4場面" ,GetColor(255,255,255));
				DrawString(550, 320, "5場面" ,GetColor(255,255,255));
				DrawString(200, 355, "キャラ設定" ,GetColor(255,255,255));
				DrawString(200, 390, "ゲーム終了" ,GetColor(255,255,255));
				//上下設定
				if(CheckStateKey(KEY_INPUT_DOWN	 )){
					time_cnt++;
					//pat=0
				
				if(CheckStateKey(KEY_INPUT_DOWN	 )&&pat<=3&&pat==0&&time_cnt>16){
					time_cnt=0;
                    pat=1;
				}
				else if(CheckStateKey(KEY_INPUT_DOWN	 )&&pat<=3&&pat==1&&time_cnt>16){
					time_cnt=0;
					pat=2;
				}
				else if(CheckStateKey(KEY_INPUT_DOWN	 )&&pat<=3&&pat==2&&time_cnt>16){
					pat=3;
					time_cnt=0;

				}
				else if(CheckStateKey(KEY_INPUT_DOWN	 )&&pat<=3&&pat==3&&time_cnt>16){
					pat=4;
					time_cnt=0;

				}
				}
				else if(CheckStateKey(KEY_INPUT_UP	 )){
					time_cnt++;
					//pat=4
				if(CheckStateKey(KEY_INPUT_UP	 )&&pat>0&&pat==4&&time_cnt>16){
                    time_cnt=0;
					pat=3;
				}
				else if(CheckStateKey(KEY_INPUT_UP	 )&&pat>0&&pat==3&&time_cnt>16){
                    time_cnt=0;
					pat=2;
				}
				else if(CheckStateKey(KEY_INPUT_UP	 )&&pat>0&&pat==2&&time_cnt>16){
					time_cnt=0;
					pat=1;
				}
				else if(CheckStateKey(KEY_INPUT_UP	 )&&pat>0&&pat==1&&time_cnt>16){
					time_cnt=0;
					pat=0;
				}
				}
				//選択後設定
				//ゲームスタート
				else if(pat==0&&CheckStateKey(KEY_INPUT_Z	     )){
					if(patt2==0){
						func_state=100;
						break;
					}
					if(patt2==1){
						func_state=130;
						break;
					}
					if(patt2==2){
						func_state=230;
						break;
					}
					if(patt2==3){
						func_state=320;
						break;
					}
					if(patt2==4){
						func_state=410;
						break;
					}
					}
				//難易度設定
				else if(pat==1){//&&CheckStateKey(KEY_INPUT_Z	     )
					if(CheckStateKey(KEY_INPUT_RIGHT)){
						time_cnt1++;
						if(CheckStateKey(KEY_INPUT_RIGHT)&&patt<=1&&patt==0&&time_cnt1>5){
							time_cnt1=0;
							patt=1;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt<=1&&patt==1&&time_cnt1>5){
							time_cnt1=0;
							patt=2;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt<=1&&patt==2&&time_cnt1>5){
							patt=3;
							time_cnt1=0;
							}
						}
					else if(CheckStateKey(KEY_INPUT_LEFT	 )){
						time_cnt1++;
						if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt>0&&patt==3&&time_cnt1>5){
							 time_cnt1=0;
							patt=2;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt>0&&patt==2&&time_cnt1>5){
							time_cnt1=0;
							patt=1;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt>0&&patt==1&&time_cnt1>5){
							time_cnt1=0;
							patt=0;
							}
						}
					DrawString(150, 420, "難易度設定です。" ,GetColor(255,255,255));
					DrawString(150, 440, "左右で設定できます。" ,GetColor(255,255,255));
					DrawString(150, 460, "設定完了後、ゲームスタートボタンを押してください。" ,GetColor(255,255,255));

				}
				//場面設定
				else if(pat==2){//&&CheckStateKey(KEY_INPUT_Z	     )
					if(CheckStateKey(KEY_INPUT_RIGHT)){
						time_cnt1++;
						if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==0&&time_cnt1>5){
							time_cnt1=0;
							patt2=1;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==1&&time_cnt1>5){
							time_cnt1=0;
							patt2=2;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==2&&time_cnt1>5){
							patt2=3;
							time_cnt1=0;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==3&&time_cnt1>5){
							patt2=4;
							time_cnt1=0;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==4&&time_cnt1>5){
							patt2=5;
							time_cnt1=0;
						}
						}
					else if(CheckStateKey(KEY_INPUT_LEFT	 )){
						time_cnt1++;
						if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==5&&time_cnt1>5){
							 time_cnt1=0;
							patt2=4;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==4&&time_cnt1>5){
							 time_cnt1=0;
							patt2=3;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==3&&time_cnt1>5){
							 time_cnt1=0;
							patt2=2;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==2&&time_cnt1>5){
							time_cnt1=0;
							patt2=1;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==1&&time_cnt1>5){
							time_cnt1=0;
							patt2=0;
							}
						}
					DrawString(150, 420, "場面設定です。" ,GetColor(255,255,255));
					DrawString(150, 440, "左右で設定できます。" ,GetColor(255,255,255));
					DrawString(150, 460, "設定完了後、ゲームスタートボタンを押してください。" ,GetColor(255,255,255));
				}
				//キャラ設定
				else if(pat==3&&CheckStateKey(KEY_INPUT_Z	     )){
					func_state=11;
				}
				//終了
				else if(pat==4&&CheckStateKey(KEY_INPUT_Z	     )){
					return -1;
				}
				//そのほか、したに出る説明
				else if(pat==0){
					DrawString(150, 420, "ゲームスタートします。Zで決定です。" ,GetColor(255,255,255));
					DrawString(150, 440, "Z:前へ打つ。          Z+X:横へ打つ。" ,GetColor(255,255,255));
					DrawString(150, 460, "C:ボム。              Shift:遅くなる。" ,GetColor(255,255,255));
				}
				else if(pat==3){
					DrawString(150, 420, "キャラクター設定です。" ,GetColor(255,255,255));
				}
				else if(pat==4){
					DrawString(150, 420, "Zでゲームを終了します。" ,GetColor(255,255,255));
				}
				DrawBox(198,245+35*pat,320,275+35*pat,GetColor(255,255,255),FALSE);
				DrawBox(345+50*patt,280,400+50*patt,305,GetColor(0,255,255),FALSE);
				DrawBox(345+50*patt2,315,400+50*patt2,340,GetColor(0,255,255),FALSE);
				DrawBox(100,410,570,478,GetColor(0,255,255),FALSE);//TRUE
				
				break;

		case 11:
				DrawGraphFd(-20,-30,img_back[1],TRUE);
				DrawString(250, 200, "キャラ設定" ,GetColor(255,255,255));
				DrawString(250, 250, "今はできないよ!" ,GetColor(255,255,255));
				DrawString(250, 300, "Cを押してね" ,GetColor(255,255,255));
				if(CheckStateKey(KEY_INPUT_C	     )){
					func_state=0;
				}
				break;

		case 100://STGを始める前に行う初期化
				ini();
				load_story();
				func_state=110;//98//109//293
				break;

		case 110:
								 enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=120;//498
							}
						if((ch.num==0)&&(boss.flag=1)){
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if((ch.num==0)&&(boss.flag=1)){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;

		case 120:
				i++;
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					LoadGraphScreen( -40, 120, "../dat/img/back/0/char1.png", TRUE ); // 画像を描画する
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;

		case 130:
				first_ini2();//初回の初期化
				load2();		//データロード
				stage_count=0;
				func_state=200;//98//109//293
				break;

		case 200:
				ini2();
				load_story2();
				func_state=210;
				break;

		case 210:
				DrawGraphFd(0,0,img_back[0],FALSE);
				enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main2();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				//haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
							StopSoundMem(area.bgm.handle);
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=220;//498
						}
						if(ch.num==0){
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;

		case 220:
				i++;
				DrawGraphFd(-10,-20,img_back[0],FALSE);
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					LoadGraphScreen( -40, 120, "../dat/img/back/0/char1.png", TRUE ); // 画像を描画する
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;

		case 230:
				first_ini3();//初回の初期化
				load3();		//データロード
				stage_count=0;
				func_state=290;//98//109//293
				break;


		case 290:
				ini3();
				load_story3();
				func_state=300;
				break;

		case 300:
				i++;
				DrawGraphFd(-10,-20,img_back[0],FALSE);
				DrawRotaGraph2( 320, 240, 48, 53, 1.5f,PI/100*i,img_board[13],TRUE ) ;
				DrawRotaGraph2( 320, 240, 48, 53, 1.5f,PI/800*i,img_board[13],TRUE ) ;
				enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main3();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				//haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
							i=0;
							StopSoundMem(area.bgm.handle);
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=310;//498
						}
						if(ch.num==0){
							i=0;
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if(ch.num==0){
						i=0;
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					i=0;
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;

		case 310:
				i++;
				DrawGraphFd(-10,-20,img_back[0],FALSE);
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					LoadGraphScreen( -40, 120, "../dat/img/back/0/char1.png", TRUE ); // 画像を描画する
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;

		case 320:
				first_ini4();//初回の初期化
				load4();		//データロード
				stage_count=0;
				func_state=380;//98//109//293
				break;


		case 380:
				ini4();
				load_story4();
				func_state=390;
				break;

		case 390:
				DrawGraphFd(0,0,img_back[0],FALSE);
				enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main4();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				//haikei_main4();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
							StopSoundMem(area.bgm.handle);
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=400;//400
						}
						if(ch.num==0){
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;


		case 400:
				DrawGraphFd(0,0,img_back[0],FALSE);
				i++;
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					LoadGraphScreen( -40, 120, "../dat/img/back/0/char1.png", TRUE ); // 画像を描画する
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;


		case 410:
				first_ini5();//初回の初期化
				load5();		//データロード
				stage_count=0;
				func_state=470;//98//109//293
				break;

		case 470:
				ini5();
				load_story5();
				func_state=480;
				break;

		case 480:
				DrawGraphFd(0,0,img_back[0],FALSE);
				enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main5();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				//haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
			                StopSoundMem(area.bgm.handle);
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=500;//498
						}
						if(ch.num==0){
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;
		 case 500:
				DrawGraphFd(0,0,img_back[0],FALSE);
				i++;
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					LoadGraphScreen( -40, 120, "../dat/img/back/0/char1.png", TRUE ); // 画像を描画する
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;

			case 600:
				DrawGraphFd(-20,-30,img_back[1],TRUE);
				DrawString(250, 250, "終わり" ,GetColor(255,255,255));
				DrawString(250, 300, "Cを押してね" ,GetColor(255,255,255));
				if(CheckStateKey(KEY_INPUT_C	     )){
					StopSoundMem(area.bgm.handle);
					func_state=0;
				}
				break;			


			default:
				break;
		}
		music_play();			 enter_func_tm("音楽再生");
		fps_wait();				 enter_func_tm("待機した時間",1);
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
		count++;

	}
	DxLib_End();//DXライブラリ終了処理
	return 0;
}
です。
よろしくお願いします。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由

#2

投稿記事 by 天江 衣 » 11年前

<訂正>
1場面が終了したら、「c」スタート画面に戻り、2場面を選択

2場面が終了したら「c」を押しスタート画面にもどる予定なのですが、「c」を押したら、画面がかたまり、DxLibが落ちてしまいます。

もう一回開き直し、2場面からスタートすると、通常通り出来ます。

次に、2場面から始めた場合、 3場面の途中で処理落ちしてしまいます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由

#3

投稿記事 by softya(ソフト屋) » 11年前

処理落ちしそうなLoadGraphScreenは何のために入っているんでしょうか?

「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由

#4

投稿記事 by 天江 衣 » 11年前

不適切な実装4. LoadGraphScreen関数を使っている
読みました。
使ってはいけないんですね・・・知りませんでした。
・・・
修正はしたのですが、症状は変わりませんでした。
ほかに原因があるのでしょうか・・・

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由

#5

投稿記事 by 天江 衣 » 11年前

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"
//#include "../include/MenuBack.h"

extern int DrawGraphFd( int xd, int yd, int GrHandle, int TransFlag);
int DrawRotaGraph( int x, int y,double ExtRate, double Angle,int GrHandle , int TransFlag , int TurnFlag ) ;
int DrawRotaGraph2( int x, int y,int cx, int cy,double ExtRate, double Angle,int GrHandle, int TransFlag, int TurnFlag ) ;


//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();  //現在のパッド入力処理を行う
	return 0;
}

int ProcessLoop1(){
	if(ScreenFlip()!=0)return -1;
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();  //現在のパッド入力処理を行う
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
/*====================================================================================*/
int time_cnt=0,time_cnt1=0,time_cnt2=0;
int m,c=0,pat=0,patt=0,patt2=0;
int i=0,o=0;
/*=======================================================================================*/
	while(ProcessLoop()==0){//メインループ
		music_ini();
		time_cnt++;
		switch(func_state){

			case 0://初回のみ入る処理
				first_ini();//初回の初期化
				load();		//データロード
				func_state=10;//97//96//103
				break;
			
			case 10://選択画面
				DrawGraphFd(-20,-30,img_back[1],TRUE);
				m=font[1];
				DrawStringToHandle(105 ,100 ,"シューティングゲーム" ,GetColor(150, 200, 255) ,m);
				DrawString(200, 250, "ゲームスタート" ,GetColor(255,255,255));
				DrawString(200, 285, "難易度" ,GetColor(255,255,255));
				DrawString(330, 285, ":" ,GetColor(255,255,255));
				DrawString(350, 285, "簡単" ,GetColor(255,255,255));
				DrawString(400, 285, "普通" ,GetColor(255,255,255));
				DrawString(450, 285, "難しい" ,GetColor(255,255,255));
				DrawString(200, 320, "場面設定" ,GetColor(255,255,255));
				DrawString(330, 320, ":" ,GetColor(255,255,255));
				DrawString(350, 320, "1場面" ,GetColor(255,255,255));
				DrawString(400, 320, "2場面" ,GetColor(255,255,255));
				DrawString(450, 320, "3場面" ,GetColor(255,255,255));
				DrawString(500, 320, "4場面" ,GetColor(255,255,255));
				DrawString(550, 320, "5場面" ,GetColor(255,255,255));
				DrawString(200, 355, "キャラ設定" ,GetColor(255,255,255));
				DrawString(200, 390, "ゲーム終了" ,GetColor(255,255,255));
				//上下設定
				if(CheckStateKey(KEY_INPUT_DOWN	 )){
					time_cnt++;
					//pat=0
				
				if(CheckStateKey(KEY_INPUT_DOWN	 )&&pat<=3&&pat==0&&time_cnt>16){
					time_cnt=0;
                    pat=1;
				}
				else if(CheckStateKey(KEY_INPUT_DOWN	 )&&pat<=3&&pat==1&&time_cnt>16){
					time_cnt=0;
					pat=2;
				}
				else if(CheckStateKey(KEY_INPUT_DOWN	 )&&pat<=3&&pat==2&&time_cnt>16){
					pat=3;
					time_cnt=0;

				}
				else if(CheckStateKey(KEY_INPUT_DOWN	 )&&pat<=3&&pat==3&&time_cnt>16){
					pat=4;
					time_cnt=0;

				}
				}
				else if(CheckStateKey(KEY_INPUT_UP	 )){
					time_cnt++;
					//pat=4
				if(CheckStateKey(KEY_INPUT_UP	 )&&pat>0&&pat==4&&time_cnt>16){
                    time_cnt=0;
					pat=3;
				}
				else if(CheckStateKey(KEY_INPUT_UP	 )&&pat>0&&pat==3&&time_cnt>16){
                    time_cnt=0;
					pat=2;
				}
				else if(CheckStateKey(KEY_INPUT_UP	 )&&pat>0&&pat==2&&time_cnt>16){
					time_cnt=0;
					pat=1;
				}
				else if(CheckStateKey(KEY_INPUT_UP	 )&&pat>0&&pat==1&&time_cnt>16){
					time_cnt=0;
					pat=0;
				}
				}
				//選択後設定
				//ゲームスタート
				else if(pat==0&&CheckStateKey(KEY_INPUT_Z	     )){
					if(patt2==0){
						func_state=100;
						break;
					}
					if(patt2==1){
						func_state=130;
						break;
					}
					if(patt2==2){
						func_state=230;
						break;
					}
					if(patt2==3){
						func_state=320;
						break;
					}
					if(patt2==4){
						func_state=410;
						break;
					}
					}
				//難易度設定
				else if(pat==1){//&&CheckStateKey(KEY_INPUT_Z	     )
					if(CheckStateKey(KEY_INPUT_RIGHT)){
						time_cnt1++;
						if(CheckStateKey(KEY_INPUT_RIGHT)&&patt<=1&&patt==0&&time_cnt1>5){
							time_cnt1=0;
							patt=1;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt<=1&&patt==1&&time_cnt1>5){
							time_cnt1=0;
							patt=2;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt<=1&&patt==2&&time_cnt1>5){
							patt=3;
							time_cnt1=0;
							}
						}
					else if(CheckStateKey(KEY_INPUT_LEFT	 )){
						time_cnt1++;
						if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt>0&&patt==3&&time_cnt1>5){
							 time_cnt1=0;
							patt=2;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt>0&&patt==2&&time_cnt1>5){
							time_cnt1=0;
							patt=1;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt>0&&patt==1&&time_cnt1>5){
							time_cnt1=0;
							patt=0;
							}
						}
					DrawString(150, 420, "難易度設定です。" ,GetColor(255,255,255));
					DrawString(150, 440, "左右で設定できます。" ,GetColor(255,255,255));
					DrawString(150, 460, "設定完了後、ゲームスタートボタンを押してください。" ,GetColor(255,255,255));

				}
				//場面設定
				else if(pat==2){//&&CheckStateKey(KEY_INPUT_Z	     )
					if(CheckStateKey(KEY_INPUT_RIGHT)){
						time_cnt1++;
						if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==0&&time_cnt1>5){
							time_cnt1=0;
							patt2=1;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==1&&time_cnt1>5){
							time_cnt1=0;
							patt2=2;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==2&&time_cnt1>5){
							patt2=3;
							time_cnt1=0;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==3&&time_cnt1>5){
							patt2=4;
							time_cnt1=0;
						}else if(CheckStateKey(KEY_INPUT_RIGHT)&&patt2<=3&&patt2==4&&time_cnt1>5){
							patt2=5;
							time_cnt1=0;
						}
						}
					else if(CheckStateKey(KEY_INPUT_LEFT	 )){
						time_cnt1++;
						if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==5&&time_cnt1>5){
							 time_cnt1=0;
							patt2=4;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==4&&time_cnt1>5){
							 time_cnt1=0;
							patt2=3;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==3&&time_cnt1>5){
							 time_cnt1=0;
							patt2=2;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==2&&time_cnt1>5){
							time_cnt1=0;
							patt2=1;
						}else if(CheckStateKey(KEY_INPUT_LEFT	 )&&patt2>0&&patt2==1&&time_cnt1>5){
							time_cnt1=0;
							patt2=0;
							}
						}
					DrawString(150, 420, "場面設定です。" ,GetColor(255,255,255));
					DrawString(150, 440, "左右で設定できます。" ,GetColor(255,255,255));
					DrawString(150, 460, "設定完了後、ゲームスタートボタンを押してください。" ,GetColor(255,255,255));
				}
				//キャラ設定
				else if(pat==3&&CheckStateKey(KEY_INPUT_Z	     )){
					func_state=11;
				}
				//終了
				else if(pat==4&&CheckStateKey(KEY_INPUT_Z	     )){
					return -1;
				}
				//そのほか、したに出る説明
				else if(pat==0){
					DrawString(150, 420, "ゲームスタートします。Zで決定です。" ,GetColor(255,255,255));
					DrawString(150, 440, "Z:前へ打つ。          Z+X:横へ打つ。" ,GetColor(255,255,255));
					DrawString(150, 460, "C:ボム。              Shift:遅くなる。" ,GetColor(255,255,255));
				}
				else if(pat==3){
					DrawString(150, 420, "キャラクター設定です。" ,GetColor(255,255,255));
				}
				else if(pat==4){
					DrawString(150, 420, "Zでゲームを終了します。" ,GetColor(255,255,255));
				}
				DrawBox(198,245+35*pat,320,275+35*pat,GetColor(255,255,255),FALSE);
				DrawBox(345+50*patt,280,400+50*patt,305,GetColor(0,255,255),FALSE);
				DrawBox(345+50*patt2,315,400+50*patt2,340,GetColor(0,255,255),FALSE);
				DrawBox(100,410,570,478,GetColor(0,255,255),FALSE);//TRUE
				
				break;

		case 11:
				DrawGraphFd(-20,-30,img_back[1],TRUE);
				DrawString(250, 200, "キャラ設定" ,GetColor(255,255,255));
				DrawString(250, 250, "今はできないよ!" ,GetColor(255,255,255));
				DrawString(250, 300, "Cを押してね" ,GetColor(255,255,255));
				if(CheckStateKey(KEY_INPUT_C	     )){
					func_state=0;
				}
				break;

		case 100://STGを始める前に行う初期化
				ini();
				load_story();
				func_state=110;//98//109//293
				break;

		case 110:
								 enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=120;//498
							}
						if((ch.num==0)&&(boss.flag=1)){
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if((ch.num==0)&&(boss.flag=1)){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;

		case 120:
				i++;
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					DrawGraphFd(-40,120,img_board[9],TRUE);
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;

		case 130:
				first_ini2();//初回の初期化
				load2();		//データロード
				stage_count=0;
				func_state=200;//98//109//293
				break;

		case 200:
				ini2();
				load_story2();
				func_state=210;
				break;

		case 210:
				DrawGraphFd(0,0,img_back[0],FALSE);
				enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main2();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				//haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
							StopSoundMem(area.bgm.handle);
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=220;//498
						}
						if(ch.num==0){
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;

		case 220:
				i++;
				DrawGraphFd(-10,-20,img_back[0],FALSE);
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					DrawGraphFd(-40,120,img_board[9],TRUE);
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;

		case 230:
				first_ini3();//初回の初期化
				load3();		//データロード
				stage_count=0;
				func_state=290;//98//109//293
				break;


		case 290:
				ini3();
				load_story3();
				func_state=300;
				break;

		case 300:
				i++;
				DrawGraphFd(-10,-20,img_back[0],FALSE);
				DrawRotaGraph2( 320, 240, 48, 53, 1.5f,PI/100*i,img_board[13],TRUE ) ;
				DrawRotaGraph2( 320, 240, 48, 53, 1.5f,PI/800*i,img_board[13],TRUE ) ;
				enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main3();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				//haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
							i=0;
							StopSoundMem(area.bgm.handle);
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=310;//498
						}
						if(ch.num==0){
							i=0;
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if(ch.num==0){
						i=0;
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					i=0;
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;

		case 310:
				i++;
				DrawGraphFd(-10,-20,img_back[0],FALSE);
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					DrawGraphFd(-40,120,img_board[9],TRUE);
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;

		case 320:
				first_ini4();//初回の初期化
				load4();		//データロード
				stage_count=0;
				func_state=380;//98//109//293
				break;


		case 380:
				ini4();
				load_story4();
				func_state=390;
				break;

		case 390:
				DrawGraphFd(0,0,img_back[0],FALSE);
				enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main4();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				//haikei_main4();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
							StopSoundMem(area.bgm.handle);
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=400;//400
						}
						if(ch.num==0){
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;


		case 400:
				DrawGraphFd(0,0,img_back[0],FALSE);
				i++;
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					DrawGraphFd(-40,120,img_board[9],TRUE);
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;


		case 410:
				first_ini5();//初回の初期化
				load5();		//データロード
				stage_count=0;
				func_state=470;//98//109//293
				break;

		case 470:
				ini5();
				load_story5();
				func_state=480;
				break;

		case 480:
				DrawGraphFd(0,0,img_back[0],FALSE);
				enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main5();	 enter_func_tm("計算メイン");//ゲームタイトル表示計算
				//haikei_main();   enter_func_tm("描画メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				if((stage_count==boss.appear_count[1])&& boss.flag==1){
					if(boss.knd==boss.danmaku_num[1]){
						if(se_flag[9]=1){
			                StopSoundMem(area.bgm.handle);
							boss.flag=0;//消す
							enter_dn(10,40);
							    func_state=500;//498
						}
						if(ch.num==0){
							memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
						}
					}
					if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
					}
				}
				if(ch.num==0){
					memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
							func_state=600;//498	
				}
				break;
		 case 500:
				DrawGraphFd(0,0,img_back[0],FALSE);
				i++;
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(i>100){
					DrawGraphFd(-40,120,img_board[9],TRUE);
					if(CheckStateKey(KEY_INPUT_C	     )){
						StopSoundMem(area.bgm.handle);
					func_state=0;
					i=0;
					}
					m=font[2];
					DrawBox(372,230,620,450,GetColor(111,80,17),TRUE);//TRUE RGB
					DrawBox(377,235,615,445,GetColor(111,99,17),TRUE);//TRUE RGB
					DrawStringToHandle(380 ,310 ,"Cを押してください。\n" ,GetColor(150, 200, 255) ,m);
				}
				break;

			case 600:
				DrawGraphFd(-20,-30,img_back[1],TRUE);
				DrawString(250, 250, "終わり" ,GetColor(255,255,255));
				DrawString(250, 300, "Cを押してね" ,GetColor(255,255,255));
				if(CheckStateKey(KEY_INPUT_C	     )){
					StopSoundMem(area.bgm.handle);
					func_state=0;
				}
				break;			


			default:
				break;
		}
		music_play();			 enter_func_tm("音楽再生");
		fps_wait();				 enter_func_tm("待機した時間",1);
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
		count++;

	}
	DxLib_End();//DXライブラリ終了処理
	return 0;
}

です。

nil
記事: 428
登録日時: 12年前

Re: STG 処理落ち理由

#6

投稿記事 by nil » 11年前

せっかく処理ごとの時間を測っているんです。
それを利用しない手はないでしょう?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: STG 処理落ち理由

#7

投稿記事 by h2so5 » 11年前

天江さん、「処理落ち」の意味を一度調べてみてください。
おそらく誤用されていますから。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由

#8

投稿記事 by 天江 衣 » 11年前

処理落ち改、ゲームが停止して、落ちてしまう・・・

画像1枚1枚が高画質だと、ゲームが停止して、落ちてしまいますか?
背景画像1枚136KB~455KB
自機52KB

nil
記事: 428
登録日時: 12年前

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#9

投稿記事 by nil » 11年前

圧縮形式の関係もありますので
何pixel*何pixelかを教えて下さい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#10

投稿記事 by softya(ソフト屋) » 11年前

タイトルを直しておきました。
ロードの部分がないコードでは何とも答えられませんので、プロジェクト全体を添付できませんか?
で、いつものごとくですがipchやらdebugなどのフォルダは不要です。あと拡張子sdfも不要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#11

投稿記事 by 天江 衣 » 11年前

背景で一番サイズの大きいやつは640×480
です。

テンプはどのようにやれば良いでしょうか?
テンプはしたことなくて・・・
ファイルは.cppと.hだけで良いですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#12

投稿記事 by softya(ソフト屋) » 11年前

再現確認には画像とか音楽が必要ですね。
ソースコードだけで分からないかも知れないので出来れば付けてください。
あと2面に簡単にいける仕組みも付けてますか? ← 誤字修正。

添付は、投稿時に下に添付タブがあるのでそれを押してください。あとは分かると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nil
記事: 428
登録日時: 12年前

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#13

投稿記事 by nil » 11年前

VC++2010なら
プロジェクト名.sdf
ipch
Debug
ってファイルを削除してからzipに圧縮して添付していただければいいかと思います

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#14

投稿記事 by 天江 衣 » 11年前

zipファイル送れないよぉ
IEが接続中から動かないorz

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#15

投稿記事 by softya(ソフト屋) » 11年前

天江 衣 さんが書きました:zipファイル送れないよぉ
IEが接続中から動かないorz
画像が相当大きいのでしょうか?
ファイルサイズはいくつですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#17

投稿記事 by softya(ソフト屋) » 11年前

5MB以内にしてくださいね。とりあえずソースコードですか。
あと画像だけをまとめた別ファイルをください。
ほんとに余分なものを除いて40MBもあるのか疑問なんですけけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#18

投稿記事 by 天江 衣 » 11年前

まずincludeと.cppファイルを
その後
その他のファイル×2こテンプします
添付ファイル
include.zip
(5.77 MiB) ダウンロード数: 108 回
STGame.zip
(5.1 MiB) ダウンロード数: 105 回

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#19

投稿記事 by 天江 衣 » 11年前

あっ
ファイルが増えてしまいました
すみません
次は音楽関連送ります
添付ファイル
csv.zip
(6.99 KiB) ダウンロード数: 103 回
se.zip
(2.29 MiB) ダウンロード数: 89 回

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#20

投稿記事 by 天江 衣 » 11年前

もう一つ音楽ファイル添付します
添付ファイル
5場面.zip
(2.72 MiB) ダウンロード数: 103 回
3場面.zip
(3.84 MiB) ダウンロード数: 95 回
1.2場面音楽.zip
(3.6 MiB) ダウンロード数: 96 回

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#21

投稿記事 by 天江 衣 » 11年前

次は画像関連です。
添付ファイル
4場面.zip
(5.3 MiB) ダウンロード数: 88 回

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#22

投稿記事 by 天江 衣 » 11年前

これで添付ファイルは以上です
長々すみません。

明日は、大学受験なので、返事が日曜日になるかもしれません。
すみません。

プログラム よろしくお願いします。
添付ファイル
画像3.zip
(308.11 KiB) ダウンロード数: 106 回
画像2.zip
(4.34 MiB) ダウンロード数: 95 回
画像1.zip
(4.92 MiB) ダウンロード数: 104 回

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#23

投稿記事 by softya(ソフト屋) » 11年前

申し訳ないですがinclude.zipと STGame.zipは大半いらないファイルでした。
※  ncbも抜いてくれと書いておけばよかったです。DXLIBはこっちにもあるのでもちろん不要です。
それと音楽ファイルは無くても動きます。
ほんとうに必要最低限で再現に必要なファイルを教えて下さい。
送るのもご苦労だったと思いますが、最小限にすればこちらも労力が省けます。
フォルダの位置関係も再現方法を書き添えてもらえないでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#24

投稿記事 by 天江 衣 » 11年前

返事が遅れました。
「STG」ファイルの中に「dat」と「STG」というファイルを作ります。
「dat」の中にcsvとimgをいれ、「STG」の中にmydatを入れます。

お願いします。
添付ファイル
img.zip
(7.1 MiB) ダウンロード数: 91 回
mydat.zip
(82.04 KiB) ダウンロード数: 98 回
csv.zip
(6.99 KiB) ダウンロード数: 95 回

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#25

投稿記事 by softya(ソフト屋) » 11年前

リンクエラーするんですが何か送り間違いや余分なソースコードが入っていませんか?
エラー 2 error LNK2005: "void (__cdecl** boss_shot_bullet)(void)" (?boss_shot_bullet@@3PAP6AXXZA) は既に boss_shot.obj で定義されています。 boss_shot2.obj
もしかしたら、天江 衣さん自身がソリューションのリビルドをしたら同じエラーが出ませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#26

投稿記事 by 天江 衣 » 11年前

boss_shot2.cpp余分でした。
消してください
お願いします。
すみません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#27

投稿記事 by softya(ソフト屋) » 11年前

1面と試しに2面からスタートさせたら、どちらも何も起こりませんというか画面がフリーズしています。
この送信ファイルで動くことは確認されていますでしょうか?

デバッガで中断して呼出し履歴を確認した所load_story()で無限ループしているみたいですね。
ファイルオープンに成功して何故かファイルを読み続けていて無限ループって感じでしょうか。
ここを重点的に調べてみてください。

【補足】
何かの拍子に無限ループしないようにループ回数の上限をチェックしたほうが良いでしょうね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#28

投稿記事 by 天江 衣 » 11年前

load_story()の中に、存在しないファイルの名前が Loadしてありました。 それが原因でしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#29

投稿記事 by softya(ソフト屋) » 11年前

天江 衣 さんが書きました:load_story()の中に、存在しないファイルの名前が Loadしてありました。 それが原因でしょうか?
FileRead_openでエラー処理しているみたいですから別原因だと思います。
それと今回と関係無いですが同じような処理のコードが沢山ありますね。すごくバグりやすく修正が面倒な事になっていると思います。
出来れば関数を統廃合される事をおすすめします。

リファクタリング(プログラムのコードの整理)を必要とする気配。

「コードの臭い (code smell) - リファクタリングの必要性を示す兆候」
http://www.crystal-creation.com/softwar ... -smell.htm
メソッドは関数、クラスはファイルと読み替えてください。privateはローカル変数です。
あとオブジェクト指向言語特有の部分は無視してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

天江 衣
記事: 17
登録日時: 11年前
住所: 静岡県浜松

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#30

投稿記事 by 天江 衣 » 11年前

何となく 原因がわかりました。
全ての処理の合計が16.6msを超えていました。

コード:

   if((total/1000.0)>=21.0){
		DrawFormatStringToHandle(340,100+14*i,color[3],font[0],"合計:%05.2f",total/1000.0);
	}else if((total/1000.0)>=16.6){//16.5
		DrawFormatStringToHandle(340,100+14*i,color[2],font[0],"合計:%05.2f",total/1000.0);
	}
で表示させたところ、ほぼ表示しっぱなしでした。

時には、21.0ms以上いっていました。

一番処理していたのがgraph.cppで5.03msとか時々なっていました。

また、FPSが58.9がほぼ固定で、ボスが出てきたら、41.6に一瞬ですがなりました。

1面終了後→2面終了→Cを押したら、FPSが28.1になりました。

こうなる原因としては、何があるでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: STG 処理落ち理由 改め ゲームが停止して、落ちてしまう・・・

#31

投稿記事 by softya(ソフト屋) » 11年前

えーと、落ちるというには結局どちらなのでしょうか?
(1)処理落ち フレームレートに間に合わずFPSが下がること。
(2)ゲームが停止して、落ちてしまう 何らかのハングアップか無限ループ。

ちなみに私の環境では動きませんので再現できていません。(2)です。

[追記]
ソースコードを直したほうが良いという話は、そのまま何でしょうか?
時には、21.0ms以上いっていました。
一番処理していたのがgraph.cppで5.03msとか時々なっていました。
また、FPSが58.9がほぼ固定で、ボスが出てきたら、41.6に一瞬ですがなりました。
これだと、graph.cpp以外に何倍も重い処理がいることになりますよね。
あと15ms以上何処かで消費していいるわけですから。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る