3. diel - Minecraft Modding - Konvencie a SidedBlockTextures
V minulom dieli sme si pridali náš prvý item, ale my chceme viac. Teraz by som rád začal pracovať s blokmi, ale ešte predtým je nutné urobiť si nejaký poriadok vo triedenia itemov a blokov. Ospravedlňujem sa, že to nebude nič zábavného, ale v ďalších dieloch sa nám to bude veľmi hodiť.
Konvencie v blokoch a item a ich utriedenie
V minulom diele sme tvorili custom item a používali jednoduchý public konštruktor triedy Item, kde sme boli schopní nastaviť nejaké základné atribúty (napr. TextureName, UnlocalizedName) pomocou reťazenie, ale! napríklad sme vôbec neboli schopní reagovať na nejaké item eventy (napr. kliknutie s Item na niečo, pravé tlačidlo atď ....). Pokiaľ toto chceme upravovať, musíme si urobiť potomka triedy Item, u ktorého môžeme zostávajúce prázdne metódy "doimplementovat". To isté platí s Blockom, avšak tu nie je na výber, pretože konštruktor Block (Material) je protected (skrytý) a teda musíme vytvoriť potomka triedy Block, u ktorého môžeme rovno do jeho public konstruktoru doplniť atribúty ako napríklad blockName, Material, atď .. ) a preto je tu reťazenie úplne zbytočné. Teraz už k samotnej konvencii. Tieto triedy (potomkovia) sa musí samozrejme niekam uložiť a to sa vykonáva nasledujúcim spôsobom. Do rovnakého balíka, v ktorom je balík main, dáme nové balíčky, ktoré pomenujeme items a blocks. Do týchto balíčkov budeme ukladať našich potomkov tried Block a Item. Pri pomenovaní potomkov budeme dodržiavať najprv napísanie svojho predka (v našom prípade Block alebo Item) a potom jeho vlastné meno.
Pr: ItemKrumpáč, BlockTalíř, BlockPlast, ItemHodinky, ItemNozik.
Triedy BlocksManager a ItemManager
Možno vás napadlo v minulom diele, že prakticky pre každý Item musíme vyhradiť 2 riadky v Main triede, čo je veľmi neprehľadné a pri desiatkach itemov a blokov absolútne zničujúce. Z toho dôvodu je lepšie, vytvoriť triedy, ktoré budú spravovať všetky itemy a bloky a na ktoré ja budem zo svojej Main triedy volať iba ich metódy a ony sa postarajú o zvyšok. Tým pádom budem mať v Main viac miesta na konfiguráciu modu, komunikáciu s ost. Mody atď .. Triedy sa budú nachádzať v rovnakých balíčkoch, ako sú všetci potomkovia Block / Item. Budú vyzerať takto:
package com.cooble.saltmod.blocks; public class BlocksManager { public static void init(){} public static void register(){} }
A to isté aj u triedy ItemsManager. A takto budú vyzerať pri naplnení Itemy / Blocky:
public class ItemsManager { public static Item itemSul; public static Item itemNeznamy; public static void init(){ itemSul = new Item().setUnlocalizedName("sul").setTextureName("sul"); itemNeznamy = new ItemNeznamy(); } public static void register(){ GameRegistry.registerItem(itemSul,"itemSul"); GameRegistry.registerItem(itemNeznamy,"itemNeznamy"); } }
A z našej triedy Main budeme len volať metódy init () a register ():
@Mod(modid = Main.MODID, version = Main.VERSION) public class Main { public static final String MODID = "SulMod"; public static final String VERSION = "1.0"; @EventHandler public void preInit(FMLPreInitializationEvent event){ BlocksManager.init(); BlocksManager.register(); ItemsManager.init(); ItemsManager.register(); }
Tu je graf vzťahov:
A tu zložka finálne (tak to bude vyzerať na koci tohto dielu) projektu:
Block
Block je podobná trieda ako Item, avšak u nej nemôžeme použiť jej konštruktor, pretože je skrytý. A jediná možnosť, ako získať inštanciu je vytvorenie potomka tejto triedy, ktorý by materský konstrukor doplnil. A preto ak budeme chcieť vytvoriť blok musíme vždy vytvoriť triedu, ktorá dedí z Block, a teda sa môže za Block vydávať. Vytvoríme si teda novú triedu (dodržujme konvencii: BlockNázevbloku)
package com.cooble.saltmod.blocks; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; public class BlockSul extends Block { protected BlockSul() { super(Material.rock); this.setCreativeTab(CreativeTabs.tabBlock); this.setBlockName("blockSul"); this.textureName="block_sul"; } }
Teraz už stačí do BlocksManageru tento block pridať:
public class BlocksManager { public static Block blockSul; public static void init(){ blockSul = new BlockSul(); } public static void register(){ GameRegistry.registerBlock(blockSul, "blockSul"); } }
Ako som už hovoril, je zbytočné písať do BlockManageru:
blockSul = new BlockSul().setBlockName("blockSul").setNeco().atd();
pretože všetko sa strčí už do konstruktoru BlockSul ().
Textúry
Samozrejme ešte musíme strčiť do našej priečinka / src / assets / minecraft / textures / blocks obrázok "block_sul.png". (k stiahnutiu pod článkom). No a máme hotovo, block by už mal fungovať aj s textúrou.
SidedTextury
Iste ste si všimli, že na všetkých šiestich stranách je tá istá textúra, čo nám v nejakých prípadoch môže vadiť a chceli by sme napríklad hore striešku, dole dno, po stranách okienka. Založme si teda novú triedu BlockSloup (stačí len skopírovať BlockSul a premenovať) a nezampomeňme na registráciu BlockSloupu v BlocksManageru.
Najprv definujeme atribút BlockSloupu a to pole Iconek (obrázkov)
private IIcon[] textury = new IIcon[6];
6 pretože každý block má 6 strán (pochopiteľne môžeme urobiť len 2 veľké alebo 3,4,5, záleží na počte obrázkov u blocku). Potom musíme do nášho poľa uložiť IIcony, to urobíme pomocou metódy registerIcon (String NázovSúboru / obrázku napr: "block_sloup_ 0"):
@Override public void registerBlockIcons(IIconRegister register){ for (int i = 0; i < textury.length; i++) { textury[i]=register.registerIcon(this.textureName+"_"+i); } }
Týmto spôsobom sme získali všetky IIcony, ktoré budeme potrebovať. Teraz je zostáva len odovzdať Minecraftu, ktorý je vykreslí. Na to je táto metóda.
@Override public IIcon getIcon(int side, int meta) { return textury[side]; }
Táto metóda má za parametre stranu bloku (0 | 1 | 2 | 3 | 4 | 5) (0 = spodné, 1 = horná .. viď. Obrázok) a ako druhý metadáta bloku (tým sa zatiaľ nemienim zaoberať). Čiže Minecraft sa nás opýta na IIconku, ktorú má vykresliť stranu bloku, ktorú nám odovzdá ako parameter side. Tu sa nemusíme báť IndexOutOfBoundsException pretože sme vytvorili polia s dĺžkou 6 a side bude vždy len od 0 do 5.
.
package com.cooble.saltmod.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.util.IIcon; public class BlockSloup extends Block { private IIcon[] textury = new IIcon[2]; protected BlockSloup() { super(Material.rock); this.setCreativeTab(CreativeTabs.tabBlock); this.setBlockName("blockSloup"); this.textureName="block_sloup"; } @Override public IIcon getIcon(int side, int meta) { if(side==1) //pokud top return textury[1]; else return textury[0]; } @Override public void registerBlockIcons(IIconRegister register) { textury[0]=register.registerIcon(textureName+"_"+0); textury[1]=register.registerIcon(textureName+"_"+1); } }
Nakoniec je tu finálna podoba blockSloupu, zo všetkých strán až na hornej je normálne textúra soli, avšak na tope (hore) je textúra s čiernym odrážkou.
Ako fungujú IIconky
Interface IIcon sa používa v Minecraftu k dostaniu textúry bloku / Item na špecifické strane. Jediné 2 triedy implementujúce tento interface sú TextureAtlasSprite a IconFlipped. IIcon neuchováva aktuálny textúru, ale miesto na texture mape, ktorá Minecraft vytvorená vždy pri štarte hry, či zmenenie texturepacku. Táto texture mapa je vytvorená triedou TextureMap národné implementačné rozhranie IIconRegister. Texture mapa je vytvorená hneď po eventu preInit. Pri tomto tvorení Zavolá TextureMap na všetky bloky / itemy metódu registerIcons (IIconRegister), ktorá je registruje a vyberie pre nich miesto na texture mape, kam ich uloží a vráti odkaz na miesto na tej texture mape = IIcon. (V dávnych verziách Minecraftu sme tvorili rovno texture mapy, teraz je to prehľadnejšie.) Veľkosť texture mapy závisí od počtu a veľkosti textúr. Normálne má block texture mapa rozmery 256 * 256. Ak pridáme napríklad len jedinú textúru 32 * 32 TextureMap zväčší texture mapu na 512 * 512. Blok aj item majú prirodzene tiež IIcon a to v protected atribúte blockIcon / itemIcon.
Záver
Tým by som tento diel ukončil, naučili sme sa správnemu zápisu a triedenie itemov a blokov v triedach a pridali sme si 2 bloky: BlockSul a BlockSloup, ktorý na rozdiel od BlockSoli má na hornej stane čiernu bodku. Tým sme sa naučili aj nastavovanie textúr bloku z každej strany inak. Nakoniec sme si vysvetlili IIcon ky. Ak máte nejaké problémy alebo otázky, určite napíšte.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 35x (2.61 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java