我试图使只需要一个类来命名使用此类注册的任何元块中的子块,即,将它们命名为好像它们是参数值一样,但不使用一个。
虽然这围绕着一个 API(Minecraft Forge),但我认为这是一个 Java 问题,所以我在这里快速解释一下我打算如何工作。
元块由子块组成,子块是同一块的变体(例如,同一块但只有纹理和名称改变)。每个子块都需要一个名称来标识它。ExampleItemBlock
这些名称在 a中的类中列出String[]
,然后以格式命名MetablockName.SubBlockName
(例如:ExampleMetablock.blue
、ExampleMetablock.green
等),使用
// ExampleItemBlock Class
public static final String[] SUBNAMES = new String[] {"blue", "green", "yellow"};
@Override
public String getUnlocalizedName(ItemStack itemStack)
{
int i = itemStack.getItemDamage();
return getUnlocalizedName() + "." + SUBNAMES[i];
}
然后,ExampleMetablock
使用实例化和注册元块
// Class where the registrations are made
public static Block ExampleMetablock = new ExampleMetablock();
GameRegistry.registerBlock(ExampleMetablock, ExampleItemBlock.class, "ExampleMetablock");
在此之后,一切正常,但是我必须为我制作的每个新元块创建一个新的 *ItemBlock 类,我认为这不是一件好事或适当的事情,我认为创建一个更好任何未来元块都将使用的单个类。
很明显,method 的第二个参数GameRegistry.registerBlock()
(即 API 中的方法)需要 type 的值Class
。这就是问题所在:如何在ExampleItemBlock
不使用实例的情况下使类动态化?
我什至尝试在ExampleItemBlock
构造函数中添加一个 String[] 参数,然后使用具有名称的实例代替类,但正如预期的那样,它表示类型不匹配。
我到处寻找某种方式来实现这一目标,但我只找到了两种方法:
1.为每个新元块创建一个ItemBlock类;
2.更改SUBNAMES[i]
为or ,这将导致子块被命名为数字而不是名称(例如:getUnlocalizedName()
,等),不需要使用 String[] 或任何东西,并使其成为一个通用类。然而,这种方式也是非常不切实际的,因为这在识别哪个子块是哪个时复杂了很多。i
itemStack.getItemDamage()
ExampleMetablock.0
ExampleMetablock.1
我还在 GitHub 上搜索了一些 mods,但在代码中没有找到任何与此相关的内容(据我所知)。
所以我的问题是:有没有办法制作一个通用的 *ItemBlock 类,但仍然用名称(单词)命名子块?