User Tools

Site Tools


zh_cn:tutorial:blockentityrenderers

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
zh_cn:tutorial:blockentityrenderers [2019/12/19 10:14] lightcolourzh_cn:tutorial:blockentityrenderers [2021/05/18 05:18] – [例子] solidblock
Line 1: Line 1:
-====== 渲染动态使用方块实体渲染器方块和物品 ======+====== 使用方块实体渲染器动态渲染方块和物品 ====== 
 +// 
 +这是本教程的1.15版本。 对于1.14版本,请参见[[zh_cn:tutorial:1.14:blockentityrenderers|使用方块实体渲染器动态渲染方块和物品(1.14)]]。//
  
-这是本教程的1.15版本。 对于1.14版本,请参见[[tutorial:1.14:blockentityrenderers |使用方块实体渲染器动态渲染块和项目(1.14)]]。 +阅读本教程之前,请确保您已[[zh_cn:tutorial:blockentity|添加方块实体]]!
- +
-阅读本教程之前,请确保您已[[tutorial:blockentity |添加方块实体]]! +
 ===== 介绍 ===== ===== 介绍 =====
 方块本身并不是那么有趣, 方块本身并不是那么有趣,
Line 10: Line 10:
 在不同的位置和大小,甚至更多。  在不同的位置和大小,甚至更多。 
 ===== 例子 ===== ===== 例子 =====
-在本教程中,我们将通过向其添加''BlockEntityRenderer''来构建所创建的方块实体。 +在本教程中,我们将通过向其添加''BlockEntityRenderer''来构建所创建的方块实体。渲染器将显示一个唱机,漂浮在方块上方,上下移动并旋转。
-渲染器将显示一个自动点唱机,该自动点唱机漂浮在方块上方,上下旋转。+
      
-我们需要做的第一件事是创建我们的“ BlockEntityRenderer类:+我们需要做的第一件事是创建我们的''BlockEntityRenderer''类:
 <code java> <code java>
 public class MyBlockEntityRenderer extends BlockEntityRenderer<DemoBlockEntity> { public class MyBlockEntityRenderer extends BlockEntityRenderer<DemoBlockEntity> {
-    // A jukebox itemstack+    // 唱片机物品栏位
     private static ItemStack stack = new ItemStack(Items.JUKEBOX, 1);     private static ItemStack stack = new ItemStack(Items.JUKEBOX, 1);
          
Line 28: Line 27:
 } }
 </code> </code>
-我们将需要注册我们的''BlockEntityRenderer'',但仅针对客户端。 + 
-在单人游戏设置中这无关紧要,因为服务器与客户端在同一进程中运行。 +我们将需要注册我们的''BlockEntityRenderer'',但仅针对客户端。在单人游戏设置中这无关紧要,因为服务器与客户端在同一进程中运行。但是,在多人游戏设置中,服务器在与客户端不同的进程中运行,服务器代码没有''BlockEntityRenderer''的概念,因此不接受注册。要仅为客户端运行初始化代码,我们需要设置一个''client''入口点(entrypoint)
-但是,在多人游戏设置中,服务器在与客户端不同的进程中运行,服务器代码 +
-没有''BlockEntityRenderer''的概念,因此不接受注册。 +
-要仅为客户端运行初始化代码,我们需要设置一个''客户端''入口点。+
  
 在实现''ClientModInitializer''的主类旁边创建一个新类: 在实现''ClientModInitializer''的主类旁边创建一个新类:
Line 39: Line 35:
     @Override     @Override
     public void onInitializeClient() {     public void onInitializeClient() {
-        // Here we will put client-only registration code+        // 这里我们放置只在客户端注册的代码
     }     }
 } }
 </code> </code>
-将此类设置为''fabric.mod.json''中的“客户端”入口点(根据需要修改路径):+将此类设置为''fabric.mod.json''中的“client”入口点(根据需要修改路径):
 <code javascript "fabric.mod.json"> <code javascript "fabric.mod.json">
 "entrypoints": { "entrypoints": {
Line 49: Line 45:
     "client": [     "client": [
       {       {
-        "value": "tutorial.path.to.ExampleModClient"+        "value": "ExampleModClient的路径"
       }       }
     ]     ]
Line 55: Line 51:
 </code> </code>
  
-在我们的ClientModInitializer中注册''BlockEntityRenderer''+在我们的ClientModInitializer中注册''BlockEntityRenderer'' 
 <code java> <code java>
 @Override @Override
Line 62: Line 59:
 } }
 </code> </code>
-我们重写''render''方法,该方法被称为每一帧(!),并在其中进行渲染 +我们重写在每一帧都会被调用的''render''方法,我们将在其中进行渲染——对于初学者,请调用''matrices.push();'',这在进行GL调用时是必需的(我们将在紧接之后进行):
-  -对于初学者,请调用''matrices.push();'',这在进行GL调用时是必需的(我们将在紧接之后进行):+
 <code java> <code java>
     public void render(DemoBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {     public void render(DemoBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
Line 69: Line 65:
     }     }
 </code> </code>
-然后,我们执行自动点唱机(matrices.translate)和旋转(matrices.multiply)。+然后,我们进行平移(matrices.translate)和旋转(matrices.multiply)。
 转换分为两部分:将其转换为高于方块中心的0.5、1.25和0.5。 转换分为两部分:将其转换为高于方块中心的0.5、1.25和0.5。
 第二部分是更改的部分:y值的偏移量。 偏移量是任何给定框架的项目高度。 第二部分是更改的部分:y值的偏移量。 偏移量是任何给定框架的项目高度。
Line 76: Line 72:
    *添加部分刻度。 (部分刻度线是一个小数值,代表最后一次完整刻度线和现在之间的时间间隔。我们使用此方法是因为否则动画会抖动,因为每秒的刻度数少于每秒的帧数。)    *添加部分刻度。 (部分刻度线是一个小数值,代表最后一次完整刻度线和现在之间的时间间隔。我们使用此方法是因为否则动画会抖动,因为每秒的刻度数少于每秒的帧数。)
    *用8除以减慢运动速度。    *用8除以减慢运动速度。
-   *以正弦值产生介于-1和1之间的值,例如a[[https://www.electronicshub.org/wp-content/uploads/2015/07/11.jpg|正弦波]].+   *以正弦值产生介于-1和1之间的值,类似于[[https://www.electronicshub.org/wp-content/uploads/2015/07/11.jpg|正弦波]]
    * 将其除以4可垂直压缩正弦波,因此该项目不会上下移动太多。    * 将其除以4可垂直压缩正弦波,因此该项目不会上下移动太多。
 <code java> <code java>
Line 90: Line 86:
     }     }
 </code> </code>
-最后,我们将获得Minecraft的''ItemRenderer'',并使用''renderItem''渲染自动点唱机项目 +最后,我们将获得Minecraft的''ItemRenderer'',并使用''renderItem''渲染唱物品。我们还将''ModelTransformation.Type.GROUND''传递给''renderItem'',因为我们希望有类似与物品置于地上的效果。尝试尝试使用此值,看看会发生什么(这是一个枚举)。 
-我们还将''ModelTransformation.Type.GROUND''传递给''renderItem'',因为我们希望有类似的效果 +
-躺在地上的物品。 尝试尝试使用此值,看看会发生什么(这是一个枚举)。+
 在这些GL调用之后,我们还需要调用''matrices.pop();'' 在这些GL调用之后,我们还需要调用''matrices.pop();''
 <code java> <code java>
Line 104: Line 99:
 </code> </code>
  
-您可以立即尝试新创建的方块实体渲染器。 +现在就可以尝试新创建的方块实体渲染器。但是,如果您没有使方块透明,您会发现有些不对劲——浮动方块,唱机是黑色的!这是因为默认情况下,//无论您在方块实体中渲染什么,都将接收方块实体所在位置的光照度//所以浮动方块接收这个不透明方块内部的光,这意味着接收到光为了解决问题,我们会让Minecraft接收方块实体上方位置照强度
-但是,如果您没有使方块透明,您会发现有些不对劲-浮动方块,唱机是黑色的! +
-这是因为默认情况下,无论您在方块实体中进行渲染的任何内容,都将接收光线,就好像它与方块实体处于同一位置一样 +
-因此,浮动方块不透明方块中接收inside的光,这意味着它没有接收到光! +
-为了解决这个问题,我们将告诉Minecraft从上方的一个方块方块实体位置接收光。+
  
-要获取光,我们在方块实体上方的位置调用''WorldRenderergetLightmapCoordinates();'' +要获取光,我们在方块实体上方的位置调用''WorldRenderer#getLightmapCoordinates();'',并在''renderItem()''使用这个光照。
-使用灯光,我们在''renderItem();''使用它:+
 <code java> <code java>
     @Override     @Override
Line 118: Line 108:
                  
         int lightAbove = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), blockEntity.getPos().up());         int lightAbove = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), blockEntity.getPos().up());
-        MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Type.GROUND, lightAbove, OverlayTexture.DEFAULT_UV, matrices, vertexConsumers);+        MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Mode.GROUND, lightAbove, OverlayTexture.DEFAULT_UV, matrices, vertexConsumers);
                  
         [...]         [...]
Line 124: Line 114:
 </code> </code>
  
-唱机现在应具有适当的照+机现在应该得到了适当的照。
zh_cn/tutorial/blockentityrenderers.txt · Last modified: 2023/08/29 10:31 by wjz_p