2014-02-15 150 views
1

我正在開發一款XNA平臺遊戲,並且需要一些與碰撞相關的幫助。遊戲發生在一個洞穴中,問題在於藝術風格會粗略,因此地形(洞穴)會有所不同,所以我不能使用瓷磚。但我需要檢查角色和洞穴上像素完美的碰撞,但是我無法弄清楚如何在無法在每個貼磚周圍放置矩形的情況下如何操作,因爲沒有。沒有瓷磚的2D遊戲中的碰撞檢測XNA

我曾經想過很多想出了一些想法:圍繞整體水平

-One大的矩形和一個字符周圍的和使用像素的完美碰撞。但是我不認爲這會起作用,因爲矩形也會包含背景。

- 手動展開矩形。非常醜陋的代碼,可能會導致大量的錯誤和錯誤。

- 無論如何使用拼貼,並有數百種拼貼類型。再次,非常醜陋的代碼,它只是看起來不對。

- 使用碰撞引擎。我最好從頭開始製作遊戲。

對不起,如果我解釋不好,但這是一個相當複雜的問題(至少對我來說),我找不到任何解決方案。對於任何想法都會很高興,謝謝。

回答

5

我認爲你應該使用每像素碰撞檢測來做你想做的事情。你可以有你的角色,並使他的紋理透明(使用圖像的alpha)除了實際的角色。那麼你可以擁有那個將成爲你的洞穴的紋理。使洞穴的角色應該能夠移動透明,這樣你就可以擁有另一個紋理,它將成爲整個關卡的背景。這裏有一個粗略的例子:

字符(粉紅色BG是透明的:)

enter image description here

洞(白色透明)

enter image description here

背景:

enter image description here

所有這三個加在一起:

enter image description here

這只是給你一個非常粗略的想法(因爲我只是用Google搜索的背景和油漆畫的洞穴)。然後,您可以使用洞穴紋理(不是洞穴背景)和角色紋理之間的alpha像素碰撞檢測。有關如何輕鬆使用每像素衝突的教程,請參閱this。 HTH。這裏有一些你可以使用的碰撞碼(rectangleA應該是人物的矩形,dataA人物的像素數據,rectangleB洞穴的矩形(它可能是整個屏幕)和洞穴的像素數據(不是背景))由於您沒有使用背景圖像的像素數據,碰撞將不會與此數據檢查:

/// <param name="rectangleA">Bounding rectangle of the first sprite</param> 
    /// <param name="dataA">Pixel data of the first sprite</param> 
    /// <param name="rectangleB">Bouding rectangle of the second sprite</param> 
    /// <param name="dataB">Pixel data of the second sprite</param> 
    /// <returns>True if non-transparent pixels overlap; false otherwise</returns> 
    static bool IntersectPixels(Rectangle rectangleA, Color[] dataA, 
           Rectangle rectangleB, Color[] dataB) 
    { 
     // Find the bounds of the rectangle intersection 
     int top = Math.Max(rectangleA.Top, rectangleB.Top); 
     int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom); 
     int left = Math.Max(rectangleA.Left, rectangleB.Left); 
     int right = Math.Min(rectangleA.Right, rectangleB.Right); 

     // Check every point within the intersection bounds 
     for (int y = top; y < bottom; y++) 
     { 
      for (int x = left; x < right; x++) 
      { 
       // Get the color of both pixels at this point 
       Color colorA = dataA[(x - rectangleA.Left) + 
            (y - rectangleA.Top) * rectangleA.Width]; 
       Color colorB = dataB[(x - rectangleB.Left) + 
            (y - rectangleB.Top) * rectangleB.Width]; 

       // If both pixels are not completely transparent, 
       if (colorA.A != 0 && colorB.A != 0) 
       { 
        // then an intersection has been found 
        return true; 
       } 
      } 
     } 

     // No intersection found 
     return false; 
    } 
+0

@ user3313308,這有幫助嗎? – davidsbro

+0

感謝您的回覆@davidsbro!我仍然需要放置矩形,以便每個像素髮生像素碰撞,對吧?還是我誤解了每像素碰撞的概念? 如果我已經理解了它,它會檢查兩個矩形是否發生碰撞,然後檢查矩形內的顏色以查看它是否發生碰撞。是對的嗎?如果是這種情況,我是否仍然需要在洞穴周圍放置長方形? – user3313308

+0

是的,你是對的@ user3313308。但你只需要有兩個矩形;一個圍繞整個洞穴紋理(可能是整個屏幕)和一個圍繞着球員;你不應該需要兩個以上。我提供的鏈接是一個非常簡單的每像素碰撞項目,因此您可以瞭解它會是什麼樣子。 LMK如果有什麼不清楚的話。 – davidsbro