C言語でSTGを作っています

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しょうた
記事: 2
登録日時: 2年前

C言語でSTGを作っています

#1

投稿記事 by しょうた » 2年前

学校でC言語でSTGを作るという課題がありまして、プレイヤー(Player)と敵(Enemy)が衝突した時、プレイヤーのみが非表示となり、 プログラムが強制終了しないように修正しなさい。ということなんですが、デバックの開始をすると0x00007FF6557EDEEF で例外がスローされました 0xC0000005: 場所 0x0000000000000090 の読み取り中にアクセス違反が発生しましたというエラーが発生して
カーソルを置いて確認していたらEnemyのところでg_pEnemy = 0x000001568c2cfdc0 {m_pPolygon=empty m_pPolygonTex=unique_ptr {m_pSampleLinear=0x000001568c2ccf60 <情報はありません。d3d11.dll のシンボルが読み込まれていません>という文が表示されて、どこを直せばよいのか全く分かりません

コード:

// プレイヤーの画像を管理する変数
CPicture* g_pPlayer = NULL;

// 敵の画像を管理する変数
CPicture* g_pEnemy = NULL;

//ゲーム画面のフェーズを管理する変数
ePhase g_titlePhase = eBegin;

/*
 * タイトルの処理を行う部分
 */
void CActionGameApp::procTitle()
{
	switch( g_titlePhase)
	{
		case eBegin:
		{
                        // g_pPlayerがNULLの時のみ画像を作成する
			if (g_pPlayer == NULL)
			{
          //プレイヤーの画像を作成・配置する
				g_pPlayer = createSprite(Tex_Player, 32.0f, 32.0f);
			}
       // g_pEnemyがNULLの時のみ画像を作成する
			if (g_pEnemy == NULL)
			{
          // 敵の画像を作成・配置する
				g_pEnemy = createSprite(Tex_Enemy, 32.0f, 32.0f);
				g_pEnemy->setPos( 0.0f, 100.0f);
			}

			g_titlePhase = eMain;
		}
		break;
		case eMain:
		{
       //上キーが押されたら上に移動する
			if (m_pDirectInput->isKeyPressed(DIK_UPARROW))
			{
				g_pPlayer->setPos(0.0f, g_pPlayer->getPos().y + 2.0f);  ←呼び出し履歴でここがでていました。
(g_pPlayer = 0x0000000000000000 <NULL>)←カーソルを置くとこれが表示されます
			}

			if( g_pPlayer->collision(g_pEnemy)!= NULL)
			{
				disposeSprite(g_pPlayer);
				g_pPlayer = NULL;
			}

			renderSprite( g_pPlayer);
			renderSprite( g_pEnemy);
		}
		break;
		case eEnd:
		{
			if (g_pEnemy != NULL)
			{
				disposeSprite( g_pEnemy);
				g_pEnemy = NULL;
			}
			if (g_pPlayer != NULL)
			{
				disposeSprite(g_pPlayer);
				g_pPlayer = NULL;
			}
		}
		break;
	}
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C言語でSTGを作っています

#2

投稿記事 by みけCAT » 2年前

g_pPlayer が NULL かをチェックせずに g_pPlayer->getPos を使ったことで落ちているようなので、
g_pPlayer->getPos など g_pPlayer をデリファレンスする前に必ず g_pPlayer が NULLでないかをチェックし、
NULL だった場合はデリファレンスしないようにするといいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

しょうた
記事: 2
登録日時: 2年前

Re: C言語でSTGを作っています

#3

投稿記事 by しょうた » 2年前

g_pPlayer &&m_pDirectInput->isKeyPressed(DIK_UPARROW)

g_pPlayer&&g_pPlayer->collision(g_pEnemy)!= NULL

アンド演算を使ったらエラーを解消出来ました。

回答して頂き誠にありがとうございました

返信

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