开启辅助访问      

站内搜索

搜索
热搜: 下载 1.19 1.20

Minecraft(我的世界)苦力怕论坛

[BE教程] 附加包教程:36.实体(二)

发表于 2023-7-9 20:41:11 来自手机 | 显示全部楼层 |阅读模式 IP:山西省
本帖最后由 Cat_Anchor 于 2023-8-20 11:09 编辑

前言

终于到了实体的例子的阶段了。这对我来说还有些难度,不过我们今天就来看看我的附加包——相机平滑移动中的实体例子。这个附加包中仅有一个实体,那就是缓动标记。相机的缓动,就是根据这个标记进行的。由于内容过长,我打算分期进行。
创建实体

首先,需要创建一个空白的新实体,这个实体没有任何功能。我在这里直接使用我的附加包中的代码。然后,因为缓动标记仅起标识的作用,它当然不能受到伤害导致标记消失,也不能自然消失,等等。
  1. {
  2.   "format_version": "1.20.10",
  3.   "minecraft:entity": {
  4.     "description": {
  5. "identifier": "supplementary:moving_mark", //我的附加包中,缓动标记的命名空间ID。
  6. "is_spawnable": false, //可用刷怪蛋等生成
  7. "is_summonable": true, //可用命令生成
  8. "is_experimental": false //是否是实验性的
  9.     },
  10.     "component_groups": {}, //组件组
  11.     "components": {
  12. "minecraft:tick_world": {}, //常加载周围的区块
  13. "minecraft:persistent": {}, //防止自然消失
  14. "minecraft:damage_sensor": {
  15.   "triggers": {
  16.     "cause": "all", //所有伤害
  17.     "deals_damage": false //不造成实际影响
  18.   }
  19. },
  20. "minecraft:type_family": {
  21.   "family": [
  22.     "inanimate"
  23.   ]
  24. }, //实体属于inanimate族
  25. "minecraft:physics": {
  26.   "has_gravity": false, //可以漂浮
  27.   "has_collision": false //无碰撞箱
  28. },
  29. "minecraft:pushable": {
  30.   "is_pushable": false, //无法被生物推动
  31.   "is_pushable_by_piston": false //无法被活塞推动
  32. },
  33. "minecraft:fire_immune": true, //免疫火焰,不会着火
  34. "minecraft:nameable": {
  35.   "allow_name_tag_renaming": false //不允许使用命名牌
  36. }
  37.     }, //组件
  38.     "events": {} //事件
  39.   }
  40. }
复制代码

然后,我们就要进入实现环节了。
在播放时,标记是有顺序地进行播放的,因此必须让标记存储自己是第几个这样的数据,便于以后播放。这样,使用camera命令才能把玩家的摄像机从一个标记缓动到下一个标记。
要实现这种功能,计分板是一个好选择。因此,在实体生成时就应该创建一个计分板。借助内置事件minecraft:entity_spawned可以轻松实现这一点。
那么怎么实现用分数表示顺序呢?我首先想到了让其他实体把自己的分数加到当前实体。首先,创建计分板moving;然后,将moving设为1;最后,把所有分数加到自身。这样的结果是:第一个实体,1;第二个,1+1=2;第三个开始出问题,1+2+1=4;第四个是1+2+4+1=8。这样显然是不对的。要纠正这个问题太复杂,事倍功半的事我不会去做。
于是,我又创建了一个moving2计分板,把值设为1,再把所有实体的moving2的分数加到自身的moving的分数上,使用/scoreboard players operation @s moving += * moving2命令可以完成这一点。这样,有多少个实体就加多少分,这其实也是实体计数的原理。不过现在,我们用它表示顺序。
那么第一个实体,1;第二个,1+1=2;第三个,1+1+1=3……现在就正确了。计分板上的分数就是这个实体的顺序。比如这个标记的moving是3,那么这就是第3个标记。
以上这么一大堆,可以概括为以下事件:
  1. "minecraft:entity_spawned": { //当实体生成时...
  2.   "run_command": { //运行命令
  3.     "command": [ //命令列表
  4.       "scoreboard objectives add moving dummy", //创建计分板moving
  5.       "scoreboard objectives add moving2 dummy", //创建计分板moving2
  6.       "scoreboard players set @s moving2 1", //将moving2设为1
  7.       "scoreboard players operation @s moving += * moving2" //将所有有分数的实体的moving2分数加到自身的moving里。这个*代表计分板上所有有分数的实体。
  8.     ]
  9.   }
  10. }
复制代码

是的,刚才讲了这么久,只实现了实体顺序的储存。接下来,为了实现开始播放的功能,我们需要新增一个事件,让它检测我们设置的速度和缓动类型,最后开始缓动。同时,为了正确识别标记的顺序,还需要在计分板方面下点功夫。
后记

这一期主要实现了实体生成顺序的标记。下期,我们开始完成主要部分。


苦力怕论坛,感谢有您~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供云服务 | GMT+8, 2024-5-4 14:39

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号