13章で詰みました・・・・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
維管束

13章で詰みました・・・・・・

#1

投稿記事 by 維管束 » 12年前

13章で詰みました・・・・
なぜかデバック無しで実行してもウィンドウが消えてしまいます。
なぜでしょうか・・・?

一応問題があると思うプログラム
敵玉制御

コード:

#include "GV.h"

extern void (*shot_[SHOT_SYU_MAX])(tekitama *,int) ={
        shot_0,
};
double rang(double ang){
    return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}
void shot_calc(enemy ene[TEKISUU],tekitama shot[TAMAMAX],int n){
        int i,max=0;
        if(ene[shot[n].enemyID].flg!=1)//敵が倒されたら
                shot[n].flg=2;//それ以上ショットを登録しないフラグに変える
        for(i=0;i<TAMASUU_MAX;i++){//n番目の弾幕データの弾を計算
                if(shot[n].a[i].flg>0){//その弾が登録されていたら
                        shot[n].a[i].x+=cos(shot[n].a[i].angle)*shot[n].a[i].spd;
                        shot[n].a[i].y+=sin(shot[n].a[i].angle)*shot[n].a[i].spd;
                        shot[n].a[i].cnt++;
                        if(shot[n].a[i].x<-50 || shot[n].a[i].x>409+50 ||
                                shot[n].a[i].y<-50 || shot[n].a[i].y>409+50){//画面から外れたら
                                if(shot[n].a[i].till<shot[n].a[i].cnt)//最低消えない時間より長ければ
                                        shot[n].a[i].flg=0;//消す
						}
                }
        }
        //現在表示中の弾が一つでもあるかどうか調べる
        for(i=0;i<TAMASUU_MAX;i++)
                if(shot[n].a[i].flg>0)
                        return;
        if(ene[shot[n].enemyID].flg!=1){
                shot[n].flg=0;//終了
                ene[shot[n].enemyID].flg=0;
        }
}
void tekitama_kes(tekitama shot[TAMAMAX]){
	int i;
	enemy ene[TEKISUU];
	eneget(ene);
    for(i=0;i<TAMAMAX;i++){//弾幕データ計算
                //フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
                if(shot[i].flg!=0 && 0<=shot[i].syu && shot[i].syu<SHOT_SYU_MAX){
                        shot_[shot[i].syu](shot,i);//.kndの弾幕計算関数を呼ぶ関数ポインタ
                        shot_calc(ene,shot,i);//i番目の弾幕を計算
                        shot[i].cnt++;
				}
	}
}
int enemy_shot_search2(int s,tekitama shot[TAMAMAX]){
     int i;
        for(i=0;i<TEKISUU;i++){
                if(shot[s].a[i].flg==0){
                        return i;
                }
        }
        return -1;
  
}

void shot_0(tekitama shot[TAMAMAX],int i){
	int t=shot[i].cnt;
	enemy ene[TEKISUU];
    int k;
	eneget(ene);
    if(t>=0 && t<1200 && t%90==0){
        double angle=rang(PI);
        for(int j=0;j<2;j++){//途中から2分裂する分
            for(int i=0;i<60;i++){//一度に60個
                if(shot[i].flg!=2 && (k=enemy_shot_search2(i,shot))!=-1){
                    shot[i].a[k].syu    =0;//8番の弾
					shot[i].a[k].angle  =angle+PI2/60*i;//円形60個
                    shot[i].a[k].flg   =1;
                    shot[i].a[k].x      =ene[shot[i].enemyID].x;
                    shot[i].a[k].y      =ene[shot[i].enemyID].y;
                    shot[i].a[k].cnt    =0;
                    shot[i].a[k].state  =j;//ステータス。0か1かで回転がかわる
                    shot[i].a[k].spd    =2;
                }
            }
        }//→発射音挿入予定
    }
    for(int s=0;s<TAMASUU_MAX;s++){//全弾分
        if(shot[i].a[s].flg>0){//登録されている弾があれば
            int state=shot[i].a[s].state;
            int cnt=shot[i].a[s].cnt;
            if(30<cnt && cnt<120){//30~120カウントなら
                shot[i].a[s].spd-=1.2/90.0;//90カウントかけて1.2減らす
                shot[i].a[s].angle+=(PI/2)/90.0*(state?-1:1);//90カウントかけて90°傾ける
            }
        }
    }
}
敵玉制御

コード:

#include "GV.h"
static tekitama shot_t[TAMAMAX];
static int img[5];
void teki_tama_date_load(){
	LoadDivGraph("画像/b0.png",5,5,1,72,72,img);
}
void enemy_shot_Update(){
	tekitama_kes(shot_t);
}
void enter_shot(enemy ene[TEKISUU],int i){
        int j;
        for(j=0;j<TAMAMAX;j++){//フラグのたって無いenemyを探す
                if(shot_t[j].flg==0){//未使用の弾幕データがあれば
                        
                        shot_t[j].flg=1;//フラグをたてる
                        shot_t[j].syu=ene[i].blknd;//弾の種類
                        shot_t[j].enemyID=i;//num=どの敵から発射されたものか。
                        shot_t[j].cnt=0;
                        return ;
                }
        }
}
void graph_bullet(){
        int i,j;
        SetDrawMode( DX_DRAWMODE_BILINEAR ) ;//線形補完描画
        for(i=0;i<TAMAMAX;i++){//敵の弾幕数分ループ
                if(shot_t[i].flg>0){//弾幕データがオンなら
                        for(j=0;j<TAMASUU_MAX;j++){//その弾幕が持つ弾の最大数分ループ
                                if(shot_t[i].a[j].flg!=0){//弾データがオンなら
                                        if(shot_t[i].a[j].eff==1)
                                                SetDrawBlendMode( DX_BLENDMODE_ADD, 255) ;

                                        DrawRotaGraphF(
                                                shot_t[i].a[j].x+20, shot_t[i].a[j].y+20,
                                                1.0, shot_t[i].a[j].angle+PI/2,
                                                img[1],TRUE);

                                        
                                }
                        }
                }
        }
        SetDrawMode(DX_DRAWMODE_NEAREST);//描画形式を戻す
}



メインルーチン	

コード:

#include "GV.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
	story_syokika();//ストーリーカウント0
    PlayerMgr_Initialize();    //プレイヤー管理モジュール初期化
	tama_Initialize_select();	//弾設定
	load_story();//ストーリー初期化設定
    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
        Keyboard_Update();    //キーボードの更新
        PlayerMgr_Update();   //プレイヤー管理モジュールの更新
        
		tama_update();//時期の球の軌道を更新
		
		enemy_Initialize();//敵データセット。
		enemy_shot_Update();//敵弾モジュール更新
		story_update();//敵管理モジュールの更新
		PlayerMgr_Draw();//プレイヤー管理モジュールの描画
		enemy_drow();//敵描画
		tama_drow();// 玉の軌道を描く
		graph_bullet();//敵弾描画
    }
    PlayerMgr_Finalize();    //プレイヤー管理モジュールの終了処理

    DxLib_End();
    return 0;
}

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

Re: 13章で詰みました・・・・・・

#2

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

何らかのエラーは出ていませんか?
ただ内容を移していくだけでなくデバッグ方法を学んだほうが良いと思います。
※ デバッグ開始でテストしてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 13章で詰みました・・・・・・

#3

投稿記事 by Dixq (管理人) » 12年前

ブレイクポイントの使い方は分かりますか?
実行コードを最初から止めておき、順々に進めて、どこでウィンドウが消えたか確認して下さい。
すぐに原因は分かると思います。

維管束

Re: 13章で詰みました・・・・・・

#4

投稿記事 by 維管束 » 12年前

ありがとうございます

いろいろしてみると
途中でハンドルされていない例外が発生しました。
とでました

これはどういう意味なのでしょうか・?

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

Re: 13章で詰みました・・・・・・

#5

投稿記事 by nil » 12年前

発生した例外がcatchされなかったってことでしょう。
原因として考えられるは配列の範囲外にアクセスした、初期化していない変数を使った、とかですかね。
お二方の仰る通り、ブレークポイントを設置したりするべきかと。

あとは怪しいところをコメントアウトしてみたり、でしょうか

維管束

Re: 13章で詰みました・・・・・・

#6

投稿記事 by 維管束 » 12年前

みなさんありがとうございました
原因はcsvファイルの数値がおかしく、
本来ありえない数値が代入されていました。

たすかりました!
またよろしくお願いします!!!

閉鎖

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