提供: Minecraft Modding Wiki
移動先: 案内検索

この記事は"Minecraft Forge Universal 9.10.0.xxx~"を前提MODとしています。

アニメーションアイテムの追加

インベントリ内でのみアニメーションするアイテムの追加をする。
持ってる時や落ちている時の描画は自分で行う必要がある
レシピの追加は行っていないので、自分で追加する必要がある。 1→2→3→1→2→3...とアニメーションする
初心者に優しくないチュートリアルですので、中級者向けになります。

ソースコード

  • AnimationItemSampleCore.java
package mods.animationsample;

import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod(modid="AnimationItemSampleCore", name="AnimationItemSampleCore", version="1.0")
public class AnimationItemSampleCore
{
	public static Item sampleAnimationItem;
	public static int sampleAnimationItemID = 28524;
	
	@SidedProxy(clientSide = "mods.animationsample.ClientProxy", serverSide = "mods.animationsample.CommonProxy")
	public static CommonProxy proxy;
	
	@EventHandler
	public void init(FMLInitializationEvent event)
	{
		proxy.registers();
		LanguageRegistry.addName(sampleAnimationItem, "Sample Animation Item");
		LanguageRegistry.instance().addNameForObject(sampleAnimationItem, "ja_JP", "サンプルアニメーションアイテム");
	}
	
	@EventHandler
	public void preInit(FMLPreInitializationEvent event)
	{
		sampleAnimationItem = new ItemAnimationItem(sampleAnimationItemID);
		GameRegistry.registerItem(sampleAnimationItem, "animationItem");
	}
}
  • ItemAnimationItem.java
package mods.animationsample;

import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.util.Icon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class ItemAnimationItem extends Item
{
	//アニメーションは3種類
	private Icon[] icons = new Icon[3];
	
	public ItemAnimationItem(int par1)
	{
		super(par1);
		this.setCreativeTab(CreativeTabs.tabMaterials);	//クリエイティブのタブ
		this.setUnlocalizedName("SampleAnimationItem");	//システム名の登録
		this.func_111206_d("animation_1");
		this.setMaxStackSize(64);	//スタックできる量
	}

	@Override
	@SideOnly(Side.CLIENT)
	public void registerIcons(IconRegister par1IconRegister)
	{
		super.registerIcons(par1IconRegister);
		//アイコンの登録
		icons[0] = par1IconRegister.registerIcon("animation_1");
		icons[1] = par1IconRegister.registerIcon("animation_2");
		icons[2] = par1IconRegister.registerIcon("animation_3");
	}
	
	public Icon[] getIcons()
	{
		return icons;
	}
}
  • RenderAnimationItem.java
package mods.animationsample;

import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.IItemRenderer;

public class RenderAnimationItem implements IItemRenderer
{
	private RenderItem renderItem = new RenderItem();
	
	@Override
	public boolean handleRenderType(ItemStack item, ItemRenderType type)
	{
		//インベントリの時のみ
		return type == ItemRenderType.INVENTORY;
	}

	@Override
	public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper)
	{
		//特に機能は使わない
		return false;
	}

	@Override
	public void renderItem(ItemRenderType type, ItemStack item, Object... data)
	{
		if(item.getItem() instanceof ItemAnimationItem && type == ItemRenderType.INVENTORY)
		{
			ItemAnimationItem iai = (ItemAnimationItem)item.getItem();
			//800フレームごとにアニメーションを変える。3種類で
			int num = (int)Minecraft.getSystemTime() / 800 % iai.getIcons().length;
			//描画
			this.renderItem.renderIcon(0, 0, iai.getIcons()[num], 16, 16);
		}
	}

}
  • CommonProxy.java
package mods.animationsample;

public class CommonProxy
{
	public void registers() {}
}
  • ClientProxy.java
package mods.animationsample;

import net.minecraftforge.client.MinecraftForgeClient;

public class ClientProxy extends CommonProxy
{
	@Override
	public void registers()
	{
		//描画の登録
		MinecraftForgeClient.registerItemRenderer(AnimationItemSampleCore.sampleAnimationItem.itemID, new RenderAnimationItem());
	}
}

解説

RenderAnimationItem.java

ItemAnimationItem iai = (ItemAnimationItem)item.getItem();
//800フレームごとにアニメーションを変える。3種類で
int num = (int)Minecraft.getSystemTime() / 800 % iai.getIcons().length;
//描画
this.renderItem.renderIcon(0, 0, iai.getIcons()[num], 16, 16);

描画しています。 renderItemの前にGLのメソッドを呼ぶことで、いろいろいじれます。

GL11.glScalef(0.8F, 0.8F, 0.8F);//0.8倍
GL11.glRotatef(90F, 0F, 0F, 1F);//Z方向に90度回転

詳しくやりたい人はOpenGL勉強してください。