【问题标题】:Java Game Design Class LoadingJava 游戏设计类加载
【发布时间】:2017-02-02 11:01:35
【问题描述】:

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

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

Data.getArte(idOfArte);

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

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

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

【问题讨论】:

  • @PhilipVaughn 你能澄清一下你的意思吗?您实际上只是在询问创建对象,而不是加载类,对吗?您在当前答案下方的评论中通过“通过获取文件夹中的所有文件然后将它们转换为新类来动态加载 files”是什么意思?您不能将文件转换为类(您可以将对象引用转换为类)。您如何将“文件”加载到缓存中?

标签: java javafx javafx-2 javafx-8


【解决方案1】:

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

【讨论】:

  • 抱歉,在这里接受答案花了这么长时间(大声笑)我一直在为该怎么做而苦苦挣扎,但你的回答最让我感兴趣。我认为自己是一名资深程序员(甚至拥有 CS 学位),但从未遇到过这样的事情(真的很遗憾)。需要对某些类进行一些修改,但这(我相信)会非常有效。
【解决方案2】:

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

我假设您不必在运行时旁加载类文件?如果是这样的话,我建议在这里看看:Method to dynamically load java class files

【讨论】:

  • 嗯...这实际上是一个自打包的应用程序(当然,一旦完成)这里没有基于云的东西。
  • 我查看了您提供的工厂模式示例,这是我最初想到的。由于我拥有的文件数量,我可能需要实现这样的东西。目前我已经通过获取文件夹中的所有文件然后将它们转换为新类来动态加载文件,但我担心长期性能,因为我将它们全部加载到缓存中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多