キャラの4方向にほかのキャラがいるかどうかのフラグの操作がうまくいきません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

キャラの4方向にほかのキャラがいるかどうかのフラグの操作がうまくいきません

#1

投稿記事 by もるも » 8年前

初めまして。
アクションRPGを作っているのですが(ツクールやウディタのようなマス移動)
キャラの4方向にほかのキャラがいたらそのキャラが持っているメンバ変数の上下左右のフラグをtrueになるようにしたいのですが、
どのキャラと接触してもDrawStringの文字はちゃんと表示されるのですが、
フラグだけは1番目のキャラとしか反応してくれなかったり、
うまくいきません。(プレイヤーは0番目)

Visual C++ 2010 、DXライブラリを使用しています。
よろしくお願いします。

コード:

 
void Control::FourOnCollision(){
		for(int i=0;i<ENEMY_NUM;i++){  
			if(gamechara[i]->GetExist()){   //生存チェック
				for(int t =0;t<ENEMY_NUM;t++){	//ターゲット
					if(gamechara[t]->GetExist()){
						if(i==t)continue;   //同じキャラは判定しない
			 int result =collision->FouronCollision(   //当たり判定
									gamechara[i]-> GetCollRightX(),gamechara[i]-> GetCollRightY(),
									gamechara[i]->GetCollRightW(),gamechara[i]->GetCollRightH(),
									gamechara[i]-> GetCollLeftX(),gamechara[i]->  GetCollLeftY(),
									gamechara[i]->GetCollLeftW(),gamechara[i]-> GetCollLeftH(),
									gamechara[i]-> GetCollUpX(),gamechara[i]-> GetCollUpY(),
									gamechara[i]->GetCollUpW(),gamechara[i]-> GetCollUpH(),
									gamechara[i]-> GetCollDownX(),gamechara[i]-> GetCollDownY(),
									gamechara[i]->GetCollDownW(),gamechara[i]-> GetCollDownH(),
									gamechara[t]->GetX(),gamechara[t]->GetY(),
									gamechara[t]->GetWidth(),gamechara[t]->GetHeight());
					
		if(result==1){	//右
			gamechara[i]->SetboRight(true);
			DrawString(100,200,"右",GetColor(255,255,0),0);
				}else{gamechara[i]->SetboRight(false);}
				
		if(result==2){	//左
			gamechara[i]->SetboLeft(true);
			DrawString(100,220,"左",GetColor(255,255,0),0);
				}else{gamechara[i]->SetboLeft(false);}
				
		if(result==3){	//上
			gamechara[i]->SetboUp(true);
			DrawString(100,240,"上",GetColor(255,255,0),0);
				}else{gamechara[i]->SetboUp(false);}
				
		if(result==4){	//下
			gamechara[i]->SetboDown(true);
			DrawString(100,260,"下",GetColor(255,255,0),0);	
				}else{gamechara[i]->SetboDown(false);}			
					}
				}
			}
		}
}

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

Re: キャラの4方向にほかのキャラがいるかどうかのフラグの操作がうまくいきません

#2

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

インデントが激しく見づらいですが、このコードだけだとうまく行くんじゃないでしょうか?
【訂正】 よく見たらターゲットループで値を上書きしてますね。これだとループの最後の状況しか残りません。
デバッガで変数の変化をトレースすることをおすすめします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: キャラの4方向にほかのキャラがいるかどうかのフラグの操作がうまくいきません

#3

投稿記事 by もるも » 8年前

イメージが掴めました!ありがとうございます。
ループで接触していない遠くにいる他のターゲットの判定もしていて、
elseの部分でフラグが常に上書きされてしまっているということですね。

条件分岐考え直します。

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: キャラの4方向にほかのキャラがいるかどうかのフラグの操作がうまくいきません

#4

投稿記事 by もるも » 8年前

当たり判定がないときはcontinueで戻すことで
上書きされないようにしてみました。
上下左右のフラグを下げる処理がどうしても思いつかなかったので、
gamechara内のupdate()などで常にフラグを下げるようにしたらうまくいきました。
softyaさんありがとうございました。

コード:

void Control::FourOnCollision(){
		for(int i=0;i<ENEMY_NUM;i++){
			if(gamechara[i]->GetExist()){//生存チェック
		for(int t =0;t<ENEMY_NUM;t++){  //ターゲット
			if(gamechara[t]->GetExist()){
					if(i==t)continue;//同じキャラは判定しない
						int result =collision->FouronCollision(//当たり判定
                                    gamechara[i]-> GetCollRightX(),gamechara[i]-> GetCollRightY(),
                                    gamechara[i]->GetCollRightW(),gamechara[i]->GetCollRightH(),
                                    gamechara[i]-> GetCollLeftX(),gamechara[i]->  GetCollLeftY(),
                                    gamechara[i]->GetCollLeftW(),gamechara[i]-> GetCollLeftH(),
                                    gamechara[i]-> GetCollUpX(),gamechara[i]-> GetCollUpY(),
                                    gamechara[i]->GetCollUpW(),gamechara[i]-> GetCollUpH(),
                                    gamechara[i]-> GetCollDownX(),gamechara[i]-> GetCollDownY(),
                                    gamechara[i]->GetCollDownW(),gamechara[i]-> GetCollDownH(),
                                    gamechara[t]->GetX(),gamechara[t]->GetY(),
                                    gamechara[t]->GetWidth(),gamechara[t]->GetHeight());

          //当たっていないなら判定しない
			if(result==0)continue;
			
        if(result==1){  //右
          gamechara[i]->SetboRight(true);
          DrawString(100,200,"右",GetColor(255,255,0),0);
		}
        if(result==2){  //左
           gamechara[i]->SetboLeft(true);
           DrawString(100,220,"左",GetColor(255,255,0),0);
		}        
        if(result==3){  //上
           gamechara[i]->SetboUp(true);
           DrawString(100,240,"上",GetColor(255,255,0),0);
		}       
        if(result==4){  //下
            gamechara[i]->SetboDown(true);
            DrawString(100,260,"下",GetColor(255,255,0),0);    
		}
                    }
                }
            }
        }	
}	

閉鎖

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