(UnlocalizedNameにドメイン名を含める方法を追加し、更新されたネームテーブルに基づいたフィールド名・メソッド名に書き換えました) |
細 (→解説) |
||
57行目: | 57行目: | ||
==解説== | ==解説== | ||
<p> | <p> | ||
− | 従来の手法と異なり, Itemごと, Blockごとに個別のテクスチャファイルが設定される.設定されるテクスチャファイルのパスはUnlocalizedNameから自動的に決定される.UnlocalizedNameに"domain名:ブロック名","domain名:アイテム名"のようなドメイン名を含む形で指定すると,テスクチャには以下のパスのテスクチャファイルが指定される. | + | 従来の手法と異なり, Itemごと, Blockごとに個別のテクスチャファイルが設定される. 設定されるテクスチャファイルのパスはUnlocalizedNameから自動的に決定される. UnlocalizedNameに"domain名:ブロック名","domain名:アイテム名"のようなドメイン名を含む形で指定すると,テスクチャには以下のパスのテスクチャファイルが指定される. |
<blockquote> | <blockquote> | ||
<source lang = "java"> | <source lang = "java"> |
2013年3月24日 (日) 22:17時点における版
この記事は"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 Item(30000)).setUnlocalizedName("item:sample").setCreativeTab(CreativeTabs.tabMaterials); sampleBlock = (new Block(3800)).setUnlocalizedName("block:sample").setCreativeTab(CreativeTabs.tabBlock); GameRegistry.registerBlock(sampleBlock, "SampleBlock"); LanguageRegistry.addName(sampleItem, "SampleItem"); LanguageRegistry.addName(sampleBlock, "SampleBlock"); } }
解説
従来の手法と異なり, Itemごと, Blockごとに個別のテクスチャファイルが設定される. 設定されるテクスチャファイルのパスはUnlocalizedNameから自動的に決定される. UnlocalizedNameに"domain名:ブロック名","domain名:アイテム名"のようなドメイン名を含む形で指定すると,テスクチャには以下のパスのテスクチャファイルが指定される.
Block : (bin/minecraft)/mods/"domain名"/textures/blocks/"ブロック名".png Item : (bin/minecraft)/mods/"domain名"/textures/items/"アイテム名".png
複数のテクスチャ,指定のテクスチャを持つアイテム/ブロック
UnlocalizedNameから決定されるテクスチャファイルと異なるテクスチャを指定する場合や複数のテクスチャを持たせる場合は以下のように個別のクラス内でテクスチャを指定する.
サンプルコード
- SampleIconCore.java
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 updateIcons(IconRegister par1IconRegister) { this.iconIndex = par1IconRegister.registerIcon("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 registerIcons(IconRegister par1IconRegister) { this.blockIcon = par1IconRegister.registerIcon("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 { @SideOnly(Side.CLIENT) private Icon topIcon; @SideOnly(Side.CLIENT) private Icon sideIcon; public BlockSampleDuo(int blockId) { super(blockId, Material.wood); } @Override @SideOnly(Side.CLIENT) public void registerIcons(IconRegister par1IconRegister) { this.topIcon = par1IconRegister.registerIcon("sample:block_top"); this.sideIcon = par1IconRegister.registerIcon("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; } } }
解説
基本的には今までのテクスチャインデックス(整数値)がIconインタフェースに変わっただけである. Blockの面指定も適切なIconを返せばよい. もし1つのクラスで複数のテクスチャの異なるItemなどを扱っている場合は, getUnlocalizedName()あたりを使うとよい.
Iconの指定
@Override @SideOnly(Side.CLIENT) public void updateIcons(IconRegister par1IconRegister) { this.iconIndex = par1IconRegister.registerIcon("sample:item"); }
@Override @SideOnly(Side.CLIENT) public void registerIcons(IconRegister par1IconRegister) { this.blockIcon = par1IconRegister.registerIcon("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...となる.