3

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

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

继续前进,如果没有对我所有对象的全局引用,我将很难做事。例如: - 从我的 Pacman Update()..

  • 我需要知道我是否会撞墙。我需要参考我的地图/瓷砖。

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

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

所以本质上,感觉就像我将把这么多对象引用传递给我所有的对象一样搞得一团糟,感觉做一个“全局”顶级对象要干净得多。

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

谢谢!

4

1 回答 1

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 管理器来保持对 Ghost 的引用。玩家只需要调用该管理器中的一个方法,该方法将遍历所有幽灵以查看他是否发生碰撞。更好的是,该方法可以采取立场而不是参考。这样,它可以被重复使用,以查看幽灵是否相互碰撞。(随机想法)

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

于 2012-10-20T18:23:36.247 回答