2013-11-25 59 views
1

我有一個2d平臺遊戲,從xml文件中繪製房間。 xml文件包含常見的東西,例如敵人和瓦片的位置,以及它們的紋理映射。移動級別/房間之間的角色

在典型的「Metroidvania」遊戲中,玩家將移動到一個房間的邊緣,該房間將加載相鄰的房間。我的問題是一般的:

我該如何溝通我的角色從當前加載的房間走進哪個房間?

現在每個房間都在一個單獨的xml文件中,並且每個房間可能有多個出口(具有大型周邊的房間可能有多個出入口,每個方向向下/向上/向左/向右)。我在想某種圖形理論是合適的,但我無法找到如何在C++或SFML 2.1中實現它的例子。

+0

最簡單的事情就是給每個房間一個標識符(一個數字,名字,不管),並讓每個門存儲它所通向的房間的標識符。你有沒有考慮這個解決方案 –

回答

3

考慮觸發器的想法,這些觸發器在很多遊戲中都被大量使用。它們通常是沒有圖形表示的可碰撞對象。所以在2D平臺遊戲中,當一個特定的物體與它碰撞時,它會成爲一個不可見的盒子。

設置您的觸發器就像設置其他對象一樣,但沒有繪製它。確保它檢查玩家是否與它發生了碰撞,如果它確實會執行其操作。你可以有一個觸發器去一個房間,另一個觸發不同的房間,等

class TriggerBase 
{ 
    Rectangle _bounds; 

    void CheckAgainst(IObjectWithPosition* object) const 
    { 
     if(object->X >= _bounds.Left && 
      object->X <= _bounds.Right && 
      object->Y >= _bounds.Top && 
      object->Y <= _bounds.Bottom) 
     { 
      ExecuteTrigger(object); 
     } 
    } 

    virtual void ExecuteTrigger(IObject* object) const = 0; 
}; 

的想法是要通過他們這些觸發器的列表和循環,覈對實際需要的對象被檢查。這是一個粗略的基礎,但它提供了基本的想法。

+0

這是非常好的。我正在考慮在我的Tile類中添加一個「觸發器」成員,這樣我就可以給某些圖塊一個非空的觸發器屬性,它將包含要加載的下一個房間的文件名。然後這可以是碰撞檢測週期的一部分,並且在碰撞時當前房間被卸載並且新房間被加載。 – JGrieco

+0

這會起作用,但您可能想要將觸發系統從佈局系統中抽離出來。它會更具可擴展性和組織性。那麼你不必將觸發邏輯與平臺邏輯聯繫起來。 –

+0

這是有道理的,將一個不可見物體與放置瓷磚分開放置會更好。我可能會添加一個新的xml節點,其中包含這些不可見的觸發器對象的位置和空間鏈接 - 感謝您的幫助。 – JGrieco