2014-05-06 66 views
-1

我試圖爲每個擴展我的主類(BlockOre.java)的類執行類似的代碼塊。我問的代碼是一個我的世界MOD,但問題是關於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。正確?

回答

0

這樣做是創建一個通用類延伸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"); 
    } 
} 

N.B.顯然,您不能使用1,2,3作爲您的區塊ID並需要更改。

但是,如果你是絕對肯定它是通用的,你願意犧牲你的MOD的效率,你可以做到這一點,以maniuplate礦石名出類:

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 
+0

我發現了一種方法,可以在經過一些試驗和錯誤之後自己做到這一點,它與第一種方法非常相似,雖然沒有經過壓縮。感謝您幫助我縮小代碼大小,教會我一些技巧,但我不知道自己可以做什麼。 + 1使我的代碼更高效 – user3311827

+0

我在GenericBlockOre中遇到了變量問題,eclipse不會讓我傳遞方法變量。即使我在課堂上創建了它們。 – user3311827

+0

對不起,只是有一些課程重疊。 – user3311827