ページ 11

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

Posted: 2015年11月14日(土) 01:02
by もるも
初めまして。
アクション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);}			
					}
				}
			}
		}
}

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

Posted: 2015年11月14日(土) 15:42
by softya(ソフト屋)
インデントが激しく見づらいですが、このコードだけだとうまく行くんじゃないでしょうか?
【訂正】 よく見たらターゲットループで値を上書きしてますね。これだとループの最後の状況しか残りません。
デバッガで変数の変化をトレースすることをおすすめします。

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

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

条件分岐考え直します。

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

Posted: 2015年11月16日(月) 00:11
by もるも
当たり判定がないときは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);    
		}
                    }
                }
            }
        }	
}