提供: 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勉強してください。