当角色有15个防守,并且他穿着银色躯干时,他的防守现在是25.无论如何,为了穿戴装备,需要制作它。目前我用抽象工厂模式设计了它(见图)。
这个设计有很多类,其中大部分都是无用的,比如 Bronze Helmet , Silver Torso 等等,因为它们只有一个实例。 class Stats。
答案 0 :(得分:1)
在商业视频游戏中,许多具有不同属性和可能特殊效果的项目通常通过脚本系统实现。很难使它更具体,因为脚本绑定和基于组件的体系结构之类的东西没有严格定义,并且因游戏而异。
通过了解RPG的(项目更改)mod如何工作,您可以很好地了解这些系统的内部工作原理。例如,看看" Papyrus" Skyrim 的绑定,或者更简单的例子来看看 Isaac的绑定:重生的lua绑定。
答案 1 :(得分:1)
我会这样接近:
有一个抽象类Armor,所有的头盔,躯干等都继承自。然后你可以拥有一个Silver和Bronze类,也可能在ArmorType类下统一。我会根据它的设备有一些修饰符,即Bronze :: modifier = 1.25;,Silver :: modifier = 1.5;等等。这样,对于你拥有的每个新的ArmorType或Armor,你都不要&# 39;必须添加大量新课程。随着游戏的扩大,这种情况只会越来越严重。
当在Armor子类中进行实际的统计计算时,它将如下:
//这是你的盔甲课。
class Torso extends Armor {
public Torso(ArmorType armorType) {
this.armorType = armorType;
this.baseStat = 10;
}
public double calculateStats() {
return this.getBaseStat() * armorType.getModifier();
}
}
现在举个例子。如果躯干的基础属性为10护甲,则银的修正值为1.5,那么这件护甲的防御力就是15.当然你可以根据自己的喜好调整这些数字,或者为计算添加更多方面。这只是你可以做的事情的一个简单例子。
如果您想将Stats保留为原始设计的一部分,我会将Stats对象放入Armor类中。所以你有效地使用Decorator模式用ArmorTypes来装饰你的Armor类。你也只是在你的Stats类和你的Armor子类之间插入一层。
让我知道你的想法。
答案 2 :(得分:1)
这个设计有很多类,其中大部分都是无用的,比如Bronze Helmet,Silver Torso等,因为它们只有一个Stats类的实例。
你似乎没有充分理由爆炸你的设计。整个层次结构只能用一个名为Equipment
的类替换。
public class Equipment {
private Stats stats;
private String equiptmentName;
//constructors and getters and setters follow..
}
您的Player
课程可以Set
Equipment
,如下所示。每当安装或卸载设备时,您都会使用Player
从stats
更新Equipment
统计信息。
public class Player {
private Set<Equipment> mountedEquipment;
private Stats baseStats;
public Player(Stats baseStats) {
this.baseStats = baseStats;//set base stats for player
mountedEquipment = new HashSet<Equipment>();
}
public void mountEquipment(Equipment equipment) {
baseStats.setMagic(baseStats.getMagic()+equipment.getStats().getMagic());
//update base stats similarly for strength, hitpoints, etc
mountedEquipment.add(equipment);
}
public void unmountEquipment(Equipment equipment) {
baseStats.setMagic(baseStats.getMagic()-equipment.getStats().getMagic());
//update base stats in a similar fashion for strength, hitpoints, etc
mountedEquipment.remove(equipment);
}
public Set<Equipment> getMountedEquiptment() {
return Collections.unmodifiableSet(mountedEquiptment);
}
}
您不需要在问题中显示任何 Factory 类,因为您可以将所有可能的stats
添加到Equipment
和{{每当您引入新的Player
类型时,都会出现类。