このクラス登録を使用するメタブロックからサブブロックに名前を付けるために必要なクラスが1つだけになるようにしようとしています。つまり、パラメーター値であるかのように名前を付けますが、パラメーター値を使用しません。
これは API (Minecraft Forge) を中心に展開していますが、これは Java に関する質問だと思うので、ここで、私が意図したことがどのように機能するかを簡単に説明します。
メタブロックは、同じブロックのバリエーションであるサブブロックで構成されます (たとえば、同じブロックでテクスチャと名前のみが変更されます)。各サブブロックには、それを識別するための名前が必要です。これらの名前は のクラスExampleItemBlock
にリストされ、次を使用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 の 2 番目のパラメーターGameRegistry.registerBlock()
(API からのメソッド) には type の値が必要Class
です。ExampleItemBlock
それが問題です。インスタンスを使用せずにクラスを動的にするにはどうすればよいでしょうか?
コンストラクターに String[] パラメーターを追加してからExampleItemBlock
、クラスの代わりに名前を持つインスタンスを使用しようとしましたが、予想どおり、型の不一致が示されました。
それを達成する方法をどこでも探しましたが、2つの方法しか見つかりませんでした。
1.新しいメタブロックごとに ItemBlock クラスを作成します。
2.またはに変更SUBNAMES[i]
します。これにより、サブブロックが名前ではなく数字として名前が付けられ (例: 、など)、String[] などを使用する必要がなくなり、ユニバーサル クラスになります。ただし、この方法も非常に非現実的です。これは、どのサブブロックがどれであるかを特定する際に非常に複雑になるためです。getUnlocalizedName()
i
itemStack.getItemDamage()
ExampleMetablock.0
ExampleMetablock.1
また、GitHub でいくつかの mod を検索しましたが、コード内にこれに関連するものは見つかりませんでした (私が知っていることです)。
だから私の質問は: 普遍的な *ItemBlock クラスを作成する方法はありますか?
クラスの内容: ExampleMetablock、ExampleItemBlock。