我目前在业余时间使用Java的Mario-esque平台程序,作为尝试我没有经验的概念的方法。其中之一是将信息加载和存储在XML文件中,以便游戏可以从理论上讲,最终用户或编辑工具可以修改它们,而无需提供源代码/重新编译游戏。
到目前为止,我已经相当成功,但是我完全不确定该如何进步。我正在尝试从XML文件加载将在某个级别上找到的实体。XML文件当前包含其他信息,例如地图位置和播放器生成点,这些信息可以使用w3c文档对象模型正常工作。
我的困难来自以下事实:我需要从文件中加载多种类型的实体(特殊块,怪兽等),并且我真的不希望每次都在加载器方法中进行硬编码,这样当添加了新类,例如Monster3.java,我可以简单地在XML文件中添加几行,而无需编辑loader方法即可创建Monster3s。
这是我的关卡文件的当前格式:
<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>
仅出于一些背景信息,所有这些怪物都扩展了一个中心的Entity类。他们所有人都有自己的构造函数来设置该类型的怪物的详细信息,该怪物使用提供的相同参数(表示文件位置的字符串和具有起始位置的Vector2)调用super。我不希望被传递代码,我只是想朝正确的方向前进。
您在这里寻找的是“反射”。
//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();
}
注意:
这里的一个重要问题是类型安全。
当您的软件变大时,调试将变得越来越困难。
因此,我建议使用“抽象工厂”模式,该模式似乎适合您的用例。
同样,明智的是花一些时间来实现类型安全的抽象工厂(使用当然的泛型),以使以后的工作变得更轻松。
希望这可以帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句