Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 面向对象的游戏定位设计_Oop - Fatal编程技术网

Oop 面向对象的游戏定位设计

Oop 面向对象的游戏定位设计,oop,Oop,我要开始一个游戏项目,我的第一个,它将像一个文明的克隆人,主要关注战争。我一直使用C#但用于商业应用程序(主要是web应用程序),因此我怀疑什么是构建地图定位系统的好设计 我想让每个单位知道它的位置,让地图知道每个点的所有单位,一个双向关系,但我看不出什么是建模的最佳方式!如果可以的话,我想要一些想法和伪代码 谢谢。将地图制作成二维阵列。在每个位置,将所有对象的数组放置在该位置。此外,向每个对象添加位置属性 是的,这将复制信息!因此,每次移动时,您都必须更改对象并更新地图 然而,对于这种游戏来说

我要开始一个游戏项目,我的第一个,它将像一个文明的克隆人,主要关注战争。我一直使用C#但用于商业应用程序(主要是web应用程序),因此我怀疑什么是构建地图定位系统的好设计

我想让每个单位知道它的位置,让地图知道每个点的所有单位,一个双向关系,但我看不出什么是建模的最佳方式!如果可以的话,我想要一些想法和伪代码


谢谢。

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

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


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

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

这里有一种方法可以避免重复

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

public class MapObjects
{
   private Collection<GamePiece> gamePieces;
}
要想找到一个特定的选定项目在地图上的位置应该很容易,你有一个保存其坐标的游戏的参考。要查找特定坐标中的项目,您需要一个助手方法,可能在MapObjects类中:

public class MapObjects
{
   public Collection<GamePiece> GamePiecesAtLocation(MapCoordinate mapCoordinate)
   {
      // Iterate through gamePieces collection and build a result 
      // collection of items at specified coordinates.
   }
}
公共类映射对象
{
公共收藏游戏片段位置(地图坐标地图坐标)
{
//迭代游戏片段集合并生成结果
//在指定坐标处的项目集合。
}
}

祝你好运,听起来这是一个充满挑战的有趣项目。

我会把地图做成六边形而不是网格,这样你就不会有奇怪的文明现象,你可以对角覆盖更多的土地。除此之外,我只需要让每个单元存储它自己的位置,当您需要知道哪些单元在特定的十六进制中时,只需迭代整个集合。很难想象有这么多的单元参与其中,这种方法会造成性能问题。

NSPoint在处理此类问题时非常有用。每个游戏对象都应该有自己的位置。您可以将这些游戏对象存储在阵列中,每个玩家一个,整个游戏一个,这取决于您

我要警告你,这是一个巨大的项目,不仅在代码方面,而且在内容方面,在平衡游戏的同时需要大量的来回工作。你真的应该尝试一些小游戏,然后再去追求这一个。没有什么能阻止你潜入,但是如果你的第一场比赛是这么大的话,你会撞上很多墙,写下一些严重的垃圾代码。我会建议从跳棋开始,让事情以回合为基础

这一切都来自一个家伙,他目前正在写一个类似流氓的游戏作为他的第一个游戏项目。在我的辩护中,这是相对简单的,但有很多事情我没有预料到,而一些简单的事情,比如在考虑障碍物的情况下计算战争视野/雾,使用复杂的算法。我并不后悔选择流氓游戏作为我的第一个游戏,但是在看到即使是最基本的概念也可以实现的多么复杂之后,像回合策略游戏这样的东西我现在就留给专业人士了

如果你目前在想一种不仅创建单位,而且表示地图和存储位置的方法时遇到困难,那么在研究中编写代码时,你会怎么做?城市?生产?资源收集?随机地图生成器?弹道计算?命中概率?盔甲?流动性视线?随机事件?哎?


我不是想用任何方式粉碎你的梦想,只是你选择的类型比看起来更复杂。你的大脑会超负荷工作,并在接缝处爆裂。(我可以继续在这个主题上押韵,但我不会提醒你们,你们应该先尝试跳棋之类的东西。)

好的设计=简单的设计

使地图成为对象列表

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)
对象
int X{get;set;}
int Y{get;set;}
地图
列出对象
添加(对象)
移除(对象)
GetAt(X,Y)
GetInBox(X、Y、宽度、高度)
GetInRadius(X,Y,半径)

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

“您不必存储两次定位信息”。。。这是一个极端的观点,我不推荐。我既不简化代码,也不使其更快。它高度简化了代码。必须两次跟踪某个东西简直是荒谬可笑,特别是如果你忘记在两个地方更新它。这里的观察者类型模式,即地图观察其对象的模式,远远优于数据变量的复制。我认为,要绘制场景,地图必须知道哪些单位在某个区域,这将便于绘制屏幕,移动这些单位,他们必须知道它们在哪里,从哪里来,所以我想我需要存储它两次,我知道它很容易出错,但这会使开发变得更容易,我需要一个
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)