下記のようなコード(原因であろう部分のみ上げます)を書いたのですが、「ハンドルされない例外が 0x016307FB (testDX.exe) で発生しました: 0xC0000005: 場所 0x0B6C92BA の読み取り中にアクセス違反が発生しました。」という例外がスローされてしまいました。解決方法が全く分からないので、誰かアドバイスいただけますでしょうか。
コード:
/* WinMain.cpp */
#include "WinMain.h"
//ファイル共用変数宣言
int LoopTime = 0, NowTime = 0; // ループカウント変数
Color ColorValue; // 色ハンドル変数
int FontMidium, FontBig; // フォントハンドル 普通, 大
int MoveCounter; // 行動カウンタ
// フラグ変数
GameScreen GameS; // ゲーム状態フラグ変数
PlayBgmFlag BgmFlag = BGM_NULL; // BGMフラグ定数
int Choose = 0; // 選択フラグ
// フラグここまで
// ここまで
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); // ウィンドウモード
SetGraphMode(320, 256, 16); // 画面モード設定 解像度320*256 色ビット16bit
if (DxLib_Init() == -1) return -1; // DXライブラリ初期化
SetDrawScreen(DX_SCREEN_BACK); // 画像絵画スクリーンセット : バックスクリーン
// 色々変数セット
LoopTime = 0 , NowTime = 0; // 時刻インプット
GameS = GAME_TITLE; // フラグ タイトル処理
// フォントハンドル
FontMidium = CreateFontToHandle("FontMidium", 10, 1, DX_FONTTYPE_NORMAL);
FontBig = CreateFontToHandle("FontBig", 25, 2, DX_FONTTYPE_NORMAL);
// フォントここまで
// ここまで
LoadGameImage(); // 使用画像読み込み
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) // Windowsからのメッセージ受信 or Escキー押されるまで無限ループ
{
MoveCounter %= MOVE_C; // 行動カウンタ更新
if (MoveCounter != 0) MoveCounter++; // 移動カウンタ上げる
LoopTime++; // 時間上げる
ClearDrawScreen(); // 描画された画像消去
switch (GameS) { // ゲーム処理
case GAME_TITLE: // タイトル画面処理
GameTitle();
break;
case GAME_MAIN: // ゲームメイン画面処理
GameMain();
break;
}
ScreenFlip(); // 画面入れ替え
if (GameS == GAME_END) break; // ゲーム終了フラグが渡されたとき、無限ループ脱出
}
DxLib_End(); // DXライブラリ終了処理
return 0; // おしまい
}
コード:
/* GameMain.cpp */
#include "GameMain.h"
void GameMain() { // メイン画面
if(DrawMap() == -1) return; // マップ描画
MDChara(); // キャラ移動&描画処理
if (BgmFlag != BGM_YaminoDoukutu) {
PlaySound("Material\\bgm\\闇の洞窟.wav", DX_PLAYTYPE_LOOP); // BGM再生
BgmFlag = BGM_YaminoDoukutu; // BGMフラグセット
}
return;
}
void MDChara(){ // キャラ移動&描画処理
for (int couX = 0; couX <= ChipX; couX++) { // 初期化
for (int couY = 0; couY <= ChipY; couY++) {
CharaColision[couY][couX] = 0;
}
}
for (int cou = 0;(cou < MaxChara) || (ACharaDataV[cou].living == TRUE); cou++) {
DrawGraph(ACharaDataV[cou].X*ChipSize - MapC, ACharaDataV[cou].Y*ChipSize - MapC, CharaDataV[ACharaDataV[cou].CharaCode].Graphic[0], TRUE); // キャラ描画
CharaColision[ACharaDataV[cou].Y][ACharaDataV[cou].X] = 1; // 当たり判定
}
// 主人公移動処理
int KeyPut = GetJoypadInputState(DX_INPUT_KEY_PAD1); // ジョイパッド(操作機器)
if (MoveCounter == 0) { // 主人公移動設定
int pX = ACharaDataV[Shuzinkou].X, pY = ACharaDataV[Shuzinkou].Y; // 主人公座標変数(仮)
if (KeyPut & PAD_INPUT_UP) pY--; // 上
if (KeyPut & PAD_INPUT_DOWN) pY++; // 下
if (KeyPut & PAD_INPUT_LEFT) pX--; // 左
if (KeyPut & PAD_INPUT_RIGHT) pX++; // 右
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;
MoveCounter++;
}
} // ここまで
for (int cou = 2; (cou < MaxChara) || (ACharaDataV[cou].living == TRUE); cou++) { // その他キャラ移動処理
if (MoveCounter == 15) {
int pX = ACharaDataV[cou].X, pY = ACharaDataV[cou].Y; // キャラ座標変数(仮)
// 方向ランダム割り出し
srand((unsigned int)LoopTime);
int Direc = rand() % Direction + 1;
// ここまで
switch (Direc) { // 移動処理
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;
}
}
}
return;
}
void InitGame() { // ゲームスタート時処理
int CharaNum = 2; // キャラ番号
for (int CountedY = 0; CountedY < ChipY; CountedY++) { // 主人公位置検査
for (int CountedX = 0; CountedX < ChipX; CountedX++) {
int CharaPosition = MapData[0][5][CountedY][CountedX]; // 座標検査
switch (CharaPosition) {
case Shuzinkou: // 主人公処理
AssignACharaData(Shuzinkou, (CharaCode)CharaPosition,TRUE,CountedX,CountedY); // 出現キャラデータ代入
MapData[0][5][CountedY][CountedX] = 0; // 後始末
break;
case BakeTomato: // モンスターまとめて処理
case AnaMogura:
case KazeItachi:
case Ninzinashi:
case Gavra:
case Torrent:
case Doron:
case SleepSheep:
case InoFang:
case Goblin:
case TamagoDori:
case Chimera:
case Slime:
case BakeKinoko:
case DorobouGitsune:
case HengeDanuki:
case Kappa:
case Zimera:
case KimenIwa:
case KuroGarasu:
case Togera:
case Ghost:
case Lizard:
case TitanKids:
case EvilBat:
case Goole:
case Mimic:
case MadouRobe:
case Golem:
case ScullKnight:
case ArkDragon:
case Daikonashi:
case Agra:
case KamaItachi:
case BrDoron:
case HobGoblin:
case Chimaira:
case SlimeBes:
case Toadstool:
case SaraGyozin:
case Fantasma:
case YouganIwa:
case OrgaKids:
case DarkBat:
case Pandora:
case IronGolem:
case BinboGami: // モンスターまとめて処理
AssignACharaData(CharaNum, (CharaCode)CharaPosition, TRUE, CountedX, CountedY); // 出現キャラデータ代入
MapData[0][5][CountedX][CountedY] = 0; // 後始末
CharaNum++;
break;
}
}
}
return;
}
アドバイスしていただける方、有難うございます。