スプライトを使用した単純な DirectX 9 2D ゲームに取り組んでいます。私は小さなエンジンを作成し (書籍やオンラインで見つけたいくつかのコード スニペットをつなぎ合わせました)、アプリケーションの衝突検出要素に取りかかりました。衝突検出用に作成した関数でスタック オーバーフロー エラーが発生しています。
UINT Game::IsCollision(int a, int b)
{
if(a != b)
{
if((m_Sprites[a].posrect.bottom >= m_Sprites[b].posrect.top) && (m_Sprites[a].posrect.top <= m_Sprites[b].posrect.bottom) && (m_Sprites[a].posrect.right >= m_Sprites[b].posrect.left) && (m_Sprites[a].posrect.left <= m_Sprites[b].posrect.right))
{
if(m_Sprites[a].posrect.top < m_Sprites[b].posrect.top && m_Sprites[a].posrect.top < m_Sprites[b].posrect.bottom && m_Sprites[a].posrect.bottom < m_Sprites[b].posrect.bottom)
{
return BOTTOM;
}
else if(m_Sprites[b].posrect.top < m_Sprites[a].posrect.top && m_Sprites[a].posrect.top < m_Sprites[b].posrect.bottom && m_Sprites[b].posrect.bottom < m_Sprites[a].posrect.bottom)
{
return TOP;
}
else if( m_Sprites[a].posrect.left < m_Sprites[b].posrect.left && m_Sprites[b].posrect.left < m_Sprites[a].posrect.right && m_Sprites[a].posrect.right < m_Sprites[b].posrect.right)
{
return RIGHT;
}
else if( m_Sprites[b].posrect.left < m_Sprites[a].posrect.left && m_Sprites[a].posrect.left < m_Sprites[b].posrect.right && m_Sprites[b].posrect.right < m_Sprites[a].posrect.right)
{
return LEFT;
}
}
else
{
return NOCOLLISION;
}
}
return NOCOLLISION;
}
また、関数を呼び出す方法は次のとおりです。
void Game::UpdateSprite(int e)
{
UINT collision;
for(int f = 0; f < MAX_SPRITES; f++)
{
if(m_Sprites[f].occupied && m_Sprites[e].occupied && f != e)
{
collision = IsCollision(f, e);
switch (collision)
{
case BOTTOM:
m_Sprites[e].movey *= -1;
m_Sprites[f].movey *= -1;
break;
case TOP:
m_Sprites[e].movey *= -1;
m_Sprites[f].movey *= -1;
break;
case RIGHT:
m_Sprites[e].movex *= -1;
m_Sprites[f].movex *= -1;
break;
case LEFT:
m_Sprites[e].movex *= -1;
m_Sprites[f].movex *= -1;
break;
case NOCOLLISION:
break;
}
UpdateSprite(e);
UpdateSprite(f);
}
}
}