zh_cn:tutorial:directionalblock
Table of Contents
制作带朝向的方块
使方块带有方向(朝向特定的方向)也是通过方块状态完成的。这个例子介绍了垂直版的安山岩台阶。
- VerticalSlabBlock.java
public class VerticalSlabBlock extends HorizontalFacingBlock { // codec 从 1.20.5 开始是必需的,但是还没有在 Minecraft 中实际使用。 public static final MapCodec<VerticalSlabBlock> CODEC = Block.createCodec(VerticalSlabBlock::new); public VerticalSlabBlock(Settings settings) { super(settings); setDefaultState(getDefaultState().with(Properties.HORIZONTAL_FACING, Direction.NORTH)); } @Override protected MapCodec<? extends VerticalSlabBlock> getCodec() { return CODEC; } @Override protected void appendProperties(StateManager.Builder<Block, BlockState> builder) { builder.add(Properties.HORIZONTAL_FACING); } @Override public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext ctx) { Direction dir = state.get(FACING); return switch (dir) { case NORTH -> VoxelShapes.cuboid(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f); case SOUTH -> VoxelShapes.cuboid(0.0f, 0.0f, 0.5f, 1.0f, 1.0f, 1.0f); case EAST -> VoxelShapes.cuboid(0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); case WEST -> VoxelShapes.cuboid(0.0f, 0.0f, 0.0f, 0.5f, 1.0f, 1.0f); default -> VoxelShapes.fullCube(); }; } @Override public BlockState getPlacementState(ItemPlacementContext ctx) { return super.getPlacementState(ctx).with(Properties.HORIZONTAL_FACING, ctx.getHorizontalPlayerFacing().getOpposite()); } }
然后按照在 blocks 中提到的方法,注册方块:
- TutorialBlocks.java
public final class TutorialBlocks implements ModInitializer { [...] public static final VerticalSlabBlock POLISHED_ANDESITE_VERTICAL_SLAB = register("polished_andesite_vertical_slab", new VerticalSlabBlock(Block.Settings.copy(Blocks.POLISHED_ANDESITE))); }
定义方块状态 JSON
- src/main/resources/assets/tutorial/blockstates/polished_andesite_vertical_slab.json
{ "variants": { "facing=north": { "model": "tutorial:block/polished_andesite_vertical_slab", "uvlock": true }, "facing=east": { "model": "tutorial:block/polished_andesite_vertical_slab", "y": 90, "uvlock": true }, "facing=south": { "model": "tutorial:block/polished_andesite_vertical_slab", "y": 180, "uvlock": true }, "facing=west": { "model": "tutorial:block/polished_andesite_vertical_slab", "y": 270, "uvlock": true } } }
定义方块模型
- src/main/resources/assets/tutorial/models/block/vertical_slab.json
{ "parent": "block/block", "textures": { "particle": "#side" }, "elements": [ { "from": [ 0, 0, 0 ], "to": [ 16, 16, 8 ], "faces": { "down": { "texture": "#bottom", "cullface": "down" }, "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "south" }, "west": { "texture": "#side", "cullface": "west" }, "east": { "texture": "#side", "cullface": "east" } } } ] }
- src/main/resources/assets/tutorial/models/block/polished_andesite_vertical_slab.json
{ "parent": "tutorial:block/vertical_slab", "textures": { "bottom": "block/polished_andesite", "top": "block/polished_andesite", "side": "block/polished_andesite" } }
定义方块的旋转和翻转
对于带有朝向的方块,你需要覆盖 rotate
和 mirror
方法,这样在结构方块中可以正确地被旋转或者翻转。不过,在这个例子中,HorizontalFacingBlock
类已经帮你做好了。
下一步
尝试让它可含水
zh_cn/tutorial/directionalblock.txt · Last modified: 2024/08/26 01:28 by solidblock