SDL碰撞检测

时间:2013-07-09 06:42:58

标签: c++ visual-c++ sdl

我目前正在制作一个非常简单的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;
}

2 个答案:

答案 0 :(得分:0)

您只需检查左侧,顶部,右侧和底部墙壁的碰撞情况。没有左上角,右下角组合可供检查。

将进行4次简单检查。

  1. 左墙碰撞 - 检查精灵的左侧是否<= 0
  2. 右墙碰撞 - 检查x坐标+精灵宽度是否>>右墙指数。
  3. &安培; 4.类似于左右墙壁逻辑,只需将它用于顶部和底部。
  4. 这些将是4个独立的if语句。没有必要嵌套if我的方式。

    即使其中一个返回正数,您也会发生碰撞,该函数应返回true。

答案 1 :(得分:0)

这应该解决你的问题,碰撞检查是分离的,即它们是独立的。所以本质上这会检查左碰撞或右,如果两者都为真,则返回true,对于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;
}