[1.7.2]有多面Block的面向方向问题

By | 2014年10月29日

假定:IIcon:方块所有面默认为blockIcon,方块正面为blockIconFront,方块顶面为blockIconTop;假设你的方块在放置时已经按照源码中熔炉的方式设定好放置的正面Metadata。

在Google上找到的Block贴图教程基本就只告诉你怎么在世界中生成的Block贴图,但是当你做的时候就发现你设定好的贴图在世界中虽然是按照你设定的正确贴上了,但是在你的物品栏中却是正面反面傻傻分不清楚。

在教程中无一例外的都提到了通过getIcon方法取得贴图,其中的参数就是side(要取得的面)和meta(方块的Metadata),这个方法在世界中是可行的,能正确返回Metadata,通过Metadata我们可以判断到底哪一面需要显示成正面。但是在玩家的物品栏中,Metadata是不返回正确值的,所以我们无从得知到底哪一面需要显示为正面。

这时需要和另外一个函数配合使用:getBlockTexture,这个函数是当方块在世界中系统需要获取方块贴图时回调的函数,如果这个方法没有复写,系统才会调用getIcon,这个方法返回的值为IBlockAccess(可以理解为World), x, y, z, side。

复写这个方法

@SideOnly(Side.CLIENT)
public IIcon getBlockTexture(IBlockAccess par1IBlockAccess, int x, int y, int z, int side)
{
int meta = par1IBlockAccess.getBlockMetadata(x, y, z);
return side == 1 ? this.blockIconTop : (side == 0 ? this.blockIconTop : (side != meta ? this.blockIcon : this.blockIconFront));
}

这个方法是通过IBlockAccess取得当前位置的Block的Metadata,然后根据Metadata决定返回的面是否为正面。用了这个函数之后还需要修改一下原来的getIcon

@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta)
{
if (side == 4 && meta == 0)
return blockIconFront;
if (side == 1)
return blockIconTop;
if (meta == -1 || side == meta)
return blockIconFront;
return blockIcon;
}

将原来的side != meta改为side != 3,3在玩家物品栏中为正面的位置,让side == 3的时候返回正面贴图即可,由于重写了getBlockTexture,所以在这里的getIcon并不会对世界中显示的方块造成什么影响

参考资料:http://www.minecraftforge.net/forum/index.php/topic,14997.msg76268.html#msg76268

转载请注明出处 http://www.windworkshop.net/?p=11

本文链接地址:https://blog.windworkshop.net/?p=11 »文章允许转载 ,转载请注明出处,谢谢。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据