Java游戏设计类加载

时间:2016-09-24 19:30:09

标签: java javafx javafx-2 javafx-8

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

加载某些资源的正确方法是什么?我不是在谈论图像和声音,这部分很容易。我在谈论课程。例如;我喜欢你可以激活的400多种奇怪的技能。每个技能我都有一个单独的课程(或者我称之为arte)。要访问此功能,我希望能够调用

Data.getArte(idOfArte);

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

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

编辑:我也很关心表现。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您正在寻找工厂模式。我在这里找到了一篇很好的文章:http://alvinalexander.com/java/java-factory-pattern-example

我假设您不必在运行时侧载类文件?如果是这种情况,我建议您在这里查看:Method to dynamically load java class files