我目前正忙于在业余时间使用Java中的Mario-esque平台游戏作为尝试我没有经验的概念的手段。其中之一是在XML文件中加载和存储信息,以便理论上,游戏可以由最终用户或编辑工具修改,而无需拥有源代码/重新编译游戏。
到目前为止,我自己都取得了相当的成功,但我现在完全不确定如何进步。我正在尝试加载将在XML文件的某个级别上找到的实体。 XML文件当前包含其他信息,例如地图位置和使用w3c文档对象模型正确工作的播放器生成点。
我的困难来自于我需要从文件中加载多种类型的实体(特殊块,怪物等),我真的不想在我的加载器方法中每次都不需要硬编码所以当添加一个新类时,例如Monster3.java,我可以简单地在我的XML文件中添加几行,并且可以在不编辑加载器方法的情况下创建Monster3。
以下是我的关卡文件的当前格式:
<level>
<map>data\level2.tmx</map>
<player file="data\player.xml">
<x>0</x>
<y>48</y>
</player>
<entities>
<entity type="monster1" file="data\monster1.xml">
<x>48</x>
<y>48</y>
</entity>
<entity type="monster1" file="data\monster.xml">
<x>96</x>
<y>48</y>
</entity>
</entities>
</level>
仅仅为了一些背景信息,所有怪物都扩展了一个中心实体类。所有这些都有自己的构造函数来为那种类型的怪物设置细节,这些怪物使用相同的提供参数调用super(表示文件位置的字符串和起始位置的Vector2)。我不希望被交给代码,我只是想被推向正确的方向。
答案 0 :(得分:1)
您在这里寻找的是'反思'。
//Fully qualified name
String typeName = "com.yourcompany.product.Monster3";
try {
//Class from name
Class<?> myClass = Class.forName(typeName);
//Constructor from Parameter types...
Class<?>[] types = {Double.TYPE, String.class};
Constructor constructor = myClass.getConstructor(types);
//Instance from Parameter values...
Object[] parameters = {new Double(0), "Hello"};
Object instanceOfMyClass = constructor.newInstance(parameters);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
ex.printStackTrace();
}
注意强>:
这里的一个重要问题是类型安全
当您的软件变大时,调试将越来越困难
所以我建议使用抽象工厂模式,这对我的用例来说似乎很合适
此外,花时间实施一个类型安全的抽象工厂(使用课程泛型)以使之后的生活更加轻松是明智的。
希望这有帮助