2013-01-03 88 views
0

因此,我使用C#在XNA中創建了一個遊戲,並且我有隨機位置創建的牆,並且我試圖阻止穿過它們的東西/被傳送到屏幕上的點時他們擊中了他們。 (注意,左,右,現在的作品,它只是在頂部和底部)在XNA中創建牆壁

if (collision(wallRect[k], wallColours, pacmanRect, pacmanColor, 0)) 
//Collision works, not an issue here 
{ 
    if (pacmanRect.Bottom > wallRect[k].Top && pacmanRect.Top < wallRect[k].Bottom) 
    { 
     if (pacmanRect.Right >= wallRect[k].Left 
      && pacmanRect.Right < wallRect[k].Right) 
     { 
      pacmanPos.X = wallRect[k].X - frameSize.X; 
      //frameSize is the size of the pacman sprite 
     }         
     else if (pacmanRect.Left <= wallRect[k].Right 
        && pacmanRect.Left > wallRect[k].Left) 
     { 
      pacmanPos.X = wallRect[k].X + frameSize.X/8; 
     } 
    } 
    else if (pacmanRect.Right > wallRect[k].Left && pacmanRect.Left < wallRect[k].Right) 
    { 
     if (pacmanRect.Bottom >= wallRect[k].Top) 
     { 
      pacmanPos.Y = wallRect[k].Y - frameSize.Y/8; 
     }     
     else if (pacmanRect.Top <= wallRect[k].Bottom) 
     { 
      pacmanPos.Y = wallRect[k].Y + frameSize.Y/8; 
     } 
    } 
    playSound(collisionSoundInstance); 
} 

也就是說在遊戲中的環中pacmanPos被更新的最後一個點。那麼,我該如何做到這一點,以便牆壁是實際的牆壁,你不能穿過它們?

+0

我不明白是什麼問題。你有問題嗎?代碼不工作?如果它不工作,你期望它做什麼,它不是在做什麼?你可以使用調試器來遍歷代碼嗎? –

+0

希望能幫助清除它。這只是沒有做我期望的事,或我想要的。 – Yann

+0

如果你想保持自己的代碼,你應該解釋它是如何工作的,什麼是frameSize?碰撞方法是什麼? –

回答

2
if (pacmanRect.Bottom > wallRect[k].Top && pacmanRect.Top < wallRect[k].Bottom) 

這是否有道理?我認爲Pacman不可能超出牆的頂部,但同時低於它的底部(除非你的y座標系在向下方向上是正向的,即使如此,邏輯仍然看起來很腥)

我會推薦在紙上繪製其中一個狀態,然後根據您在紙上看到的內容逐行閱讀您的代碼。例如,繪製Pacman的最底部邊緣與牆的最頂部邊緣重疊的狀態。然後瀏覽你的代碼,看看會發生什麼。

+0

標準XNA座標系爲Y增加,X增加。 這是對的,因爲它說pacman的底部需要低於牆的頂部,而pacman的頂部需要高於牆的底部。 它基本上提供信息,如果pacman精靈位於牆精靈的左側或右側。 但是,它在OR方面效果更好,因爲「滑動」似乎更少,所以如果你靠近角落的一個角落,pacman不會跳得太多。 – Yann

0

如果你有一個限制在兩個維度的遊戲,你應該使用Box2D這會讓你的生活變得更容易。

見註釋如果你想保持自己的代碼

+0

評論:我知道答案沒有回答這個問題,但我認爲他可以用這種方式解決這個問題。 –

+0

我個人不會推薦/使用Box2D,除非我有一些好的物理要求,我不想自己寫。使用類似Box2D的東西將會提供一些應用程序和學習開銷,這可能比自己編寫基本的碰撞檢測更爲重要,當然這取決於您的遊戲需求。 – SpartanDonut

+1

那麼這是一個大學任務,我不允許使用外部引擎,所以這對我沒有幫助,但其他人可能會覺得它很有用。 – Yann