ページ 11

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

Posted: 2021年12月28日(火) 18:16
by しょうた
学校で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;
	}
}

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

Posted: 2021年12月28日(火) 19:01
by みけCAT
g_pPlayer が NULL かをチェックせずに g_pPlayer->getPos を使ったことで落ちているようなので、
g_pPlayer->getPos など g_pPlayer をデリファレンスする前に必ず g_pPlayer が NULLでないかをチェックし、
NULL だった場合はデリファレンスしないようにするといいかもしれません。

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

Posted: 2021年12月30日(木) 02:10
by しょうた
g_pPlayer &&m_pDirectInput->isKeyPressed(DIK_UPARROW)

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

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

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