ページ 11

フリーズします・・・

Posted: 2012年8月11日(土) 08:51
by オーヤルガー
こんにちは。
インベーダーゲームをつくっています。

敵(複数)のショットと自機の当たり判定処理をする関数でフリーズします。

コード:

//HitJudge.cpp

//プレイヤーと敵ショットの当たり判定関数
//引数はプレイヤーの構造体(PLAYER型)のポインタと敵の構造体(ENEMY型)のポインタ

int HitPlayerJudge(PLAYER* p_pointer_a ,ENEMY* e_pointer_a){

//自機が生存していたら
if(p_pointer_a->flag==1){

//当たり判定チェック
if( ( ( (e_pointer_a->shotx > p_pointer_a->x) && (e_pointer_a->shotx < (p_pointer_a->x + p_pointer_a->xsize) ) ) ||
      ( (p_pointer_a->x > e_pointer_a->shotx ) && (p_pointer_a->x < (e_pointer_a->shotx + e_pointer_a->shotxsize) ) ) ) &&
    ( ( (e_pointer_a->shoty > p_pointer_a->y )&& (e_pointer_a->shoty < (p_pointer_a->y + p_pointer_a->ysize) ) ) ||
      ( (p_pointer_a->y > e_pointer_a->shoty) && (p_pointer_a->y < (e_pointer_a->shoty + e_pointer_a->shotysize) ) ) ) ){

       //当たっていたら
	          p_pointer_a->flag=0;
	          return 1;
    }
    //それ以外
		 return 0;
  }
}

コード:

//main.cpp

  //自機の構造体のポインタを取得
  p_pointer=GetPlayerData();

for(int i=0;i<ENEMYXNUM;i++){
  for(int j=0;j<ENEMYYNUM;j++){
		
    //敵enemy[i][j]の構造体のポインタを取得			
     e_pointer=GetEnemyData(i,j);
	
  //当たり判定チェック				
  test=HitPlayerJudge(p_pointer,e_pointer);	
   }
}		
					

現在の状況でHitPlayerJudge関数の中でe_pointer_aに関する処理を行うとフリーズすることが分かっています。
例えば・・・

コード:

//フリーズしない

int HitPlayerJudge(PLAYER* p_pointer_a ,ENEMY* e_pointer_a){
	if(p_pointer_a->flag==1){

	      p_pointer_a->flag=0;
	      return 1;
			  
		}
		 return 0;
	}
}

コード:

//フリーズする

int HitPlayerJudge(PLAYER* p_pointer_a ,ENEMY* e_pointer_a){
	if(p_pointer_a->flag==1 && e_pointer_a->flag==1){
                                   
           p_pointer_a->flag=0;
	       return 1;
			  
		}
		 return 0;
	}
}


コード:

//フリーズする

int HitPlayerJudge(PLAYER* p_pointer_a ,ENEMY* e_pointer_a){
	if(p_pointer_a->flag==1){
                                   
           e_pointer_a->x=0;
	       p_pointer_a->flag=0;
	       return 1;
			  
		}
		 return 0;
	}
}


もう一週間くらい手詰まり状態でお手上げです。
どなたか解決方法が分かる方はいらっしゃいますか?
宜しくお願いします。

Re: フリーズします・・・

Posted: 2012年8月11日(土) 08:55
by beatle
インデントをきちんとしてください。話はそれからです。
少なくとも、オーヤルガーさんがお示しのHitPlayerJudge関数(2つ目以降)は、関数定義の体を成していません。

Re: フリーズします・・・

Posted: 2012年8月11日(土) 09:06
by オーヤルガー
すいません。
部分的にコピー&ペーストしていたらコピー範囲を間違えて
ひどいことになっていました。
出直してきます。

Re: フリーズします・・・

Posted: 2012年8月11日(土) 09:48
by beatle
どういうふうにインデントしたらいいか分からん、って場合は
mixcpp/投稿前チェックリスト チェック3 : インデントを揃えよう
を参考にしてみてください。

インデントが美しくなったら、次はHitPlayerJudgeを使用している側のソースコードも提示してください。
引数にどんな値を渡しているかが重要です。

Re: フリーズします・・・

Posted: 2012年8月11日(土) 17:54
by nait
そもそもフリーズっていうのはWindowsのメッセージキューの処理がされない(DxLibの場合はProcessMessage()で処理されていたはず)
が処理されていないからどこかで無限ループして処理が終わっていない可能性がある。
もしくはもう一つフリーズが起きる原因として配列外参照をしてしまったり、nullポインタとかで例外飛ばされてフリーズしている可能性もある。
他の例外も飛べばフリーズする可能性もあるけど...

で、よくコード見ていないけどフリーズする部分だけ見ているとe_pointer_aにアクセスするとエラーがでているから
e_pointer_aのヌルポアクセスでエラーでているんじゃないのか?
デバッガー掛けたときにエラーとかでてない?
とりあえず、
if( e_pointer_a == null )
{
MessageBox( NULL, TEXT("ぬるぽえらー"),TEXT("Error"),MB_OK );
return 0;
}
関数の頭に追加してやってみ

Re: フリーズします・・・

Posted: 2012年8月11日(土) 17:59
by nait
連投すみません。
おもったらヌルポだとわざといれないと多分ならないから
不正値のポインタのアクセスだとおもうからそのあたりチェックしてみてはいかがでしょうか?