191行目: | 191行目: | ||
==まとめ== | ==まとめ== | ||
<p> | <p> | ||
− | インデックスを返す方法から, Iconを返す方法に変わっただけと言えなくもない. テクスチャが多い場合, ImageMagickなどを使って分割させるとリネームだけで済むので楽かもしれない. なお, | + | インデックスを返す方法から, Iconを返す方法に変わっただけと言えなくもない. テクスチャが多い場合, ImageMagickなどを使って分割させるとリネームだけで済むので楽かもしれない. なお, デフォルトでは(オーバーライドしないと), textures/blocks/unlocalizedName.pngがIconになるので注意. |
</p> | </p> | ||
2013年3月12日 (火) 16:59時点における版
この記事は"Minecraft Forge 7.7x"を前提MODとしています。 |
新しいテクスチャの利用
Minecraft 1.5から従来の1枚のterrain.pngから切りだして使う方法ではなく, 個々のテクスチャを設定する方法に変更された. この変更に伴いバニラでもテクスチャのアニメーションや, 高解像度(64x64まで?)に対応した.
FML/forgeではMod側でテクスチャを追加するための新しい機構が刷新された. 従来の方法と異なりMod用のテクスチャへのパスはほぼ固定化されているので注意.
サンプルコード
- SampleIconCore.java
package sample.icon; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; @Mod ( modid = "SampleIcon", name = "SampleIcon", version = "1.0.0" ) @NetworkMod ( clientSideRequired = true, serverSideRequired = false ) public class SampleIconCore { public static Item sampleItem; public static Block sampleBlock; public static Block sampleBlockDuo; @Mod.Init public void init(FMLInitializationEvent event) { sampleItem = (new ItemSample(30000)).setUnlocalizedName("itemSample").setCreativeTab(CreativeTabs.tabMaterials); sampleBlock = (new BlockSample(3800)).setUnlocalizedName("blockSample").setCreativeTab(CreativeTabs.tabBlock); sampleBlockDuo = (new BlockSampleDuo(3801)).setUnlocalizedName("blockSampleDuo").setCreativeTab(CreativeTabs.tabBlock); GameRegistry.registerBlock(sampleBlock, "SampleBlock"); GameRegistry.registerBlock(sampleBlockDuo, "SampleBlockDuo"); LanguageRegistry.addName(sampleItem, "SampleItem"); LanguageRegistry.addName(sampleBlock, "SampleBlock"); LanguageRegistry.addName(sampleBlockDuo, "SampleBlockDuo"); } }
- ItemSample.java
package sample.icon; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.item.Item; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ItemSample extends Item { public ItemSample(int itemId) { super(itemId); } @Override @SideOnly(Side.CLIENT) public void func_94581_a(IconRegister par1IconRegister) { this.iconIndex = par1IconRegister.func_94245_a("sample:item"); } }
- BlockSample.java
package sample.icon; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockSample extends Block { public BlockSample(int blockId) { super(blockId, Material.wood); } @Override @SideOnly(Side.CLIENT) public void func_94332_a(IconRegister par1IconRegister) { this.field_94336_cN = par1IconRegister.func_94245_a("sample:block"); } }
- BlockSampleDuo.java
package sample.icon; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.util.Icon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockSampleDuo extends Block { private Icon topIcon; private Icon sideIcon; public BlockSampleDuo(int blockId) { super(blockId, Material.wood); } @Override @SideOnly(Side.CLIENT) public void func_94332_a(IconRegister par1IconRegister) { this.topIcon = par1IconRegister.func_94245_a("sample:block_top"); this.sideIcon = par1IconRegister.func_94245_a("sample:block_side"); } @Override @SideOnly(Side.CLIENT) public Icon getBlockTextureFromSideAndMetadata(int side, int meta) { if (side == 0 || side == 1) { return this.topIcon; } else { return this.sideIcon; } } }
解説
従来の手法と異なり, Itemごと, Blockごとにテクスチャを設定する必要がある. 基本的には今までのテクスチャインデックス(整数値)がIconインタフェースに変わっただけである. Blockの面指定も適切なIconを返せばよい. もし1つのクラスで複数のテクスチャの異なるItemなどを扱っている場合は, getUnlocalizedName()あたりを使うとよい. なおネームテーブルがまだ対応していないのでフィールド名やメソッド名が連番のままである.
Iconの指定
@Override @SideOnly(Side.CLIENT) public void func_94581_a(IconRegister par1IconRegister) { this.iconIndex = par1IconRegister.func_94245_a("sample:item"); }
@Override @SideOnly(Side.CLIENT) public void func_94332_a(IconRegister par1IconRegister) { this.field_94336_cN = par1IconRegister.func_94245_a("sample:block"); }
ItemもBlockもテクスチャの指定方法は同じ. "domain名:テクスチャのファイル名"で指定する. このときのテクスチャの具体的なパスは以下の通り.
Block : (bin/minecraft)/mods/"domain名"/textures/blocks/"テクスチャのファイル名".png Item : (bin/minecraft)/mods/"domain名"/textures/items/"テクスチャのファイル名".pngこのときのdomain名はただのパスなので, たとえば"sample/aaa"とすればパスもmods/sample/aaa/*となる. 注意すべきはファイル名に.pngを含めないこと.
まとめ
インデックスを返す方法から, Iconを返す方法に変わっただけと言えなくもない. テクスチャが多い場合, ImageMagickなどを使って分割させるとリネームだけで済むので楽かもしれない. なお, デフォルトでは(オーバーライドしないと), textures/blocks/unlocalizedName.pngがIconになるので注意.
おまけ
ImageMagickというソフトをインストールして, 付属のconvert.exeを使うと256x256のテクスチャを16x16のテクスチャに分割することが可能.
imagemagick_dir\convert.exe blocks.png -crop 16x16@ +repage +adjoin block%d.png
パスは適宜. cropオプションで分割モード, 16x16でこの画像を16x16個に分割(16x16サイズではない), block%d.pngで分割された画像のファイル名block0.png, block1.png, block2.png...となる.