塔防devise和数据结构

我试图想出一个简单的TD游戏的结构,它具有以下元素

  1. 塔每个塔有一系列的属性,如范围,伤害,健康等。可能有不同types的塔具有不同的攻击types。 例如,塔A可以执行攻击types1和2,塔B可以执行攻击types3和4

  2. 蠕变每个蠕变具有一系列属性,如伤害,健康,赏金点数等。可能有不同types的具有不同能力的蠕变,就像塔楼

现在我正在尝试为上述两个游戏元素提供一个可扩展性和良好结构的好devise

这是迄今为止我所提出的Tower类的骨架。 请评论并建议更改。 任何devise模式,可以使生活更轻松

using System.Collections; using System; public enum TowerType { tA, tB, tC }; public class Tower { private TowerType type; private int damage; private int range; private int health; public Tower(TowerType type) { this.type = type; initializeVariables(); } private void initializeVariables() { if (this.type != null) { if (this.type == TowerType.tA) { this.damage = 20; this.range = 40; this.health = 50; } else if (this.type == TowerType.tB) { this.damage = 30; this.range = 50; this.health = 60; } else if (this.type == TowerType.tC) { this.damage = 60; this.range = 60; this.health = 80; } } } public int getDamage() { return this.damage; } public int getRange() { return this.range; } public int getHealth() { return this.health; } public TowerType getTowerType() { return this.type; } public string getType(int value) { return Enum.GetName(typeof(TowerType), value); } } 

所以使用枚举来定义各种types的塔。 但这是一个很好的devise吗? 每个塔会有不同的伤害,范围和健康。

如果有100个不同的塔怎么办? 所以在我的InitializeVariables()将有一个如果else语句的集群。 我怎么能改进呢,还是有更好的方法来实现呢?

这是我认为可以做到的

 class Class1 { public enum TowerType { A, B, C }; static private Dictionary<TowerType, Tower> towerTypesInfo; static void init() { towerTypesInfo= new Dictionary<TowerType, Tower>(100);//100 tower types towerTypesInfo.Add(TowerType.A, new Tower(20, 40, 50)); towerTypesInfo.Add(TowerType.B, new Tower(30, 50, 60)); //... fill in the rest 98 tower types with their values ... //example of making a tower named tower1 Tower tower1 = new Tower(TowerType.A); } public class Tower { public TowerType type { get; private set; } public int damage { get; private set; } public int range { get; private set; } public int health { get; private set; } public Tower(int d, int r, int h) { damage = d; range = r; health = h; } public Tower(TowerType type) { damage = towerTypesInfo[type].damage; range = towerTypesInfo[type].range; health = towerTypesInfo[type].health; } } } 

你不需要为每个variables都创建一个函数,就像在java中一样。 只要使用public int damage { get; private set; } public int damage { get; private set; } public int damage { get; private set; } ,C#有自动的方式来覆盖默认的get; 组; 属性。

另外,如果你愿意的话,你可以从.txt填充这个dictionary 。 您可以格式化.txt,使其更容易编辑

TowerTypesInfo.txt
一个20 40 50
B 30 50 60
C …

在代码中处理types之间的差异时,不要使用TowerType枚举和大量的if / else / case结构,而是使用不同types的塔来分离inheritance自抽象塔基类的类。

这些类将在其构造函数中设置它们的属性。 使用子类也可以让你对每个类的attack方法有一个不同的实现,从而允许你以一种优雅的方式实现不同的攻击方式。 相同的模式也适用于其他情况,您需要根据塔的types运行不同的代码。 就像,例如,把塔拉到屏幕上。

我会避免塔式的一般想法。

让塔包含一组重要的属性。 攻击对象(有自己的射程,RoF,伤害,声音效果,DoT的onHit()效果等),模型,健康,位置等。

然后建立工厂class级,通过计算如何初始化塔作为“加农炮”或“迫击炮”,要求建造一个“types”塔。 这样你的系统永远不需要看塔型。 graphics例如只绘制在指定位置指定的模型。 它不必为每个塔架的每个框架查找合适的模型。

是什么让这个伟大的是,如果你想要一个新的塔types,你只是建立一个新的初始化程序,建立不同的默认塔。 您的系统无需“升级”即可支持。

你可能会误解我一点点。 并非所有的对象都要使用工厂。 也许只有你的塔和敌人的对象。 也许你的攻击对象以及一个子弹。 你需要鼓捣,看看是什么模式。

有些人可能会创建一个通用的Entity / GameObject类。 你可以做一些关于实体组件系统的研究,看看它是如何工作的。

但最终,如果构建了“cannon”,则可以调用public static ITowerFactory.GetFactoryByType(TowerType type); 得到一个CannonTowerFactory 。 只要通过它TowerType.Cannon

然后用它来调用public Tower ITowerFactory.BuildTower(Vector position);

这个方法(在CannonTowerFactory实现)将会创建一个new Tower()并相应地设置一个炮塔。

你也可以做类似的事情来冲破各种“types”的敌人。