更有效的方法可能是使用Entity Component System或至少借用构图设计。这允许你有一个具体的类,比如Ability
,它将包含所有能力通用的通用字段,例如。技能点成本,技能持续时间,目标类型,激活类型等。然后,您需要为每个需要添加的特殊值添加一个组件,并为每种需要添加到该通用功能的特殊行为添加一个控件。例如:
Ability ability = new Ability();
ability.addComponent(new DurationComponent(double seconds)); // specify how long effect lasts
ability.addControl(new DamagingControl(int damage, Object targetType, etc.)); // so ability can damage
ability.addControl(new ElementAugmentingControl(Element element, Object weapon/armor, etc.)); // so ability can change status effects/elements
这应该给你构图的想法。基于你的能力的普遍行为,你最终应该得到10-30个职业,而你的400个技能只是成为基础通用能力的配置。举一个例子,这里有一个RPG,其中大约有100个能力(技能),它们被实现为6个类。同样的设计也可以用于任何游戏项目/角色。
至于对象的创作,你可以这样做:
public static final int ABILITY_ID_SOME_NAME = 1000;
ability.addComponent(new IDComponent(ABILITY_ID_SOME_NAME));
然后每个自己的能力可能是一个全球性的数据存储,只有能力原型存储的一部分:
Ability ability = DataStore.getByID(ABILITY_ID_SOME_NAME).clone();
另外,使数据存储返回一个已经克隆的能力,这样你就不会暴露原型。
最后,您可以考虑使用脚本语言,例如javascript,改变泛型能力的行为。在这种情况下,所有能力都将存储在您在运行时加载的文件夹scripts/abilities/
中,并仅存储在您需要的文件夹中。有些武断例如:(heal.js文件)
function onUse(object, healValue) {
if (object.hasComponent(HP_COMPONENT)) {
val hp = object.getComponent(HP_COMPONENT);
hp.value += healValue;
}
}
这里是一个article,显示了如何调用Java里面的JavaScript功能。
@PhilipVaughn你能澄清一下你的意思吗?你实际上只是在询问创建对象,而不是加载类,对吗?通过“通过获取文件夹中的所有文件然后将它们转换为新类”动态加载*文件*,在当前答案下面的评论中,你是什么意思?您不能将文件转换为类(您可以将对象引用转换为类)。你如何将“文件”加载到缓存中? –