2013-07-09 95 views
0

我目前正在做一個非常簡單的雪碧到牆碰撞檢測程序,我的火柴人將停在牆壁,如果它是觸摸它。我的代碼運行良好,但問題是我的火柴人精靈不會停在左側和牆的頂部(在這種情況下,屏幕高度和屏幕寬度僅適用於左側和頂部)。這裏是我的代碼,你能找出問題出在哪裏,我該如何解決它。SDL碰撞檢測

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個簡單的檢查。

  1. 左壁碰撞 - 檢查是否子畫面的左側< = 0
  2. 右壁碰撞 - 檢查是否X座標+子畫面的寬度是> =右壁索引。
  3. & 4.與左右壁邏輯類似,只是將它用於頂部和底部。

這些將是4個獨立的if語句。我沒有必要嵌套如果我看到它。

即使其中一個返回正值,您也會遇到碰撞,並且該函數應該返回true。

0

這應該解決您的問題,碰撞檢查是不連貫的,即它們是獨立的。所以本質上這將檢查左碰撞或右碰撞,並且如果其中任何一個爲真,則返回真,對於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; 
}