Pacman游戏组织(XNA) - 我应该在哪里/如何检查与鬼/食物的碰撞?

时间:2012-10-20 18:09:17

标签: c# xna game-engine pacman

我的Pacman游戏正在运行,我正在尝试回过头来更好地“整理”我的代码。之前,我有这个“TopObject”引用了game1.cs中的对象,它基本上引用了我游戏中的每个对象(pacman,ghosts,map等)。我从ANYWHERE全局提供它,以便我可以从我的幽灵对象访问我的Pacman对象,或者从我的幽灵对象访问我的地图/平铺对象,甚至可以从任何地方访问我的ContentMananger来加载内容。

我知道这是不好的做法,所以我试图消除它。例如,我在所有采用“ContentManager”类型的对象上创建了LoadContent()方法,这样就无需使用我的TopObject调用ContentManager。

进一步说,如果没有对我所有对象的全局引用,我真的很难做。例如: - 从我的吃豆子更新()..

  • 我需要知道我是否会碰到一堵墙。我需要参考我的地图/瓷砖。

  • 我需要知道我是否与幽灵相撞,所以我需要引用我的幽灵物品。

  • 我需要知道我是否与某些食物相撞然后更新记分牌,所以我需要参考我的记分牌对象。

从本质上讲,感觉就像我将要制作一个巨大的混乱,将大量的对象引用传递给我的所有对象,感觉就像做一个“全局”的顶级对象更加清晰。

有谁知道如何更好地组织这个,以便我干净利落地做到这一点?我是否应该检查Pacman Update()中的冲突,还是应该创建单独的“PacmanObject.CheckCollisionWith()”并从我的Game1 Update()调用它?碰撞逻辑是否也应该分成一个新类?

谢谢!

1 个答案:

答案 0 :(得分:1)

拥有一个包含对象引用的中心点本身并不是一件坏事。但是,一个好的设计会将与每个对象最相关的动作放在正确的类中。例如,您的播放器不需要参考瓷砖和墙壁。在执行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管理器,可以引用鬼魂。玩家只需要在该管理器中调用一个方法,该方法将遍历所有鬼魂以查看他是否发生碰撞。更好的是,该方法可以采取立场而不是参考。这样,可以重复使用它来查看鬼魂是否在彼此之间相互碰撞。 (随机的想法)

有很多办法可以做点什么。任何代码设计中最难的是将内容放在更有意义的地方,并使其最容易在以后更新和修改。