2016-09-24 82 views
1

我正在用JavaFX构建一个RPG游戏,需要得到专家的建议。Java游戏设计课程加载

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

Data.getArte(idOfArte); 

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

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

编辑:我也很关心性能。

+0

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

回答

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

对不起,在这里接受一个答案花了这么长时间(大声笑)我一直在努力做什么,但你的答案最吸引我。我认为自己是一位资深的程序员(即使拥有CS学位),但从未遇到过像这样的事情(真的很遗憾)。这将需要一些类的修改,但是这(我相信)会非常高效。 –

1

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

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

+0

嗯......这实际上是假设自己打包的应用程序(一旦它完成了)当然没有基于云的东西在这里进行。 –

+0

我看了一下你给出的Factory Pattern例子,这是我最初想到的。仅仅因为我拥有的文件数量太多,我可能需要实现这样的事情。目前我已经通过获取文件夹中的所有文件来动态加载文件,然后将它们转换为新类,但是我担心长期性能,因为我将它们全部加载到缓存中。 –