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 revisionBoth sides next revision
zh_cn:tutorial:blockentityrenderers [2021/05/18 05:07] – [渲染动态使用方块实体渲染器方块和物品] solidblockzh_cn:tutorial:blockentityrenderers [2021/05/18 05:18] – [例子] solidblock
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 124: Line 114:
 </code> </code>
  
-唱机现在应具有适当的照+机现在应该得到了适当的照。
zh_cn/tutorial/blockentityrenderers.txt · Last modified: 2023/08/29 10:31 by wjz_p