zh_cn:tutorial:blockentityrenderers
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| zh_cn:tutorial:blockentityrenderers [2023/08/29 10:31] – [例子] wjz_p | zh_cn:tutorial:blockentityrenderers [2024/08/27 04:42] (current) – solidblock | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== 使用方块实体渲染器动态渲染方块和物品 ====== | ====== 使用方块实体渲染器动态渲染方块和物品 ====== | ||
| - | // | + | // |
| - | 这是本教程的 1.15 以上版本。对于 1.14 版本,请参见[[zh_cn:tutorial: | + | |
| 阅读本教程之前,请确保您已[[blockentity|添加方块实体]]! | 阅读本教程之前,请确保您已[[blockentity|添加方块实体]]! | ||
| ===== 介绍 ===== | ===== 介绍 ===== | ||
| - | 方块本身并不是那么有趣,只是在某个位置和某个大小保持静止直到损坏。我们可以使用方块实体渲染器(block entity renderer)更加动态地渲染与方块实体有关的物品和方块——在不同的位置、以不同的大小渲染多个物品。 | + | 方块本身并不是那么有趣,只是在某个位置和某个大小保持静止直到损坏。我们可以使用**方块实体渲染器**(block entity renderer)更加动态地渲染与方块实体有关的物品和方块——在不同的位置、以不同的大小渲染多个物品。 |
| ===== 例子 ===== | ===== 例子 ===== | ||
| 在本教程中,我们将通过向其添加 '' | 在本教程中,我们将通过向其添加 '' | ||
| Line 24: | Line 23: | ||
| </ | </ | ||
| - | 我们将需要注册我们的 '' | + | 我们将需要注册我们的 '' |
| - | + | ||
| - | 在实现 '' | + | |
| + | 在实现了 '' | ||
| <code java> | <code java> | ||
| @Environment(EnvType.CLIENT) | @Environment(EnvType.CLIENT) | ||
| Line 37: | Line 35: | ||
| } | } | ||
| </ | </ | ||
| - | 将此类设置为 | + | 将此类设置为 |
| <code javascript " | <code javascript " | ||
| - | " | + | { |
| + | [...] | ||
| + | | ||
| [...] | [...] | ||
| " | " | ||
| Line 46: | Line 46: | ||
| } | } | ||
| ] | ] | ||
| + | }, | ||
| + | [...] | ||
| } | } | ||
| </ | </ | ||
| - | 在我们的 ClientModInitializer 中注册 '' | + | 在我们的 |
| <code java> | <code java> | ||
| Line 55: | Line 57: | ||
| public void onInitializeClient() { | public void onInitializeClient() { | ||
| BlockEntityRendererRegistry.register(DEMO_BLOCK_ENTITY, | BlockEntityRendererRegistry.register(DEMO_BLOCK_ENTITY, | ||
| - | // | + | // 旧版本如果不行就试试这个: |
| + | // BlockEntityRendererRegistry.INSTANCE.register(DEMO_BLOCK_ENTITY, | ||
| } | } | ||
| </ | </ | ||
| - | 我们重写在每一帧都会被调用的 '' | + | 我们重写在每一帧都会被调用的 '' |
| <code java> | <code java> | ||
| Line 65: | Line 68: | ||
| } | } | ||
| </ | </ | ||
| - | 然后,我们对唱片机进行平移(matrices.translate)和旋转(matrices.multiply)。平移分为两部分:将其平移到高于方块中心的 0.5、1.25 和 0.5。第二部分是变化的部分:y 值的偏移量。偏移量是任何给定帧的物品高度。每次我们都要重新计算,因为我们希望它可以动画上下跳跃。我们通过以下方式计算: | + | 然后,我们对唱片机进行平移('' |
| | | ||
| | | ||
| Line 83: | Line 86: | ||
| } | } | ||
| </ | </ | ||
| - | 最后,我们将获得 Minecraft 的 '' | + | 最后,我们将获得 Minecraft 的 '' |
| <code java> | <code java> | ||
| public void render(DemoBlockEntity blockEntity, | public void render(DemoBlockEntity blockEntity, | ||
| [...] | [...] | ||
| - | MinecraftClient.getInstance().getItemRenderer().renderItem(stack, | + | MinecraftClient.getInstance().getItemRenderer().renderItem(stack, |
| // GL 调用之后的必要调用 | // GL 调用之后的必要调用 | ||
| Line 94: | Line 97: | ||
| </ | </ | ||
| - | 您现在就可以尝试新创建的方块实体渲染器。但是,如果您没有使方块透明,您会发现有些不对劲——这个浮动的方块,即唱片机,是黑色的!这是因为默认情况下,// | + | 现在就可以尝试新创建的方块实体渲染器。但是,如果您没有使方块透明,您会发现有些不对劲——这个浮动的方块,即唱片机,是黑色的!这是因为默认情况下,// |
| 要获取光照,我们在方块实体上方的位置调用 '' | 要获取光照,我们在方块实体上方的位置调用 '' | ||
| Line 103: | Line 106: | ||
| | | ||
| int lightAbove = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), | int lightAbove = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), | ||
| - | MinecraftClient.getInstance().getItemRenderer().renderItem(stack, | + | MinecraftClient.getInstance().getItemRenderer().renderItem(stack, |
| | | ||
| [...] | [...] | ||
| Line 112: | Line 115: | ||
| ===== 根据方块实体数据进行渲染 ===== | ===== 根据方块实体数据进行渲染 ===== | ||
| - | 有时候你需要根据方块实体的数据(nbt)进行渲染,结果发现这些数据全是空的,尽管通过 ''/ | + | 有时候你需要根据方块实体的数据(nbt)进行渲染,结果发现这些数据全是空的,尽管通过 ''/ |
zh_cn/tutorial/blockentityrenderers.1693305084.txt.gz · Last modified: 2023/08/29 10:31 by wjz_p