我目前正在制作一个非常简单的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;
}
答案 0 :(得分:0)
您只需检查左侧,顶部,右侧和底部墙壁的碰撞情况。没有左上角,右下角组合可供检查。
将进行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;
}