Java游戏设计类加载

Java游戏设计类加载,java,javafx,javafx-2,javafx-8,Java,Javafx,Javafx 2,Javafx 8,我正在用JavaFX构建一个RPG,需要从专家那里得到一些建议 加载某些资源的正确方式是什么?我不是说图像和声音,那部分很简单。我说的是课程。例如;我有一些奇怪的400+能力,你可以激活。我有一个单独的类为每个能力或艺术,我称之为他们。要访问此功能,我希望能够呼叫 Data.getArte(idOfArte); 这应该返回一个Arte类型的对象。所有ARTE都有一个separte类文件 还有其他这样的资源,比如英雄、敌人等等。加载和调用这些资源以供使用的最佳方式是什么?有更好的方法吗 编辑:我

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

加载某些资源的正确方式是什么?我不是说图像和声音,那部分很简单。我说的是课程。例如;我有一些奇怪的400+能力,你可以激活。我有一个单独的类为每个能力或艺术,我称之为他们。要访问此功能,我希望能够呼叫

Data.getArte(idOfArte);
这应该返回一个Arte类型的对象。所有ARTE都有一个separte类文件

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


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

您正在寻找工厂模式。我在这里找到了一篇关于它的好文章:


我假设您不必在运行时侧面加载类文件?如果是这样的话,我建议您看看这里:

您正在寻找工厂模式。我在这里找到了一篇关于它的好文章:


我假设您不必在运行时侧面加载类文件?如果是这样的话,我建议在这里看看:

一个更有效的方法可能是使用或至少借用构图设计。这允许你有一个具体的类,比如说能力,它将包含所有能力共有的通用字段,例如技能点成本,能力持续时间,目标类型,激活类型,然后,对于需要添加的每个特殊值,都有一个组件,对于需要添加到通用功能中的每个特殊行为,都有一个控件。例如:

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个能力只是简单地成为基本通用能力的配置。给你举个例子,这里有一个大约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;
    }
}

下面是一个演示如何在java内部调用javascript函数的示例。

更有效的方法可能是使用或至少借用组合设计。这允许你有一个具体的类,比如说能力,它将包含所有能力共有的通用字段,例如技能点成本,能力持续时间,目标类型,激活类型,然后,对于需要添加的每个特殊值,都有一个组件,对于需要添加到通用功能中的每个特殊行为,都有一个控件。例如:

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个能力只是简单地成为基本通用能力的配置。给你举个例子,这里有一个大约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;
    }
}

下面是一个演示如何在java内部调用javascript函数的示例。

Um。。。这实际上是一个自我打包的应用程序,一旦完成,当然这里没有基于云的东西。我看了你给出的工厂模式示例,这是我最初想到的。我可能需要实现这样的东西,因为我有大量的文件。目前,我已经通过将所有文件放入一个文件夹,然后将它们强制转换到一个新类来动态加载这些文件,但我担心长期性能,因为我正在将它们全部加载到缓存中。嗯。。。这实际上是一个自我打包的应用程序,一旦完成,当然这里没有基于云的东西。我看了你给出的工厂模式示例,这是我最初想到的。我可能不知道
因为我有这么多的文件,我不得不实现这样的东西。目前,我已经通过将所有文件放入一个文件夹中,然后将它们强制转换到一个新类来动态加载文件,但我担心长期性能,因为我正在将它们全部加载到缓存中。@PhilipVaughn您能进一步澄清一下您的意思吗?实际上,您只是询问如何创建对象,而不是加载类,对吗?在当前答案下面的注释中,通过获取文件夹中的所有文件,然后将其强制转换为新类,动态加载文件,这是什么意思?不能将文件强制转换为类。可以将对象引用强制转换为类。您是如何将文件加载到缓存中的?@PhilipVaughn您能进一步澄清一下您的意思吗?实际上,您只是询问如何创建对象,而不是加载类,对吗?在当前答案下面的注释中,通过获取文件夹中的所有文件,然后将其强制转换为新类,动态加载文件,这是什么意思?不能将文件强制转换为类。可以将对象引用强制转换为类。你是如何将文件加载到缓存中的?抱歉,在这里花了这么长时间才接受答案,哈哈,我一直在努力想该怎么做,但你的答案最吸引我。我认为自己是一个资深程序员,甚至有CS学位,但从来没有遇到过这样的事情,真的很丢人。这将需要对一些课程进行一些修改,但我相信这将是非常有效的。很抱歉,在这里接受答案花了这么长时间。哈哈,我一直在努力做什么,但你的答案最吸引我。我认为自己是一个资深程序员,甚至有CS学位,但从来没有遇到过这样的事情,真的很丢人。这将需要对一些类进行一些修改,但我相信这将非常有效。