敵を動かす

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

敵を動かす

#1

投稿記事 by クロウ » 16年前

歩くマインスイーパで、敵を出そうとしているのですが、
出した敵が一回動いたきりで固まってしまっています。
敵を動かす部分を載せましたので、どうすれば正しく動くようになるかアドバイスをお願いします。
敵の動かし方は「ランダムに向きを決定し、一マス動かす」で、当たり判定等はクリアしていると見てください。

void enemyChangeVector(int Num){//敵キャラの向きを変える
	enemyData[Num].vector = GetRand(100)%4;//向きをかえる
}



void enemyMoveFlag(int Num){//敵の動きフラグ



	if(enemyData[Num].true_X%16 ==0 && enemyData[Num].true_Y%16 == 0){

		enemyData[Num].walking_flag = true;         //歩くフラグを立てる。

		if(enemyData[Num].walking_flag == true)  //もし歩くとき
		{
			if(enemy_Can_Or_Cannot(enemyData[Num].vector, Num) == true
				|| enemy_checkHigh(enemyData[Num].vector , Num) == true
				|| enemy_searchMine(enemyData[Num].vector , Num) == false)//行き先が歩けなかったら
			{
				enemyData[Num].walking_flag = false;//歩かないフラグを立てる。
			}
			
		}
	}

}

int actionPattern = changeVector;

void enemyMove(int Num){

	if(enemyData[Num].walking_flag == true){//歩くフラグが立っていたら
		if(enemyData[Num].vector == up)        //上向きならenemyData[Num].true_Y座標を減らす
		{
			enemyData[Num].true_Y-= 16;
			enemyData[Num].walking_flag = false;//歩かないフラグを立てる。

		}
		else if(enemyData[Num].vector == left)        //左向きならenemyData[Num].true_Y座標を減らす
		{
			enemyData[Num].true_X -=16;
			enemyData[Num].walking_flag = false;//歩かないフラグを立てる。

		}
		else if(enemyData[Num].vector == down)        //下向きならenemyData[Num].true_Y座標を増やす
		{
			enemyData[Num].true_Y +=16;
			enemyData[Num].walking_flag = false;//歩かないフラグを立てる。

		}
		else if(enemyData[Num].vector == right)        //右向きならenemyData[Num].true_Y座標を増やす
		{
			enemyData[Num].true_X += 16;
			enemyData[Num].walking_flag = false;//歩かないフラグを立てる。

		}
	}

}
int Num = 0;//敵のナンバー

void enemyActionMain(){
	if(timer() % 50 == 0){//50フレームに一度
		if(enemyData[Num].life == 0){//ライフが0になったら
			enemyData[Num].alive = false;//死亡
		}

		if(Num < CHARAMAX){//キャラの最大数を下回っていたら
		}
		else{//上回っていたら
			Num = 0;//戻す
		}
		if(enemyData[Num].alive == true){//生きていたら動かす
			switch(actionPattern){
				case changeVector:

					enemyChangeVector(Num);

					actionPattern = move;

					break;

				case move:

					enemyMoveFlag(Num);
					enemyMove(Num);
					actionPattern = changeVector;
					Num++;//敵番号をインクリメント

				break;

			}
		}
	}

}

ねこ

Re:敵を動かす

#2

投稿記事 by ねこ » 16年前

動かなくなりそうなソース内部が分からないので何とも言えないですが

<1>
if(enemy_Can_Or_Cannot(enemyData[Num].vector, Num) == true
|| enemy_checkHigh(enemyData[Num].vector , Num) == true
|| enemy_searchMine(enemyData[Num].vector , Num) == false ) //行き先が歩けなかったら

<2>
if( timer() % 50 == 0 )

<3>
if( enemyData[Num].alive == true ){//生きていたら動かす

このあたりのIF文でブレイクをかけて「どこで思った通りの動きをしていないか」を探ってみると良いかもしれないですよ

クロウ

Re:敵を動かす

#3

投稿記事 by クロウ » 16年前

アドバイス通りにあちこちでbreakをかけてみた結果、原因がわかりました。
敵が生きていたら回るswitch文の中でNumをインクリメントしていたため、存在していない敵以降ではNumが回らず動かない。
というものです。
あと、actionpaternがグローバルにあったため、敵の数が偶数だと一方の敵は動くだけ、もう一方の敵は向きを変えるだけとなってしまっていました。

アドバイスありがとうございます。

閉鎖

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