(同じ利用者による、間の3版が非表示) | |||
2行目: | 2行目: | ||
==SpriteID無限化(独自のterrain.png, gui/items.pngの利用)== | ==SpriteID無限化(独自のterrain.png, gui/items.pngの利用)== | ||
− | + | <p> | |
− | また, 独自のterrain.png, items.pngにも名前の制限はない. しかしテクスチャのサイズは256ドット×256ドットである. これは16ドット×16ドットのテクスチャが16×16個まとまっているものである. | + | 今までのサンプルではバニラのテクスチャを参照していた. ブロックはterrain.png, アイテムはgui/items.pngだった. ModLoaderにおけるaddOverrideというメソッドはこれらの空き領域に対し16*16のテクスチャを上書きし, そのテクスチャのインデックスを返すものだったため, 空き領域が埋まるとMinecraftがクラッシュしてしまう. この問題を解決するためにforgeではブロックやアイテムが参照するテクスチャを切り替える機構が用意された. なおこのサンプルでは'''プロキシシステム'''を利用する. |
− | 今回サンプルに作成したテクスチャは以下の2つ.< | + | </p> |
− | *[[メディア:SpriteSampleBlocks.png]] | + | <p> |
− | *[[メディア:SpriteSampleItems.png]] | + | また, 独自のterrain.png, items.pngにも名前の制限はない. しかしテクスチャのサイズは256ドット×256ドットである. これは16ドット×16ドットのテクスチャが16×16個まとまっているものである. 今回サンプルに作成したテクスチャは以下の2つ. |
+ | </p> | ||
+ | *[[メディア:SpriteSampleBlocks.png]] | ||
+ | *[[メディア:SpriteSampleItems.png]] | ||
===フォルダ構造=== | ===フォルダ構造=== | ||
206行目: | 209行目: | ||
==解説== | ==解説== | ||
− | + | <p> | |
+ | [[Forge式コンフィグファイルの利用]]同様, 既に解説した箇所の解説は省略する. | ||
+ | </p> | ||
− | + | ===SpriteSampleCoreクラス=== | |
− | === | ||
<source lang = "java"> | <source lang = "java"> | ||
import cpw.mods.fml.common.SidedProxy; | import cpw.mods.fml.common.SidedProxy; | ||
</source> | </source> | ||
− | + | <blockquote> | |
− | < | + | プロキシシステムを使うためのアノテーション. |
+ | </blockquote> | ||
+ | |||
<source lang = "java"> | <source lang = "java"> | ||
220行目: | 226行目: | ||
public static CommonProxy proxy; | public static CommonProxy proxy; | ||
</source> | </source> | ||
− | + | <blockquote> | |
− | < | + | @SidedProxyの引数でクライアント側とサーバー側のクラスを指定する. この指定はフルパスでなければならない. |
+ | </blockquote> | ||
+ | |||
<source lang = "java"> | <source lang = "java"> | ||
proxy.registerTextures(); | proxy.registerTextures(); | ||
</source> | </source> | ||
− | + | <blockquote> | |
− | < | + | プロキシのインスタンスを通してテクスチャの登録を行う. この1行はクライアント側でもサーバー側でも実行されるが, それぞれの実装はClientProxy, CommonProxyで異なる. |
+ | </blockquote> | ||
− | === | + | |
+ | ===BlockSpriteSampleクラスのgetTextureFileメソッド=== | ||
<source lang = "java"> | <source lang = "java"> | ||
public String getTextureFile() | public String getTextureFile() | ||
236行目: | 246行目: | ||
} | } | ||
</source> | </source> | ||
− | + | <blockquote> | |
+ | 参照したいテクスチャファイルのパスを返す. この時テクスチャ自体はmcroot/bin/minecraft/mods/spritesフォルダにあることになる. | ||
+ | </blockquote> | ||
− | === | + | |
+ | ===ItemSpriteSampleクラスのgetTextureFileメソッド=== | ||
<source lang = "java"> | <source lang = "java"> | ||
public String getTextureFile() | public String getTextureFile() | ||
245行目: | 258行目: | ||
} | } | ||
</source> | </source> | ||
− | + | <blockquote> | |
+ | ブロックの場合と同様. アイテムのテクスチャファイルのパスを返す. | ||
+ | </blockquote> | ||
− | === | + | |
+ | ===CommonProxyクラス=== | ||
<source lang = "java"> | <source lang = "java"> | ||
public void registerTextures() | public void registerTextures() | ||
254行目: | 270行目: | ||
} | } | ||
</source> | </source> | ||
− | + | <blockquote> | |
+ | サーバー側, CommonProxyでは何もしないが, ClientProxyでオーバーライドして使うために空のメソッドを定義している. | ||
+ | </blockquote> | ||
− | === | + | |
+ | ===ClientProxyクラス=== | ||
<source lang = "java"> | <source lang = "java"> | ||
package mods.spritesample.client; | package mods.spritesample.client; | ||
</source> | </source> | ||
− | + | <blockquote> | |
− | < | + | クライアント専用のクラスは全てmods/spritesample/clientフォルダに入れることで, どのクラスがクライアント専用なのかをはっきりさせる. 必要ないなら同じパッケージでよい. |
+ | </blockquote> | ||
+ | |||
<source lang = "java"> | <source lang = "java"> | ||
import net.minecraftforge.client.MinecraftForgeClient; | import net.minecraftforge.client.MinecraftForgeClient; | ||
</source> | </source> | ||
− | + | <blockquote> | |
− | < | + | MinecraftForgeAPIのうちクライアント側のみの機能を提供するクラス. |
+ | </blockquote> | ||
+ | |||
<source lang = "java"> | <source lang = "java"> | ||
273行目: | 296行目: | ||
import cpw.mods.fml.common.asm.SideOnly; | import cpw.mods.fml.common.asm.SideOnly; | ||
</source> | </source> | ||
− | + | <blockquote> | |
− | < | + | [[新しいコーディング記法とUniversal Modding]]で触れたアノテーション. 共通でない(≒クライアント専用, サーバー専用)クラスやメソッドにつける. |
+ | </blockquote> | ||
+ | |||
<source lang = "java"> | <source lang = "java"> | ||
import mods.spritesample.CommonProxy; | import mods.spritesample.CommonProxy; | ||
</source> | </source> | ||
− | + | <blockquote> | |
− | < | + | CommonProxyとはパッケージが異なるのでインポートしておく. |
+ | </blockquote> | ||
+ | |||
<source lang = "java"> | <source lang = "java"> | ||
286行目: | 313行目: | ||
public class ClientProxy extends CommonProxy | public class ClientProxy extends CommonProxy | ||
</source> | </source> | ||
− | + | <blockquote> | |
− | < | + | ClientProxyに@SideOnlyアノテーションを付与している. またClientProxyはCommonProxyを継承している. |
+ | </blockquote> | ||
+ | |||
<source lang = "java"> | <source lang = "java"> | ||
297行目: | 326行目: | ||
} | } | ||
</source> | </source> | ||
− | + | <blockquote> | |
+ | CommonProxyで定義したメソッドをオーバーライドする. preloadTextureは引数のパスで指定した画像ファイルをキャッシュに読み込むメソッド. ここで指定する引数は上記のBlockSpriteSampleクラスとItemSpriteSampleクラスで記述したファイルパスと同じにする. | ||
+ | </blockquote> | ||
+ | |||
==実際の挙動== | ==実際の挙動== | ||
+ | <p> | ||
今回の挙動も今までのサンプルとは大差ない. しかし, blocks.pngやitems.pngの左上の16*16のテクスチャを変更したり, コード内のterrainIdやsetIconCoordを変更するとそれに応じてテクスチャも変更される. | 今回の挙動も今までのサンプルとは大差ない. しかし, blocks.pngやitems.pngの左上の16*16のテクスチャを変更したり, コード内のterrainIdやsetIconCoordを変更するとそれに応じてテクスチャも変更される. | ||
+ | </p> |
2012年10月24日 (水) 17:05時点における最新版
この記事は"Minecraft Forge4.3x"を前提MODとしています。 |
目次
SpriteID無限化(独自のterrain.png, gui/items.pngの利用)[編集]
今までのサンプルではバニラのテクスチャを参照していた. ブロックはterrain.png, アイテムはgui/items.pngだった. ModLoaderにおけるaddOverrideというメソッドはこれらの空き領域に対し16*16のテクスチャを上書きし, そのテクスチャのインデックスを返すものだったため, 空き領域が埋まるとMinecraftがクラッシュしてしまう. この問題を解決するためにforgeではブロックやアイテムが参照するテクスチャを切り替える機構が用意された. なおこのサンプルではプロキシシステムを利用する.
また, 独自のterrain.png, items.pngにも名前の制限はない. しかしテクスチャのサイズは256ドット×256ドットである. これは16ドット×16ドットのテクスチャが16×16個まとまっているものである. 今回サンプルに作成したテクスチャは以下の2つ.
フォルダ構造[編集]
ソースコード
- /mcroot/src/common/mods/spritesample
- SpriteSampleCore.java
- BlockSpriteSample.java
- ItemSpriteSample.java
- CommonProxy.java
- /client
- ClientProxy
テクスチャ
- mcroot/bin/minecraft/mods/sprites
- SpriteSampleBlocks.png
- SpriteSampleItems.png
ソースコード[編集]
- SpriteSampleCore
package mods.spritesample; import java.util.logging.Level; import net.minecraft.src.*; import net.minecraftforge.common.Configuration; import net.minecraftforge.common.Property; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.network.NetworkMod; 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 = "SpriteSampleMod", name = "Sprite Sample Mod", version = "1.0.0" ) @NetworkMod( clientSideRequired = true, serverSideRequired = false ) public class SpriteSampleCore { @SidedProxy(clientSide = "mods.spritesample.client.ClientProxy", serverSide = "mods.spritesample.CommonProxy") public static CommonProxy proxy; public static Block blockSpriteSample; public static Item itemSpriteSample; public int blockIdSpriteSample; public int itemIdSpriteSample; @Mod.PreInit public void preInit(FMLPreInitializationEvent event) { Configuration cfg = new Configuration(event.getSuggestedConfigurationFile()); try { cfg.load(); Property blockProp = cfg.getBlock("SpriteSampleBlock", 1302); Property itemProp = cfg.getItem("SpriteSampleItem", 4002); blockProp.comment = "This comment is Block Property"; itemProp.comment = "This comment is Item Property"; blockIdSpriteSample = blockProp.getInt(); itemIdSpriteSample = itemProp.getInt(); } catch (Exception e) { FMLLog.log(Level.SEVERE, e, "Error Message"); } finally { cfg.save(); } } @Mod.Init public void init(FMLInitializationEvent event) { blockSpriteSample = (new BlockSpriteSample(blockIdSpriteSample, 0)).setBlockName("spritesampleblock").setCreativeTab(CreativeTabs.tabBlock); itemSpriteSample = (new ItemSpriteSample(itemIdSpriteSample)).setIconCoord(0, 0).setItemName("spritesampleitem").setCreativeTab(CreativeTabs.tabMaterials); GameRegistry.registerBlock(blockSpriteSample); LanguageRegistry.addName(blockSpriteSample, "Sprite Sample Block"); LanguageRegistry.instance().addNameForObject(blockSpriteSample, "ja_JP", "スプライトサンプルブロック"); LanguageRegistry.addName(itemSpriteSample, "Sprite Sample Item"); LanguageRegistry.instance().addNameForObject(itemSpriteSample, "ja_JP", "スプライトサンプルアイテム"); GameRegistry.addShapelessRecipe( new ItemStack(itemSpriteSample, 1), new Object[] { Block.stone }); GameRegistry.addShapelessRecipe( new ItemStack(blockSpriteSample, 1), new Object[] { Block.stone, Block.stone }); proxy.registerTextures(); } }
- BlockSpriteSample
package mods.spritesample; import net.minecraft.src.*; public class BlockSpriteSample extends Block { public BlockSpriteSample(int blockId, int terrainId) { super(blockId, terrainId, Material.wood); } @Override public String getTextureFile() { return "/mods/sprites/SpriteSampleBlocks.png"; } }
- ItemSpriteSample
package mods.spritesample; import net.minecraft.src.*; public class ItemSpriteSample extends Item { public ItemSpriteSample(int itemId) { super(itemId); } @Override public String getTextureFile() { return "/mods/sprites/SpriteSampleItems.png"; } }
- CommonProxy
package mods.spritesample; import net.minecraft.src.*; public class CommonProxy { public void registerTextures() { //何もしない } }
- ClientProxy
package mods.spritesample.client; import net.minecraft.src.*; import net.minecraftforge.client.MinecraftForgeClient; import cpw.mods.fml.common.Side; import cpw.mods.fml.common.asm.SideOnly; import mods.spritesample.CommonProxy; @SideOnly(Side.CLIENT) public class ClientProxy extends CommonProxy { @Override public void registerTextures() { MinecraftForgeClient.preloadTexture("/mods/sprites/SpriteSampleBlocks.png"); MinecraftForgeClient.preloadTexture("/mods/sprites/SpriteSampleItems.png"); } }
解説[編集]
Forge式コンフィグファイルの利用同様, 既に解説した箇所の解説は省略する.
SpriteSampleCoreクラス[編集]
import cpw.mods.fml.common.SidedProxy;
プロキシシステムを使うためのアノテーション.
@SidedProxy(clientSide = "mods.spritesample.client.ClientProxy", serverSide = "mods.spritesample.CommonProxy") public static CommonProxy proxy;
@SidedProxyの引数でクライアント側とサーバー側のクラスを指定する. この指定はフルパスでなければならない.
proxy.registerTextures();
プロキシのインスタンスを通してテクスチャの登録を行う. この1行はクライアント側でもサーバー側でも実行されるが, それぞれの実装はClientProxy, CommonProxyで異なる.
BlockSpriteSampleクラスのgetTextureFileメソッド[編集]
public String getTextureFile() { return "/mods/sprites/SpriteSampleBlocks.png"; }
参照したいテクスチャファイルのパスを返す. この時テクスチャ自体はmcroot/bin/minecraft/mods/spritesフォルダにあることになる.
ItemSpriteSampleクラスのgetTextureFileメソッド[編集]
public String getTextureFile() { return "/mods/sprites/SpriteSampleItems.png"; }
ブロックの場合と同様. アイテムのテクスチャファイルのパスを返す.
CommonProxyクラス[編集]
public void registerTextures() { //何もしない }
サーバー側, CommonProxyでは何もしないが, ClientProxyでオーバーライドして使うために空のメソッドを定義している.
ClientProxyクラス[編集]
package mods.spritesample.client;
クライアント専用のクラスは全てmods/spritesample/clientフォルダに入れることで, どのクラスがクライアント専用なのかをはっきりさせる. 必要ないなら同じパッケージでよい.
import net.minecraftforge.client.MinecraftForgeClient;
MinecraftForgeAPIのうちクライアント側のみの機能を提供するクラス.
import cpw.mods.fml.common.Side; import cpw.mods.fml.common.asm.SideOnly;
新しいコーディング記法とUniversal Moddingで触れたアノテーション. 共通でない(≒クライアント専用, サーバー専用)クラスやメソッドにつける.
import mods.spritesample.CommonProxy;
CommonProxyとはパッケージが異なるのでインポートしておく.
@SideOnly(Side.CLIENT) public class ClientProxy extends CommonProxy
ClientProxyに@SideOnlyアノテーションを付与している. またClientProxyはCommonProxyを継承している.
@Override public void registerTextures() { MinecraftForgeClient.preloadTexture("/mods/sprites/SpriteSampleBlocks.png"); MinecraftForgeClient.preloadTexture("/mods/sprites/SpriteSampleItems.png"); }
CommonProxyで定義したメソッドをオーバーライドする. preloadTextureは引数のパスで指定した画像ファイルをキャッシュに読み込むメソッド. ここで指定する引数は上記のBlockSpriteSampleクラスとItemSpriteSampleクラスで記述したファイルパスと同じにする.
実際の挙動[編集]
今回の挙動も今までのサンプルとは大差ない. しかし, blocks.pngやitems.pngの左上の16*16のテクスチャを変更したり, コード内のterrainIdやsetIconCoordを変更するとそれに応じてテクスチャも変更される.