簡體   English   中英

Pacman游戲組織(XNA) - 我應該在哪里/如何檢查與鬼/食物的碰撞?

[英]Pacman Game Organization (XNA) - Where/how should I check for collisions with ghosts/food?

我的Pacman游戲正在運行,我正在嘗試回過頭來更好地“整理”我的代碼。 之前,我有這個“TopObject”引用了game1.cs中的對象,它基本上引用了我游戲中的每個對象(pacman,ghosts,map等)。 我從ANYWHERE全局提供它,以便我可以從我的幽靈對象訪問我的Pacman對象,或者從我的幽靈對象訪問我的地圖/平鋪對象,甚至可以從任何地方訪問我的ContentMananger來加載內容。

我知道這是不好的做法,所以我試圖消除它。 例如,我在所有采用“ContentManager”類型的對象上創建了LoadContent()方法,這使我無需使用TopObject調用ContentManager。

繼續前進,我很難做到沒有全局引用所有對象的東西。 例如: - 從我的吃豆子更新()中...

  • 我需要知道我是否會碰到一堵牆。 我需要參考我的地圖/瓷磚。

  • 我需要知道我是否與鬼相撞,所以我需要引用我的幽靈物體。

  • 我需要知道我是否與某些食物相撞然后更新記分牌,所以我需要參考我的記分牌對象。

從本質上講,感覺就像我將要在我的所有對象周圍傳遞如此多的對象引用之類的巨大混亂,感覺就像做一個“全局”頂級對象更加清晰。

有誰知道如何更好地組織這個,以便我干凈利落地做到這一點? 我是否應該檢查Pacman Update()中的沖突,還是應該創建單獨的“PacmanObject.CheckCollisionWith()”並從我的Game1 Update()調用它? 碰撞邏輯是否也應該分成新的類?

謝謝!

擁有一個包含對象參考的中心點本身並不是一件壞事。 但是,一個好的設計會將與每個對象最相關的動作放在正確的類中。 例如,您的播放器不需要參考瓷磚和牆壁。 在執行Move方法時,如果下一步移動有效,則播放器可以在Map類中調用返回true / false的靜態方法。 這樣,玩家就沒有對地圖本身的任何引用。

public class Player
{
    public void Update()
    {
        //stuff to find nextTile position

        //Call static function toward a class that contains the map data.
        if (Map.TileIsWalkable(nextTile))
            Move();
    }
}

public class Map
{
    public static Map loadedMap; // Handling it as singleton, normally you only load one map at a time.

    public static bool TileIsWalkable(Vector2 position)
    {
        if (loadedMap == null) // Throw assert, shouldn't happen.

        return //whatever test needed in loadedMap structure
    }
}

您還可以擁有一個Ghost管理器,可以引用鬼魂。 玩家只需要在該管理器中調用一個方法,該方法將遍歷所有鬼魂以查看他是否發生碰撞。 更好的是,該方法可以采取立場而不是參考。 這樣,可以重復使用它來查看鬼魂是否在彼此之間相互碰撞。 (隨機的想法)

有很多辦法可以做點什么。 任何代碼設計中最難的是將內容放在更有意義的地方,並使其最易於更新和修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM