【问题标题】:Dynamic Object variable creation Based on the Object accessing them动态对象变量创建基于访问它们的对象
【发布时间】:2014-05-06 00:07:35
【问题描述】:

我正在尝试为扩展我的主类 (BlockOre.java) 的每个类执行类似的代码块。我要问的代码是针对我的世界模组的,但问题只是关于 Java,而不是关于我的世界。在我的主类中,我创建了三个新的“块”对象。

public static Block AluminumOre = new BlockAluminumOre();
public static Block VibraniumOre = new BlockVibraniumOre();
public static Block PoloniumOre = new BlockPoloniumOre();

这些块中的每一个的类都扩展了我的类 BlockOre。在我的 BlockOre 类中,我希望拥有这些块的所有类似重复功能。

@SideOnly(Side.CLIENT)
public IIcon iconOre;
@SideOnly(Side.CLIENT)
public IIcon iconNetherOre;
@SideOnly(Side.CLIENT)
public IIcon iconEndOre;
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister){
    iconOre = iconRegister.registerIcon(Reference.MODID + ":EndAluminumOre");
    iconNetherOre = iconRegister.registerIcon(Reference.MODID + ":NetherAluminumOre");
    iconEndOre = iconRegister.registerIcon(Reference.MODID + ":AluminumOre");
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int metadata ){
    int dim = Minecraft.getMinecraft().theWorld.provider.dimensionId;
    if (dim == -1)
        return iconNetherOre;
    else if(dim == 0)
        return iconOre;
    else if(dim == 1)
        return iconEndOre;
    else
        return iconOre;

}

这是我希望他们都做的事情。我需要创建这些新图标,注册它们,然后将它们返回给将获取块纹理的函数。我只有相当基本的java知识,似乎无法弄清楚如何根据继承类的内容来更改所有对象。

所以更简单地说,我需要 iconOre = icon(x)Ore,其中 x = 扩展这个的类。

附言。我知道我可以使用“this”来获取对象。我也需要更改字符串,如何正确格式化 this.toString() 。它根据内存中的位置返回 [Object]@XXXXXXXX。对吗?

【问题讨论】:

    标签: java class object minecraft extends


    【解决方案1】:

    最简单的方法是创建一个扩展 BlockOre 并包含您需要检索的名称的泛型类,例如:

    public class GenericBlockOre extends BlockOre
    {
        final String name;
    
        @SideOnly(Side.CLIENT)
        public IIcon iconOre, iconNetherOre, iconEndOre;
    
        public GenericBlockOre(final int id, final String name)
        {
            super(id);
            this.name = name;
        }
    
        @Override
        @SideOnly(Side.CLIENT)
        public void registerBlockIcons(IIconRegister iconRegister)
        {
            iconOre = iconRegister.registerIcon(Reference.MODID + ":End" + this.name + "Ore");
            iconNetherOre = iconRegister.registerIcon(Reference.MODID + ":Nether" + this.name + "Ore");
            iconEndOre = iconRegister.registerIcon(Reference.MODID + ":" + this.name + "Ore");
        }
    }
    

    你的物品会变成:

    public static Block aluminumOre = new GenericBlockOre(1, "Aluminum");
    public static Block vibraniumOre = new GenericBlockOre(2, "Vibranium");
    public static Block poloniumOre = new GenericBlockOre(3, "Polonium");
    

    或者如果你真的需要创建一个新类,扩展类可以很简单:

    class AluminumOre extends GenericBlockOre
    {
        public AluminumOre()
        {
            super(1, "Aluminum");
        }
    }
    

    注意显然你不能使用123作为你的块ID,需要更改。

    但是,如果您绝对确定它必须是通用的并且您愿意为此牺牲模组的效率,您可以这样做以将矿石名称从类中删除:

    final AluminumOre ore = new AluminumOre();
    
    final String className = ore.getClass().getSimpleName();
    final String oreName = className.substring(0, className.indexOf("Ore"));
    System.out.println(oreName); //Prints: Aluminum
    

    【讨论】:

    • 经过反复试验,我自己找到了一种方法,它与您的第一种方法非常相似,尽管没有那么紧凑。感谢您帮助我缩小代码大小,并教我一些我不知道我可以做到的技巧。 + 1 更多使我的代码更有效率
    • 我在使用 GenericBlockOre 中的变量时遇到问题,eclipse 不允许我传递方法变量。即使我在课堂上创建了它们。
    • 抱歉,只是有一些类重叠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2015-09-23
    • 2010-10-31
    • 2016-05-10
    相关资源
    最近更新 更多