0

このクラス登録を使用するメタブロックからサブブロックに名前を付けるために必要なクラスが1つだけになるようにしようとしています。つまり、パラメーター値であるかのように名前を付けますが、パラメーター値を使用しません。

これは API (Minecraft Forge) を中心に展開していますが、これは Java に関する質問だと思うので、ここで、私が意図したことがどのように機能するかを簡単に説明します。

メタブロックは、同じブロックのバリエーションであるサブブロックで構成されます (たとえば、同じブロックでテクスチャと名前のみが変更されます)。各サブブロックには、それを識別するための名前が必要です。これらの名前は のクラスExampleItemBlockにリストされ、次を使用String[]して形式MetablockName.SubBlockName(例: ExampleMetablock.blueExampleMetablock.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()iitemStack.getItemDamage()ExampleMetablock.0ExampleMetablock.1

また、GitHub でいくつかの mod を検索しましたが、コード内にこれに関連するものは見つかりませんでした (私が知っていることです)。

だから私の質問は: 普遍的な *ItemBlock クラスを作成する方法はありますか?

クラスの内容: ExampleMetablockExampleItemBlock

4

2 に答える 2

0

私がお勧めするのは、すべての機能を実行する 1 つの基本クラスを作成することです。

public class BaseItemMetaBlock {
    .....
}

これには、メタ ブロックのレンダリングに関するすべての機能がありますが、どのブロックにも割り当てられません。

次に、ブロックを持ってください

public class MySuperAwesomeBlockItem extends BaseItemMetaBlock {
    public MySuperAwesomeBlockItem(Block block) {
       super(block);
    }
}

ItemBlock はブロック自体に関連付けられるため、ブロック状態を定義する列挙型をフェッチして必要な名前を返すプログラミング マジックを実行できます。

私がしたことは、ブロックに特別なインターフェースを与えて、汎用インターフェースにキャストした後に独自のメソッドを呼び出すことができるようにすることでした

 @Override
 public String getUnlocalizedName(ItemStack stack) {
    return super.getUnlocalizedName(stack) + "." + ((IMetaBlockName)this.block).getSpecialName(stack);
  }

とにかくそのようなもの。

于 2016-02-02T14:11:53.287 に答える