提供: Minecraft Modding Wiki
移動先: 案内検索

この記事は"Minecraft Forge Universal"を前提MODとしています。

Stone pickaxe.png
中級者向けのチュートリアルです。
C none.png
Renderに関係のあるチュートリアルです。
C block.png
Blockに関係のあるチュートリアルです。
C item.png
Itemに関係のあるチュートリアルです。

1.7での独自Renderの追加

ここでは1.7での独自Renderの追加と、その適用方法について解説する。

  • core.java
package SampleRender;

import省略

@Mod(modid=core.MODID, name=core.MODNAME, version=core.VERSION)
public class core {

	public static final String MODID = "core";
	public static final String MODNAME = "core";
	public static final String VERSION = "0.1";
        
        //RenderIDの登録
        public static int RenderID;

        @EventHandler
	   public void preInit(FMLPreInitializationEvent event){}

        @EventHandler
	   public void init(FMLInitializationEvent event) {
         
        //RenderIDを自動で割り振っている
	this.RenderID = RenderingRegistry.getNextAvailableRenderId();
        //レンダーを指定する
	RenderingRegistry.registerBlockHandler(new Samplerender());
  • Samplerender.java
package SampleRender;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.world.IBlockAccess;

public class Samplerender implements ISimpleBlockRenderingHandler
{

        /**インベントリ内のレンダリング,難解なためパスしてもよい**/
	@Override
	public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
        {
                RendererInventory.renderBlockInventory(block,renderer,metadata,0.2f,0.2f,0.2f,0.8f,0.8f,0.8f);
                RendererInventory.renderBlockInventory(block,renderer,metadata,0.4f,0.0f,0.4f,0.6f,1.0f,0.6f);
        }

@Override
	public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
	{
		if (modelId == this.getRenderId())
		{
			
			//(始X, 始Y, 始Z, 終X, 終Y, 終Z)の順
			renderer.setRenderBounds(0.2D, 0.2D, 0.2D, 0.8D, 0.8D, 0.8D);
			/*ここを別のものにすることで、複雑な形を作ることができる*/
			renderer.renderStandardBlock(block, x, y, z);

			renderer.setRenderBounds(0.4D, 0.4D, 0.0D, 0.6D, 1.0D, 0.6D);
			renderer.renderStandardBlock(block, x, y, z);
			return true;
		}
		return false;
      }
	@Override
	/**インベントリ内でレンダリングするか
    renderInventoryBlockが空の場合はfalseでよい**/
	public boolean shouldRender3DInInventory(int modelId) {
		return true;
	}

	/**自らのRenderIDをreturnする**/
	@Override
	public int getRenderId() {

		return core.RenderID;
	}
        
        /**インベントリ内のレンダー用関数**/
        public static void renderBlockInventory(Block block , RenderBlocks renderer , int metadata , double x1 , double y1 , double z1 ,double x2,double y2,double z2 )
    {
		renderer.setRenderBounds(x1, y1, z1, x2, y2, z2);
		Tessellator tessellator = Tessellator.instance;
		//描画位置の調整
		GL11.glTranslatef(-0.5F, -0.5F, -0.5F);

        //Y軸負の方向に長方形を描画
                //描画開始
		tessellator.startDrawingQuads();
		tessellator.setNormal(0.0F, -1.0F, 0.0F);
                //描画設定
		renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, metadata));
                //描画
		tessellator.draw();
                /*上4処理をそれぞれの面ごとに行っている*/

                //Y軸正の方向
		tessellator.startDrawingQuads();
		tessellator.setNormal(0.0F, 1.0F, 0.0F);
		renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, metadata));
		tessellator.draw();
                //Z軸負の方向
		tessellator.startDrawingQuads();
		tessellator.setNormal(0.0F, 0.0F, -1.0F);
		renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, metadata));
		tessellator.draw();
                //Z軸正の方向
		tessellator.startDrawingQuads();
		tessellator.setNormal(0.0F, 0.0F, 1.0F);
		renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, metadata));
		tessellator.draw();
                //X軸負の方向
		tessellator.startDrawingQuads();
		tessellator.setNormal(-1.0F, 0.0F, 0.0F);
		renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, metadata));
		tessellator.draw();
                //X軸正の方向
		tessellator.startDrawingQuads();
		tessellator.setNormal(1.0F, 0.0F, 0.0F);
		renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, metadata));
		tessellator.draw();
                //リセット
		GL11.glTranslatef(0.5F, 0.5F, 0.5F);
		renderer.setRenderBounds(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D);
	}

}

Renderの適用

  • ブロッククラスに以下のコードを追加する
@Override
	public int getRenderType()
	{
		return core.RenderID;
	}

これだけ。
getRenderTypeでRenderIDをreturnしている。

  • 必要に応じて
//指定されたside面を描画するかどうか
    @SideOnly(Side.CLIENT)
    public boolean shouldSideBeRendered(IBlockAccess p_149646_1_, int p_149646_2_, int p_149646_3_, int p_149646_4_, int p_149646_5_)
    {
        return true;
    }

    //通常の正方形ブロックのように描画するかどうか
    public boolean renderAsNormalBlock()
    {
        return false;
    }

    //透明なブロックかどうか
    public boolean isOpaqueCube()
    {
        return false;
    }

などを入れる。