表示したキャラがおかしな動きをしてしまいます
Posted: 2016年11月19日(土) 21:18
毎度お世話になっております。
今回、キャラの移動に方向フラグ、少しずつ移動を実装し、カウンタが0~16のときは主人公、17~32のときは他のキャラが動くように設定しようとして以下のようなコードを書いたところ、キャラが勝手に、しかも主人公は上方向に移動しては移動する前のところに戻るを延々と繰り返し、他のキャラは移動したら急にワープするという大惨事になってしまっています。下の範囲でどこか誤りがないか探したのですが、わかりませんでした。毎回申し訳ございませんが、どなたかアドバイスをお願いいたします。
今回、キャラの移動に方向フラグ、少しずつ移動を実装し、カウンタが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;
}