zh_cn:tutorial:blockstate
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| zh_cn:tutorial:blockstate [2022/12/16 01:43] – solidblock | zh_cn:tutorial:blockstate [2025/04/01 09:21] (current) – solidblock | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== 赋予方块状态 ======= | ====== 赋予方块状态 ======= | ||
| - | Minecraft 中的每种类型的方块都由一个单独的 '' | + | Minecraft 中的每种类型的方块都由一个单独的 '' |
| - | 这就是 '' | + | ===== 方块状态属性 ===== |
| + | |||
| + | 每个方块都可以有 0 个、1 个或更多个**方块状态属性**,每个方块状态属性都可以有至少 2 个值。原版已有的属性,可以在 '' | ||
| + | |||
| + | 我们来看几个例子: | ||
| + | * [[directionalblock|制作带朝向的方块]],使用的方块状态属性是 '' | ||
| + | * [[waterloggable|制作可含水的方块]],使用的方块状态属性是 '' | ||
| + | |||
| + | ===== 自定义方块状态属性:以可充能方块为例 ===== | ||
| + | |||
| + | 假设我们希望一个方块仅在充能后能够召唤闪电。 | ||
| | | ||
| - | 首先,我们定义方块的布尔值属性——是否充能(小心不要导入错误的BooleanProperty!): | + | 首先,我们定义方块的布尔值属性——是否充能(小心不要导入错误的 |
| + | |||
| + | 如果你需要定义其他类型的属性,可以使用 '' | ||
| + | |||
| + | 先创建类: | ||
| <code java> | <code java> | ||
| public class ChargeableBlock extends Block { | public class ChargeableBlock extends Block { | ||
| public static final BooleanProperty CHARGED = BooleanProperty.of(" | public static final BooleanProperty CHARGED = BooleanProperty.of(" | ||
| - | + | | |
| - | // 方块实例。可以放在任何地方。 | + | |
| - | public static final ChargeableBlock CHARGEABLE_BLOCK = Registry.register( | + | super(settings); |
| - | | + | } |
| - | new Identifier(" | + | } |
| - | new ChargeableBlock( | + | </code> |
| + | 然后按照 [[blocks]] 中说的那样注册方块: | ||
| + | <code java> | ||
| + | public final class TutorialBlocks { | ||
| + | // 对于 1.21.2 之前的版本: | ||
| + | public static final ChargeableBlock CHARGEABLE_BLOCK = register(" | ||
| + | |||
| + | // 对于 1.21.2 以及之后的版本: | ||
| + | | ||
| + | |||
| + | // [...] | ||
| } | } | ||
| </ | </ | ||
| Line 29: | Line 53: | ||
| } | } | ||
| </ | </ | ||
| - | 然后,我们需要在方块构造器中设置属性的默认状态(要设置多个属性,请通过调用 '' | + | |
| + | 然后需要注册属性的默认状态。到刚刚创建的类的构造方块,像这样修改: | ||
| <code java> | <code java> | ||
| public class ChargeableBlock extends Block { | public class ChargeableBlock extends Block { | ||
| Line 41: | Line 66: | ||
| </ | </ | ||
| - | 现在,我们需要能够通过 '' | + | 现在,我们需要能够通过 '' |
| <code java> | <code java> | ||
| Line 47: | Line 72: | ||
| [...] | [...] | ||
| @Override | @Override | ||
| - | public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { | + | public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { |
| player.playSound(SoundEvents.BLOCK_RESPAWN_ANCHOR_CHARGE, | player.playSound(SoundEvents.BLOCK_RESPAWN_ANCHOR_CHARGE, | ||
| world.setBlockState(pos, | world.setBlockState(pos, | ||
| Line 63: | Line 88: | ||
| if (world.getBlockState(pos).get(CHARGED)){ | if (world.getBlockState(pos).get(CHARGED)){ | ||
| // 在方块的位置召唤闪电 | // 在方块的位置召唤闪电 | ||
| - | LightningEntity lightningEntity = (LightningEntity) | + | LightningEntity lightningEntity = EntityType.LIGHTNING_BOLT.create(world, SpawnReason.MOB_SUMMONED); |
| lightningEntity.refreshPositionAfterTeleport(Vec3d.ofBottomCenter(pos)); | lightningEntity.refreshPositionAfterTeleport(Vec3d.ofBottomCenter(pos)); | ||
| world.spawnEntity(lightningEntity); | world.spawnEntity(lightningEntity); | ||
| Line 74: | Line 99: | ||
| </ | </ | ||
| - | ==== 为方块状态添加模型 ==== | + | ==== 为方块状态添加模型和方块状态映射 |
| - | 你可能还需要使得纹理和模型能够根据状态来改变,这是通过一个叫做“方块状态 | + | 你可能还需要使得纹理和模型能够根据状态来改变,这是通过一个叫做“**方块状态映射**(block states definitions)”的 JSON 来完成的。所有的方块都需要一个方块状态映射,无论它是否有多个方块状态,但其内容可以简单也可以复杂。如果需要根据方块状态来改变纹理,我们需要添加多个模型。 |
| - | 比如说,你为 '' | + | 比如说,你为 '' |
| <code JavaScript resources/ | <code JavaScript resources/ | ||
| { | { | ||
| - | | + | " |
| - | | + | "": |
| - | "": | + | |
| - | | + | |
| } | } | ||
| - | |||
| } | } | ||
| </ | </ | ||
| + | |||
| 让我们分解一下这个简单的例子。JSON 有几个重要的部分: | 让我们分解一下这个简单的例子。JSON 有几个重要的部分: | ||
| - | - ''" | + | * The '' |
| - | - 名为 ''""'' | + | |
| - | - 分配给 ''""'' | + | |
| - | - ''" | + | |
| 如果// | 如果// | ||
| <code JavaScript resources/ | <code JavaScript resources/ | ||
| - | | + | { |
| - | " | + | " |
| - | " | + | " |
| - | " | + | " |
| - | | + | |
| } | } | ||
| + | } | ||
| </ | </ | ||
| - | 在此 | + | 在此方块状态映射中,有两个变种,一种针对我们上面定义的 '' |
| 变种基于添加到方块中的属性的可能排列。如果需要,可以在方块状态 JSON 中完全忽略某个属性,例如在第一个方块状态 JSON 中我们忽略了 '' | 变种基于添加到方块中的属性的可能排列。如果需要,可以在方块状态 JSON 中完全忽略某个属性,例如在第一个方块状态 JSON 中我们忽略了 '' | ||
| - | 这只是对方块状态 | + | 这只是对方块状态映射的简单介绍。[[https:// |
| - | ==== 关于性能的注意事项 ==== | + | ===== 关于性能的注意事项 |
| - | 游戏开始时会注册方块的所有可能状态。这意味着,如果具有14个布尔属性,则该方块具有2 ^ 14 = 16384个不同的状态,并且会注册这2 ^ 14个状态。因此,方块不应包含太多的方块状态属性。相反,方块状态应主要保留用于视觉效果,需要使用更高级的状态应使用[[zh_cn: | + | 游戏开始时会注册方块的所有可能状态。这意味着,如果具有14个布尔属性,则该方块具有2 ^ 14 = 16384个不同的状态,并且会注册这2 ^ 14个状态。因此,方块不应包含太多的方块状态属性。相反,方块状态应主要保留用于视觉效果,需要使用更高级的状态应使用[[blockentity|方块实体]]。 |
| 由于所有的可能的方块状态都已经构建好了,因此相等的方块状态是同一个对象,'' | 由于所有的可能的方块状态都已经构建好了,因此相等的方块状态是同一个对象,'' | ||
zh_cn/tutorial/blockstate.1671155004.txt.gz · Last modified: 2022/12/16 01:43 by solidblock