gpt4 book ai didi

c# - Pacman Game Organization (XNA) - 我应该在哪里/如何检查与幽灵/食物的碰撞?

转载 作者:行者123 更新时间:2023-11-30 17:57:43 26 4
gpt4 key购买 nike

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

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

更进一步,如果没有对我所有对象的全局引用,我真的很难做事。例如:- 从我的 Pacman Update()..

  • 我需要知道我是否会撞到墙上。我需要引用我的 map /图 block 。

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

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

所以从本质上讲,感觉就像我要将如此多的对象引用传递到我所有的对象一样弄得一团糟,感觉就像做一个“全局”topobject 更干净。

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

谢谢!

最佳答案

拥有一个包含对您的对象的引用的中心点本身并不是一件坏事。然而,一个好的设计会将与每个对象最相关的 Action 放在正确的类中。例如,您的播放器不需要引用瓷砖和墙壁。在执行 Move 方法时,玩家可以调用 Map 类中的静态方法,如果下一步移动有效,该方法返回 true/false。这样,玩家对 map 本身没有任何引用。

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

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

关于c# - Pacman Game Organization (XNA) - 我应该在哪里/如何检查与幽灵/食物的碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12991265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com