1

我目前正在制作一个非常简单的 Sprite 到墙壁碰撞检测程序,如果我的火柴人碰到它,它会停在墙壁上。我的代码运行良好,但问题是我的火柴人精灵不会停在墙的左侧和顶部(在这种情况下,仅左侧和顶部的屏幕高度和屏幕宽度)。这是我的代码,你能找出问题出在哪里,我该如何解决。

bool check_CollisionWall(oSprite* Sprite1)
{    
    //top left
    if(Sprite1->m_vPosition.x <= 0 && Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth >= SCREEN_WIDTH)
    {
        if(Sprite1->m_vPosition.y <= 0 &&  Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight >= SCREEN_HEIGHT)
        {
            return true;
        }
    }

    //top right
    if(Sprite1->m_vPosition.x+Sprite1->m_nFrameWidth > 0 && Sprite1->m_vPosition.x+Sprite1->m_nFrameWidth >= SCREEN_WIDTH)
    {
        if(Sprite1->m_vPosition.y <= 0 &&  Sprite1->m_vPosition.y+Sprite1->m_nFrameHeight >= SCREEN_HEIGHT)
        {
            return true;
        }
    }

    //bottom left
    if( Sprite1->m_vPosition.x > 0 && Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth <= SCREEN_WIDTH )
    {
        if( Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight > 0 && Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight <= SCREEN_HEIGHT )
        {
            return true;
        }
    }

    //bottom right
    if(Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth > 0 && Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth <= SCREEN_WIDTH)
    {
        if(Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight > 0 &&  Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight <= SCREEN_HEIGHT)
        {
            return true;
        }
    }

    return false;
}
4

2 回答 2

2

这应该可以解决您的问题,碰撞检查是分离的,即它们是独立的。所以本质上这会检查左碰撞或右碰撞,如果其中一个为真,则返回真,对于 y 方向也是如此。

bool check_CollisionWall(oSprite* Sprite1)
{  

//left or right
if(Sprite1->m_vPosition.x <= 0 || Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth >= SCREEN_WIDTH)
{
    return true;
}

//top or bottom
if(Sprite1->m_vPosition.y <= 0 ||  Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight >= SCREEN_HEIGHT)
{
    return true;
}

return false;
}
于 2013-07-09T19:17:04.540 回答
0

您只需要检查与左侧、顶部、右侧和底部墙壁的碰撞。没有要检查的左上、右下组合。

将进行 4 次简单检查。

  1. 左墙碰撞 - 检查精灵的左侧是否 <=0
  2. 右墙碰撞 - 检查 x 坐标 + 精灵宽度是否 >= 右墙索引。
  3. & 4. 与左右墙逻辑类似,只需将其用于顶部和底部。

这些将是 4 个独立的 if 语句。如果是我看到的方式,则不需要嵌套。

即使其中一个返回正值,您也会发生冲突,并且该函数应该返回 true。

于 2013-07-09T13:31:09.383 回答