提供: Minecraft Modding Wiki
2013年3月12日 (火) 16:59時点におけるReginn666 (トーク | 投稿記録)による版
移動先: 案内検索

この記事は"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...となる.