なぜかデバック無しで実行してもウィンドウが消えてしまいます。
なぜでしょうか・・・?
一応問題があると思うプログラム
敵玉制御
#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;
}