ページ 11

表示したキャラがおかしな動きをしてしまいます

Posted: 2016年11月19日(土) 21:18
by Ofu
毎度お世話になっております。

今回、キャラの移動に方向フラグ、少しずつ移動を実装し、カウンタが0~16のときは主人公、17~32のときは他のキャラが動くように設定しようとして以下のようなコードを書いたところ、キャラが勝手に、しかも主人公は上方向に移動しては移動する前のところに戻るを延々と繰り返し、他のキャラは移動したら急にワープするという大惨事になってしまっています。下の範囲でどこか誤りがないか探したのですが、わかりませんでした。毎回申し訳ございませんが、どなたかアドバイスをお願いいたします。

コード:

/* CharaData.cpp */
// 前略

enum CharaDirection{ // キャラの向き
	CHARADIRECTION_UP = 1,
	CHARADIRECTION_DOWN,
	CHARADIRECTION_LEFT,
	CHARADIRECTION_RIGHT,
	CHARADIRECTION_UPLEFT,
	CHARADIRECTION_UPRIGHT,
	CHARADIRECTION_DOWNLEFT,
	CHARADIRECTION_DOWNRIGHT
};

};

// 後略

コード:

/* GameMain.cpp */

void MDChara(){	// キャラ移動&描画処理

	for (int couX = 0; couX <= ChipX; couX++) {		// 当たり判定初期化
		for (int couY = 0; couY <= ChipY; couY++) {
			CharaColision[couY][couX] = 0;
		}
	} // ここまで

	// 主人公移動処理
	int KeyPut = GetJoypadInputState(DX_INPUT_KEY_PAD1);	// ジョイパッド(操作機器)
	if (MoveCounter == 0) {		// 主人公移動設定
		int pX = ACharaDataV[Shuzinkou].X, pY = ACharaDataV[Shuzinkou].Y;		// 主人公座標変数(仮)	

		if (KeyPut & PAD_INPUT_UP) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_UP; pY--;													// 上
		if (KeyPut & PAD_INPUT_DOWN) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_DOWN; pY++;												// 下
		if (KeyPut & PAD_INPUT_LEFT) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_LEFT; pX--;												// 左
		if (KeyPut & PAD_INPUT_RIGHT) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_RIGHT; pX++;											// 右 
		if ((KeyPut & KEY_INPUT_UP) && (KeyPut & KEY_INPUT_LEFT)) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_UPLEFT;	pX--; pY--;			// 左上
		if ((KeyPut & KEY_INPUT_UP) && (KeyPut & KEY_INPUT_RIGHT)) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_UPRIGHT; pX++; pY--;		// 右上
		if ((KeyPut & KEY_INPUT_DOWN) && (KeyPut & KEY_INPUT_LEFT)) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_DOWNLEFT; pX--; pY++;		// 左下
		if ((KeyPut & KEY_INPUT_DOWN) && (KeyPut & KEY_INPUT_RIGHT)) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_DOWNRIGHT; pX++; pY++;	// 右下

		if (((MapChipV.ColisionDetection[MapData[0][0][pY][pX]] != 1) && (MapChipV.ColisionDetection[MapData[0][1][pY][pX]] != 1) && (MapChipV.ColisionDetection[MapData[0][2][pY][pX]] != 1))
			&& (CharaColision[pY][pX] != 1) && (pX > 1 && pX < MAP_X && pY > 1 && pY < MAP_Y)) {
			ACharaDataV[Shuzinkou].X = pX, ACharaDataV[Shuzinkou].Y = pY;
			CharaColision[pY][pX] = 1;
			MoveCounter++;
		}
	} // ここまで

	for (int cou = 2; (cou < MaxChara) && (ACharaDataV[cou].living == TRUE); cou++) {	// その他キャラ移動処理

		if (MoveCounter == 16) {
			int pX = ACharaDataV[cou].X, pY = ACharaDataV[cou].Y;	// キャラ座標変数(仮)

			// 方向ランダム割り出し
			srand((unsigned int)GetNowCount()+cou*cou-cou);

			ACharaDataV[cou].Direction = (CharaDirection)(rand() % DirectionN + 1);
			// ここまで
			
			switch (ACharaDataV[cou].Direction) {	// 移動処理
			case CHARADIRECTION_UP:			// 上	
				pY--; break;
			case CHARADIRECTION_DOWN:		// 下
				pY++; break;
			case CHARADIRECTION_LEFT:		// 左
				pX--; break;
			case CHARADIRECTION_RIGHT:		// 右
				pX++; break;
			case CHARADIRECTION_UPLEFT:		// 左上
				pY--; pX--; break;
			case CHARADIRECTION_UPRIGHT:	// 右上
				pY--; pX++; break;
			case CHARADIRECTION_DOWNLEFT:	// 左下
				pY++; pX--; break;
			case CHARADIRECTION_DOWNRIGHT:	// 右下
				pY++; pX++; break;
			}

			if (((MapChipV.ColisionDetection[MapData[0][0][pY][pX]] != 1) && (MapChipV.ColisionDetection[MapData[0][1][pY][pX]] != 1) && (MapChipV.ColisionDetection[MapData[0][2][pY][pX]] != 1))
				&& (CharaColision[pY][pX] != 1) && (pX > 1 && pX < MAP_X && pY > 1 && pY < MAP_Y)) {
				ACharaDataV[cou].X = pX; ACharaDataV[cou].Y = pY;
				CharaColision[pY][pX] = 1;
			}
		
		} // ここまで

		for (int cou = 0; (cou < MaxChara) || (ACharaDataV[cou].living == TRUE); cou++) { // キャラ移動処理

			int pX = 0, pY = 0;	// 移動する方向&距離記憶変数

			int Mcou = MoveCounter;	// 移動する距離一時記憶変数
			if (Mcou < 16) Mcou -= 16;
			Mcou *= 2;

			switch (ACharaDataV[cou].Direction) {	// 移動する方向&距離代入
			case CHARADIRECTION_UP:
				pY = Mcou*-1; break;
			case CHARADIRECTION_DOWN:
				pY = Mcou; break;
			case CHARADIRECTION_LEFT:
				pX = Mcou*-1; break;
			case CHARADIRECTION_RIGHT:
				pX = Mcou; break;
			case CHARADIRECTION_UPLEFT:
				pX = Mcou*-1; pY = Mcou*-1; break;
			case CHARADIRECTION_UPRIGHT:
				pX = Mcou; pY = Mcou*-1; break;
			case CHARADIRECTION_DOWNLEFT:
				pX = Mcou*-1; pY = Mcou; break;
			case CHARADIRECTION_DOWNRIGHT:
				pX = Mcou; pY = Mcou; break;
			} // ここまで

			if (MoveCounter < 16 && cou == 1) {
				DrawGraph(ACharaDataV[cou].X*ChipSize - MapC - pX, ACharaDataV[cou].Y*ChipSize - MapC - pY, CharaDataV[ACharaDataV[cou].CharaCode].Graphic[0], TRUE);	// キャラ描画
			}
			else if (MoveCounter == 16 && cou == 1) {
				DrawGraph(ACharaDataV[cou].X*ChipSize - MapC, ACharaDataV[cou].Y*ChipSize - MapC, CharaDataV[ACharaDataV[cou].CharaCode].Graphic[0], TRUE);
			}
			else if ((MoveCounter > 16 && MoveCounter < 32) && cou != 1) {
				DrawGraph(ACharaDataV[cou].X*ChipSize - MapC - pX, ACharaDataV[cou].Y*ChipSize - MapC - pY, CharaDataV[ACharaDataV[cou].CharaCode].Graphic[0], TRUE);
			}
			else {
				DrawGraph(ACharaDataV[cou].X*ChipSize - MapC, ACharaDataV[cou].Y*ChipSize - MapC, CharaDataV[ACharaDataV[cou].CharaCode].Graphic[0], TRUE);
			}


		}	// ループここまで
	}

	return;

}

Re: 表示したキャラがおかしな動きをしてしまいます

Posted: 2016年11月19日(土) 21:27
by みけCAT
Ofu さんが書きました:

コード:

		if (KeyPut & PAD_INPUT_UP) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_UP; pY--;													// 上
		if (KeyPut & PAD_INPUT_DOWN) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_DOWN; pY++;												// 下
		if (KeyPut & PAD_INPUT_LEFT) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_LEFT; pX--;												// 左
		if (KeyPut & PAD_INPUT_RIGHT) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_RIGHT; pX++;											// 右 
		if ((KeyPut & KEY_INPUT_UP) && (KeyPut & KEY_INPUT_LEFT)) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_UPLEFT;	pX--; pY--;			// 左上
		if ((KeyPut & KEY_INPUT_UP) && (KeyPut & KEY_INPUT_RIGHT)) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_UPRIGHT; pX++; pY--;		// 右上
		if ((KeyPut & KEY_INPUT_DOWN) && (KeyPut & KEY_INPUT_LEFT)) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_DOWNLEFT; pX--; pY++;		// 左下
		if ((KeyPut & KEY_INPUT_DOWN) && (KeyPut & KEY_INPUT_RIGHT)) ACharaDataV[Shuzinkou].Direction = CHARADIRECTION_DOWNRIGHT; pX++; pY++;	// 右下
ここのif文の後ろに書かれているインクリメントやデクリメントはif文の条件に関係なく実行されますが、意図した仕様ですか?
(でも相殺されるので主人公は動かなそうな気がしますが…なんで勝手に動くのでしょうか?)

また、仮にインクリメントやデクリメントを条件が真のときしか実行しないようにした場合、
else ifを使わないと軸に平行な移動の判定と斜めの移動の判定で二重にインクリメントやデクリメントが行われてしまうでしょう。