我正在使用JavaFX构建RPG,需要从专家那里获得一些建议。

加载某些资源的正确方法是什么?我不是在谈论图像和声音,那部分很简单。我在说课。例如;我喜欢一些可以激活的400+奇特能力。对于每种能力,我都有一个单独的班级(或我所说的技巧)。要使用此功能,我希望能够致电

Data.getArte(idOfArte);


这应该返回Arte类型的对象。所有的技巧都有一个separte类文件。

还有其他资源,例如英雄,敌人等等。加载和调用这些资源以供使用的最佳方法是什么?有更好的方法吗?

编辑:我也非常关注性能。

最佳答案

一种更有效的方法可能是使用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函数。

09-11 02:16
查看更多