吃豆人游戏组织(XNA) - 我应该在哪里/如何检查与幽灵/食物的碰撞?

3
我已经使我的Pacman游戏可以运行并正在尝试重新“组织”我的代码。以前,我有一个“TopObject”,它引用了game1.cs中的对象,基本上引用了我的游戏中的每个对象(Pacman、ghosts、map等等)。我使其在任何地方都可以全局访问,这样我就可以从我的ghost对象中访问Pacman对象,或者从我的ghost对象中访问我的map/tile对象,甚至可以从任何地方访问ContentMananger来加载内容。
我知道这是不好的实践,所以我正在努力消除它。例如,我在所有对象上创建了LoadContent()方法,它需要一个“ContentManager”类型,这样我就不需要使用TopObject来调用ContentManager了。
进一步进行,我很难在没有对所有对象进行全局引用的情况下完成某些操作。例如: - 在我的Pacman Update()中...
  • 我需要知道是否会撞墙。我需要引用我的map/tiles。

  • 我需要知道是否与ghost碰撞,所以我需要引用我的ghost对象。

  • 我需要知道是否与食物碰撞,然后更新记分牌,所以我需要引用我的记分牌对象。

因此,它感觉像是我将在所有对象之间传递太多对象引用,并且感觉像做一个“全局”TopObject更加简洁。
有人知道如何更好地组织它,以便我可以干净地完成这个操作吗?我甚至应该在我的Pacman Update()中检查碰撞,还是应该创建单独的“PacmanObject.CheckCollisionWith()”,然后从我的Game1 Update()中调用它?碰撞逻辑是否也应该分离到一个新类中?
谢谢!

看一下这个链接吧——它是一个有趣的阅读材料,可以帮助你理解如何处理这种类型的问题,以及为什么即使一些常用方法在第一次运行时似乎有效,但实际上是错误的:http://gameprogrammingpatterns.com/singleton.html - JohnLBevan
1个回答

1

拥有一个包含对象引用的中心点本身并不是坏事。然而,良好的设计将把与每个对象最相关的操作放在正确的类中。例如,您的玩家不需要引用瓷砖和墙壁。在执行移动方法时,玩家可以调用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
    }
}

您还可以拥有一个幽灵管理器,它会保留对幽灵的引用。玩家只需要调用该管理器中的一个方法,该方法将循环遍历所有幽灵以查看是否发生碰撞。更好的是,该方法可以采用位置而不是引用。这样,它可以被重复使用以查看幽灵之间是否发生碰撞。(随机想法)

有很多方法可以做某事。在任何代码设计中最困难的是将东西放在最合适的位置,并使其最容易更新和修改。


谢谢Marc,我喜欢将Map和GhostManager设为静态的想法,这样我就不需要将它们作为引用传递了...它们只是“工作”。 - Ralph N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接