提供: Minecraft Modding Wiki
2013年6月17日 (月) 11:36時点におけるEnkunkun (トーク | 投稿記録)による版 (バニラのテクスチャを使う場合について追記)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"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("sample:item").setCreativeTab(CreativeTabs.tabMaterials);
		sampleBlock    = (new Block(3800)).setUnlocalizedName("sample:block").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

上記の例では具体的には以下のパスが指定される.

Block : (bin/minecraft)/mods/sample/textures/blocks/block.png
Item  : (bin/minecraft)/mods/sample/textures/items/item.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を含めないこと.

バニラのテクスチャを使用する場合[編集]

@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister par1IconRegister)
{
	this.itemIcon = par1IconRegister.registerIcon("sign");
}

バニラで指定されているUnlocalizedNameを指定すればよい. この場合では看板を指定している.

まとめ[編集]

 インデックスを返す方法から, 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...となる.