16 août 2013, 16:04

Bonjour a tous !
Je vais vous apprendre a faire une animation simple pour un mob.

Ce n’est pas un tutoriel pour faire un mob , donc si vous ne comprenez pas les codes , demandez de l’aide !

1) Prérequis

Les proxies
Les classe de votre mob

Pour faire court , je vous donnerai les miens , a savoir notre cher Liquid Ocelot :

Et la texture :

Liquid.java :

// Date: 20/07/2013 18:39:15
// Template version 1.1
// Java generated by Techne
// Keep in mind that you still need to fill in some blanks
// - ZeuX

package mods.nono.MGSmod.client;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.util.MathHelper;

public class Liquid extends ModelBase
{
    //fields
    ModelRenderer head;
    ModelRenderer body;
    ModelRenderer rightarm;
    ModelRenderer leftarm;
    ModelRenderer rightleg;
    ModelRenderer leftleg;
    ModelRenderer HairA;
    ModelRenderer HairD;
    ModelRenderer HairG;

    public Liquid()
    {
        textureWidth = 128;
        textureHeight = 128;

        head = new ModelRenderer(this, 0, 0);
        head.addBox(-4F, -8F, -4F, 8, 8, 8);
        head.setRotationPoint(0F, 0F, 0F);
        head.setTextureSize(128, 128);
        head.mirror = true;
        setRotation(head, 0F, 0F, 0F);
        body = new ModelRenderer(this, 16, 16);
        body.addBox(-4F, 0F, -2F, 8, 12, 4);
        body.setRotationPoint(0F, 0F, 0F);
        body.setTextureSize(128, 128);
        body.mirror = true;
        setRotation(body, 0F, 0F, 0F);
        rightarm = new ModelRenderer(this, 40, 16);
        rightarm.addBox(-3F, -2F, -2F, 4, 12, 4);
        rightarm.setRotationPoint(-5F, 2F, 0F);
        rightarm.setTextureSize(128, 128);
        rightarm.mirror = true;
        setRotation(rightarm, 0F, 0F, 0F);
        leftarm = new ModelRenderer(this, 40, 16);
        leftarm.addBox(-1F, -2F, -2F, 4, 12, 4);
        leftarm.setRotationPoint(5F, 2F, 0F);
        leftarm.setTextureSize(128, 128);
        leftarm.mirror = true;
        setRotation(leftarm, 0F, 0F, 0F);
        rightleg = new ModelRenderer(this, 0, 16);
        rightleg.addBox(-2F, 0F, -2F, 4, 12, 4);
        rightleg.setRotationPoint(-2F, 12F, 0F);
        rightleg.setTextureSize(128, 128);
        rightleg.mirror = true;
        setRotation(rightleg, 0F, 0F, 0F);
        leftleg = new ModelRenderer(this, 0, 16);
        leftleg.addBox(-2F, 0F, -2F, 4, 12, 4);
        leftleg.setRotationPoint(2F, 12F, 0F);
        leftleg.setTextureSize(128, 128);
        leftleg.mirror = true;
        setRotation(leftleg, 0F, 0F, 0F);
        HairA = new ModelRenderer(this, 0, 38);
        HairA.addBox(-4F, 0F, 0F, 8, 8, 1);
        HairA.setRotationPoint(0F, -3F, 3F);
        HairA.setTextureSize(128, 128);
        HairA.mirror = true;
        setRotation(HairA, 0.2094395F, 0F, 0F);
        HairD = new ModelRenderer(this, 0, 65);
        HairD.addBox(0F, 0F, 0F, 1, 7, 1);
        HairD.setRotationPoint(3F, -1F, -3F);
        HairD.setTextureSize(128, 128);
        HairD.mirror = true;
        setRotation(HairD, 0F, 0F, 0F);
        HairG = new ModelRenderer(this, 0, 65);
        HairG.addBox(0F, 0F, 0F, 1, 7, 1);
        HairG.setRotationPoint(-4F, -1F, -3F);
        HairG.setTextureSize(128, 128);
        HairG.mirror = true;
        setRotation(HairG, 0F, 0F, 0F);
    }

    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
    {
        super.render(entity, f, f1, f2, f3, f4, f5);
        setRotationAngles(f, f1, f2, f3, f4, f5, entity);
        head.render(f5);
        body.render(f5);
        rightarm.render(f5);
        leftarm.render(f5);
        rightleg.render(f5);
        leftleg.render(f5);
        HairA.render(f5);
        HairD.render(f5);
        HairG.render(f5);
    }

    private void setRotation(ModelRenderer model, float x, float y, float z)
    {
        model.rotateAngleX = x;
        model.rotateAngleY = y;
        model.rotateAngleZ = z;
    }

    public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity)
    {
        super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);

    }
}

LiquidRender.java

package mods.nono.MGSmod.client;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderLiving;
import net.minecraft.entity.Entity;

public class LiquidRender extends RenderLiving {

    private Liquid LiquidRender = new Liquid();

    public LiquidRender(Liquid LiquidRender, float par2)
    {
    super(new Liquid(), 0.5F);
    }
}

LiquidMob.Java

package mods.nono.MGSmod.common;

import net.minecraft.entity.Entity;
import net.minecraft.entity.EnumCreatureAttribute;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.world.World;

public class LiquidMob extends EntityMob
{
    public LiquidMob(World par1World)
    {
        super(par1World);
        this.texture = "/mods/nono/MGSmod/textures/mob/Liquid.png";
        this.moveSpeed = 0.15F;
    }

    public int getMaxHealth()
    {
        return 100;
    }

    public int getAttackStrength(Entity par1Entity)
    {
        return 10;
    }

    public EnumCreatureAttribute getCreatureAttribute()
    {
        return EnumCreatureAttribute.UNDEFINED;
    }
}

A placer dans votre ClientProxy.java :

public void registerRenderEntity()
{
    RenderingRegistry.registerEntityRenderingHandler(LiquidMob.class, new LiquidRender(new Liquid(), 0.5F));
}

Et dans votre classe principale , partie @Init :

EntityRegistry.registerGlobalEntityID(LiquidMob.class, "Liquid", EntityRegistry.findGlobalUniqueEntityId(), 74, 38);
EntityRegistry.registerModEntity(LiquidMob.class, "Liquid", 6, this, 40, 1, true);
LanguageRegistry.instance().addStringLocalization("entity.Liquid.name","Liquid Ocelot");
proxy.registerRenderEntity();

Vous pouvez tester , vous verrez que Liquid N’est pas animé , que c’est juste une planche.

2) L’animation

Dans votre classe Liquid.Java , rendez vous à cette ligne :
Code (java):
super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
Puis ajoutez :

this.Membre.rotateAngleX

Ou Membre est à remplacer par le membre en question , ici on va le remplacer rightleg.
Vous pouvez changer X par Y ou par Z.
Ensuite , au bout de cette ligne , rajoutez :

= MathHelper.cos((180F / (float)Math.PI)) * -xF * f1;

Pour avoir une animation de balancement ( ? ) sinon :

= MathHelper.cos((180F / (float)y)) * -xF * f1;

Pour l’animation que d’un coté.
Remplacez X et Y par une valeur quelconque. ( pour X j’ai mis 3.8 )
Ensuite testez. Vous verrez que Liquid ne bouge qu’une seule jambe.
Refaites la même opération pour chacun des membres qui bougent !
Vous devriez avoir ça :

super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
this.rightleg.rotateAngleX = MathHelper.cos((180F / (float)Math.PI)) * -3.8F * f1;
this.leftleg.rotateAngleX = MathHelper.cos((180F / (float)Math.PI)) * -3.8F * f1;
this.rightarm.rotateAngleX = MathHelper.cos((180F / (float)Math.PI)) * -3.8F * f1;
this.leftarm.rotateAngleX = MathHelper.cos((180F / (float)Math.PI)) * -3.8F * f1;

Testez. Vous verrez que le mouvement n’est pas naturel …
Enlevez tout simplement le - devant un membre inférieur ( les jambes ) et supérieur ( les bras ) :

super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
this.rightleg.rotateAngleX = MathHelper.cos((180F / (float)Math.PI)) * -3.8F * f1;
this.leftleg.rotateAngleX = MathHelper.cos((180F / (float)Math.PI)) * 3.8F * f1;
this.rightarm.rotateAngleX = MathHelper.cos((180F / (float)Math.PI)) * 3.8F * f1;
this.leftarm.rotateAngleX = MathHelper.cos((180F / (float)Math.PI)) * -3.8F * f1;

Vous pouvez diminuer 3.8 ou l’augmenter si cela ne vous convient pas.

3) Copyright

le tuto + le model + la texture sont de moi
Libre a vous de le mettre sur n’importe quel site , du moment que vous me citez.