游戏定位OO设计

时间:2009-07-26 15:51:47

标签: oop

我正在开始一个游戏项目,我的第一个,它将像一个文明克隆,重点关注战争。我一直使用C#但是对于商业应用程序(主要是Web应用程序),所以我对构建地图定位系统的好设计有疑问。

我希望每个单位都知道它所处的位置,并希望每个单位知道每个单位的所有单位,双向关系,但我看不出最好的方法来模拟这个!如果可以的话,我想要一些想法和伪代码!

Thankz。

6 个答案:

答案 0 :(得分:2)

使地图成为二维数组。在每个位置,将所有对象的数组放在该位置。此外,为每个对象添加位置属性。

是的,这将复制信息!因此,在每次移动时,您都必须更改对象更新地图。

但是,快速阅读和快速查找对象对于这种游戏非常重要。此外,此解决方案避免了任何搜索例程(例如,浏览地图并查找特定对象),这通常是一个好主意:用索引替换大型数据集上的所有搜索例程。地图应被视为对象位置属性的某种索引。

答案 1 :(得分:2)

地图应该掌握所有对象的所有知识。此外,只有地图上的每个对象都应该知道它的位置。这样,地图可以询问所有对象,并将它们放置在正确的位置。您永远不必存储两次定位信息。

答案 2 :(得分:1)

这是一种应该避免重复的方法

有一个类,它包含地图上的所有对象,以及不同类型对象的集合

public class MapObjects
{
   private Collection<GamePiece> gamePieces;
}

集合中的每个项目都将保持其(当前)地图坐标

public class GamePiece
{
   private MapCoordinate mapCoordinate;
   // Other items relevant to a GamePiece.. Health, ItemType, etc
}

要查找特定选定项目在地图上的位置应该很容易,您可以参考保存其坐标的GamePiece。要查找特定坐标中的项目,您需要一个辅助方法,可能在MapObjects类中:

public class MapObjects
{
   public Collection<GamePiece> GamePiecesAtLocation(MapCoordinate mapCoordinate)
   {
      // Iterate through gamePieces collection and build a result 
      // collection of items at specified coordinates.
   }
}
祝你好运,听起来像一个充满挑战的有趣项目。

答案 3 :(得分:0)

我会将地图设为六边形而不是网格,因此您没有奇怪的文明现象,您可以在对角线上覆盖更多的地面。除此之外,我会让每个单元存储它自己的位置,当你需要知道哪个单元在特定的十六进制中时,只需遍历整个集合。很难想象有这么多单位参与这种方法会是一个性能问题。

答案 4 :(得分:0)

当涉及到这样的事情时,NSPoint非常有用。每个游戏对象都应该拥有自己的位置。您可以将这些游戏对象存储在数组中,每个玩家一个,整个游戏一个,这取决于您。

我会警告你,这是一个巨大的项目,不仅是代码方面的,而且是内容明智的,并且在平衡游戏时需要大量的来回工作。在你追求这个游戏之前,你应该尝试一些小游戏。没有什么可以阻止你潜入水中,但如果你的第一场比赛很大,那么你会打很多墙并写下一些严肃的spaghetticode。我会建议从像跳棋这样的东西开始,以获得基于回合的一面。

这一切都来自于目前正在编写roguelike作为他的第一个游戏项目的人。在我的辩护中它是相对简单的,但有很多我没想到的事情,并且计算考虑到障碍物的战争的视线/雾的简单使用复杂的算法。我并不后悔选择roguelike作为我的第一款游戏,但在看到即使是最基本的概念可以实现的复杂程度之后,像回合制战略游戏这样的东西也只是我现在留给专业人士的东西。

如果您现在无法想办法创建单位,而是代表地图并存储位置,那么在研究编码时您打算做什么?城市?生产?资源收集? 随机地图生成器?轨迹计算?命中概率?盔甲?流动性?视线?随机事件? AI

我不是试图以任何方式粉碎你的梦想,只是你选择的类型比它看起来更复杂。你的大脑会在接缝处过载并爆裂。 (我可以继续押韵主题,但我不会提醒你,你应该先尝试像跳棋这样的东西。)

答案 5 :(得分:0)

好的设计=简单的设计。

使地图成为对象列表。

Object
    int X { get; set; }
    int Y { get; set; }

Map
    List<Object> objects
    Add(Object)
    Remove(Object)
    GetAt(X, Y)
    GetInBox(X,Y,Width,Height)
    GetInRadius(X,Y,Radius)

这应该就是你所需要的。如果Get(..)查询变得太慢,则添加缓存或将地图划分为扇区并保留每个扇区的对象列表,并在移动时更新它。如果您有许多静态对象或对象在不同扇区之间移动太快,这会有很大帮助。我的猜测是,在回合制游戏中,你根本不需要进行优化。