我正在制作游戏。在这个游戏中,有一个名为“Tile”的类,它有一个以这种格式列出的所有图块:
public static final Tile <TILE_NAME> = new BasicTile<BasicSolidTile>(id, SpriteSheetX, SpriteSheetY, 0xFFColorInMap, isBackground, isLiquid);
这个游戏的一个主要方面是能够随意“修改”它(将有一个mod.smf文件,其中包含modding声明)。在此文件中,您将创建一个新的Tile,如下所示:
--Tile--
BasicTile/BasicSolidTile <Name>: X,Y,HexColor,<Background/Foreground>,<NotLiquid/Liquid>
ID将在代码中计算。
我想知道如何在我的Tile类中使用for循环运行mod文件中的所有新Tiles来创建更多“public static final Tile”。是否可能,或者我是否必须更改Tile的存储方式(例如ArrayList?)?
答案 0 :(得分:2)
您不能以编程方式在运行时更改类的定义。例如。你不能添加静态字段。
您需要使用集合。就像你说的那样,ArrayList
是众多选择之一。
答案 1 :(得分:2)
你的任务是不可能的。
您不能通过代码在运行时向类中添加任何字段。
而不是这个请求,你必须将你的解决方案更改为将你的Tiles带来的东西。
几乎可以是任何类型的集合。您必须分析什么是最佳用法并决定进一步使用的内容。
祝你好运。
答案 2 :(得分:2)
ArrayList
将是最佳选择。但以防万一:这里有一些可能性,如何动态添加字段(或者在运行时更改现有类):
您可以从类加载器中获取类的字节代码,然后使用ASM - libaray修改您的类。修改后的字节代码可以使用自定义类加载器加载到JVM中。之后,您将同时加载两个不同的类副本。要在修改后的类而不是原始类上调用方法,您必须使用Reflection API。
要只有一个(修改过的)课程副本,您可以实施Java-Agent。使用Java-Agent,您可以在加载到Java Virtual Maschine之前修改字节代码。 ASM使这项任务相对容易。
您还可以从您的mod文件生成Java代码,编译它然后将其加载到JVM中。为了在运行时使用javac
编译Java代码,您将需要JDK。但大多数普通用途只安装了JRE。一个不错的选择是使用Eclipse Java Compile EJC。它支持内存中编译,您可以将java代码转换为字节代码,而无需在磁盘上创建任何文件。
最麻烦的解决方案是改变类的字节代码,然后使用调试模式将其重新加载到您自己的JDK中。我不会建议实际使用它。您可以获得有关此方法的更多信息,以探索流行模拟库的源代码 JMockit。