Alléger sa classe principale



  • Bonjour à tous !

    Nouveau tutoriel que je qualifierais plutôt d'astuce qui pourra ravir ceux ayant de gros Mods à coder avec pleins de lignes de code un peu partout et des classes de quelques dizaines de mètres de long 😛

    Dans celui-ci nous allons apprendre à alléger le code de notre classe principale. Mais késékécékéça ? Alléger sa classe, veut-dire, déplacer certaines lignes de code afin de pouvoir le rendre plus clair et plus simplifié mais également de retrouver plus facilement ses petits bouts de code disséminés un peu partout dans notre Mod.

    Ce que nous allons apprendre :

    • Créer une classe RegisterBlock, RegisterItem, RegisterCrafting, RegisterSmelting, etc…
    • Le faire de 2 façons : l'une par classe entière, la seconde par méthode de classes (comme la fonction load() par exemple)

    Requis pour le tuto :

    • Savoir créer un block/Item/Recette/Recette de four, etc...
    • Un minimum de logique et quelques connaissances en java, rien de plus 🙂

    PS : N'oubliez pas les importations de classes (Block, GameRegistry, etc...)

    #Une classe par fonction :(Une classe par fonction 🙂
    Alors, pour commencer, on fais le plus simple, créer un système de "RegisterCeQueVousVoulez" avec une classe par fonction.

    Créons la classe de notre mod :

    package tuto.forge;
    
    import tuto.forge.CommonProxy;
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.SidedProxy;
    import cpw.mods.fml.common.Mod.EventHandler;
    import cpw.mods.fml.common.Mod.Instance;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    import cpw.mods.fml.common.network.NetworkMod;
    
    @Mod(modid="tuto", name="tuto", version="Alpha 1.0")
    @NetworkMod(clientSideRequired=true)
    public class Tuto
    {
    @Instance(value = "Tuto")
    public static Tuto instance;
    
    @SidedProxy(clientSide="tuto.forge.ClientProxy", serverSide="tuto.forge.CommonProxy")
    public static CommonProxy proxy;
    
    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
    
    }
    
    @EventHandler
    public void load(FMLInitializationEvent event)
    {
    
    }
    
    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    
    }
    }
    
    

    Comme vu dans la plupart des tutos de création de mods, vous savez où enregistrer vos lignes de code en fonction des méthodes de la classe principale. Petit rappel :

    • Fonction preInit() : Block/Items/Onglets Créatifs pour la base
    • Fonction load() : Enregistrement et langue des blocks/Items + Recettes, four, etc...
    • Fonction postInit() : Rien d'intéressant pour nous.

    On va commencer par les blocks.
    Créons notre nouvelle classe et appelons là RegisterBlock :

    package tuto.forge;
    
    public class RegisterBlock
    {
    
    }
    
    

    Elle n'a aucun pré-requis, ceux-ci vont venir au fur et à mesure.
    Bon, on déclare nos blocks :

    package tuto.forge;
    public class RegisterBlock
    {
    public static Block tuto;
    
    public RegisterBlock()
    {
    tuto = new BlockTuto(ID, Material).touteslesfonctionsquevousvoulez()
    }
    }
    
    

    Comme vu ici, notre block est déclaré, cependant, il n'est pas enregistré et ne sera même pas perçu par le mod
    Pour l'enregistrer, c'est très simple, encore une nouvelle classe :

    package tuto.forge;
    public class GameRegisterBlock
    {
    public GameRegisterBlock()
    {
    GameRegistry.addBlock(tuto, "tuto");
    }
    }
    

    Block enregistré mais toujours pas perçu !
    On retourne dans notre classe principale et on ajoute 2 choses :

    • Le chargement des blocks dans la classe RegisterBlock dans la fonction preInit()
    • L'enregistrement des blocks dans la classe GameRegisterBlock dans la fonction load()

    C'est relativement simple. Voici comment assigner la classe où nos blocks sont définis dans la 1ère fonction :

    
    //A introduire dans la fonction preInit()
    new RegisterBlock();
    
    //A introduire dans la fonction load()
    new GameRegisterBlock();
    

    Pour ce qui est recette et blocks, rien de plus simple : reprenez le système d'enregistrement des blocks et à la place du GameRegister.addBlock, ajoutez vos recettes (GameRegister.addRecipe) et implantez la classe dans la fonction load().

    #Une méthode par fonction :(Une méthode par fonction 🙂

    Ici, seconde partie. Ce qu'on va voir c'est comment à partir d'une seule classe on peut enregistrer nos blocks, nos items, nos recettes, etc... dans une seule classe 🙂
    Encore une fois, c'est relativement simple. A la place de créer un "RegisterBlock" ou autre, on va directement créer la classe "Register" puisque tout sera dedans :

    package tuto.forge;
    
    public class Register
    {
    
    public static Block tuto;
    public static Item itemTuto;
    
    public static void RegisterBlock()
    {
    tuto = new BlockTuto(ID, Material).touteslesfonctionsquevousvoulez()
    }
    
    public static void RegisterItem()
    {
    itemTuto = new ItemTuto(ID).touteslesfonctionsquevousvoulez()
    }
    
    public static void GameRegisterBlock()
    {
    GameRegistry.addBlock(tuto, "tuto");
    }
    public static void GameRegisterItem()
    {
    GameRegistry.addItem(itemTuto, "itemTuto");
    }
    public static void GameRegisterCraft()
    {
    GameRegistry.addRecipe(new ItemStack(this.tuto, 1), new Object[] {"###", "###", "###", '#', this.itemTuto});
    }
    }
    

    Comme voici, tout est enregistré :
    - RegisterBlock() : Permet de définir tout les blocks
    **- RegisterItem() **: Permet de définir tout les items
    - GameRegisterBlock() : Permet d'enregistrer les blocks
    - GameRegisterItem() : Permet d'enregistrer les items
    - GameRegisterCraft() : Permet d'enregistrer les crafts
    Remarque : Vous pouvez rajouter autant de fonctions que vous voulez ici comme le nom, les fours, etc...

    Voilà, notre classe est prête cependant elle n'est pas détectée par le mod ! Pour ceci, il faut faire varier les fonctions de la classe Register en fonction de celles de notre classe Mod :

    • Commençant par "Register" : à inclure dans preInit()
    • Commençant par "Game" : à inclure dans load()

    Le petit bout de code :

    
    //Dans preInit()
    Register.RegisterBlock();
    Register.RegisterItem()
    
    //Dans load()
    Register.GameRegisterBlock();
    Register.GameRegisterItem();
    Register.GameRegisterCraft()
    
    

    Et voilà, une fois ceci terminé, vous lancez et voilà ! Suivant ce que vous avez choisi, vous avez une classe pour tout vos blocks/items/recettes ou une classe à chaque fois !

    J'espère que ce tuto/astuce vous aura plu, c'est mon premier, n'hésitez pas à me dire les erreurs, une méthode de simplifier la chose ou encore ce que vous n'avez pas compris, je vous répondrais, à bientôt !

    PS : Encore une fois, n'oubliez pas les importations, je ne les ai pas fais apparaître dans les classes !



  • C'est un bon tuto continu comme sa 🙂



  • J'aime bien l'idée du tutoriel mais je me permet quand même de souligner un point : Les noms de méthodes en java commencent par une minuscule et non pas par une majuscule !

    Bonne continuation,

    Ourten.



  • @'Ourten':

    J'aime bien l'idée du tutoriel mais je me permet quand même de souligner un point : Les noms de méthodes en java commencent par une minuscule et non pas par une majuscule !

    Bonne continuation,

    Ourten.

    Chose que j'avais oublié d'ailleurs, merci de me le rappeler 🙂


  • Administrateurs

    Les méthodes peuvent commencer par une majuscule, cela n'a pas d'importance, le code est quand même reconnu. La plus part du temps on met une minuscule pour éviter de confondre avec un String (ça arrive souvent ce genre de chose).


  • Administrateurs

    @'elias54':

    Les méthodes peuvent commencer par une majuscule, cela n'a pas d'importance, le code est quand même reconnu. La plus part du temps on met une minuscule pour éviter de confondre avec un String (ça arrive souvent ce genre de chose).

    Oui mais la convention de java dit que ça commence par une minuscule.

    Je veux pas être méchant, le tutoriel est bien fait mais le problème c'est que :
    http://www.minecraftforgefrance.fr/showthread.php?tid=132

    @'robin4002':

    Créer des void static et les appeler dans une autre classe, c'est du java, pas du modding forge. Je ferai peut-être une section tutoriel java, mais je suis pas sûr que ça sera super utile.

    Il y a une section java maintenant, mais créer et appeler un void, ça reste trop basique. Il suffit juste d'avoir apprit les bases de java, et c'est évidant. Personnellement, je pense pas que ça mérite un tutoriel, je laisse quand même ouvert pour avoir l'avis des autres, j'ajoute un sondage en passant.



  • @'robin4002':

    Créer des void static et les appeler dans une autre classe, c'est du java, pas du modding forge. Je ferai peut-être une section tutoriel java, mais je suis pas sûr que ça sera super utile.

    Il y a une section java maintenant, mais créer et appeler un void, ça reste trop basique. Il suffit juste d'avoir apprit les bases de java, et c'est évidant. Personnellement, je pense pas que ça mérite un tutoriel, je laisse quand même ouvert pour avoir l'avis des autres, j'ajoute un sondage en passant.

    C'est aussi pour ça que je qualifiais ce tuto "d'astuce" au début mais il n'y avais pas de section du genre donc j'ai mis dans les tutos 🙂


  • Administrateurs

    2 contre 3, malheureusement je refuse le tutoriel.


Log in to reply