请选择 进入手机版 | 继续访问电脑版
查看: 2057|回复: 5

[资源] 羊毛大作战 之 3 倒计时

[复制链接]

606

主题

6611

回帖

3106

积分

Lv.8 凋零克星

不想考体育

UID
12
小麦
554
金锭
9312
下界之星
0

三周年纪念勋章二周年纪念勋章一周年纪念勋章秋天的童话设计师开发者认证勋章玩家团队勋章妙镐生花第一季百万勋章内测精英勋章问答斯基的方向盘我是Alex!

发表于 2019-7-19 11:35:50 | 显示全部楼层 |阅读模式 IP:广东
上一期教程,我们把进入游戏的玩家放到了一个小屋子里,然后统计了进入游戏的玩家人数。

这一期教程里,我们要让玩家能够从小屋子传送到羊毛区域。

做完后实现的效果是:
人数不足时提示玩家开始游戏所需的人数;
人数满足要求后,倒计时3秒,然后把所有玩家传入到羊毛区域;
            

下面就按顺序说明这些效果如何实现。
这一期用到的主要都是逻辑编辑器的功能。如果碰到一些基础概念觉得不理解的,可以回顾一下前两期教程哦。

1 人数不足时提示玩家

在开始前,先介绍一下临时变量节点的改动。在之前的版本中,临时变量有3个节点:

使用时需要先添加临时变量,然后再设置或读取临时变量的值。
当前版本中,去掉了“添加临时变量”节点。然后“设置临时变量”时会先检查该临时变量是否存在,不存在的话就会添加临时变量,然后再设置它的值。

在上一期教程中,我们用临时变量playerNum统计了当前玩家的人数。
现在我们设定要2个人加入游戏才能够开始游戏,在第1个人加入时提示玩家“当前人数1人,2个人可以开始游戏”,在第2个人加入时提示玩家“当前人数2人,即将开始游戏”。按下图连接节点。

红框内是我们新加的节点,其中延迟节点是之前未用过的节点(逻辑节点->控制节点->延迟节点),其作用为当执行到该节点时,延迟一定时间再继续执行后续节点。因为玩家加入游戏时会有一个加载过程,所以延迟一定时间再显示提示,避免新加入的玩家看不到。

新加的逻辑会判断当前有多少人,如果没有超过1人就执行下面这条指令:
/say §c当前人数1人,2个人可以开始游戏

如果超过了1个人就执行下面这条指令:
/say §a当前人数2人,即将开始游戏

指令的效果是在界面的左上角显示一条文本提示,像下图这样的效果。

如果想修改提示内容,只需要修改指令中的“§c当前人数1人,2个人可以开始游戏”这部分就可以了。§c表示文字是红色,§a表示文字是绿色。

2 人数满足要求后倒计时3秒传入游戏区域

为了方便后面的测试。我们先把人数要求改成1人,也就是判断人数中的数字从1改成0。

这样只要进入游戏就满足判断条件了。
倒计时怎么做呢,就用前面提到的延迟节点,每延迟1秒提示一次玩家,延迟3秒后,把玩家传入到羊毛区域。
类似下面这样的连接:

其中isCounting这个临时变量用来标志是否进入了倒计时。为了确保在“世界定时刷新”事件中,isCounting这个临时变量已经存在,我们在“世界创建完成”节点中设置它的值为0(相当于添加这个变量并初始化它的值为0,见下图中红框部分)。因为“世界创建完成”是所有事件节点中第一个执行的,很适合用来做一些初始化内容。

前面倒计时的连法中,因为有了isCounting的限制,“假”那个分支只会走一遍,然后依次延时一秒后打印“+++t3”、“+++t2”、“+++t1”。这样我们倒计时的功能框架就有了。

在继续完善这个功能之前,我们先来看下目前的整个节点图的情况。

可以看到,现在节点已经很多了,看起来就很复杂,如果想要修改某个地方,找起来会有点费劲。可以想象,等我们把整个游戏都做完后,节点的数量还会膨胀几倍,最后的节点图恐怕连我们自己维护起来都很困难了。

宏功能(Macro)就是为了解决这个问题。宏是可以复用的节点图(有些像编程中的函数),重复使用的功能或者比较独立的功能,都可以做成宏。
下面我们就把倒计时的功能做成宏。

点击Macro界面的“+”号。

将宏命名为“倒计时”.
  
点击“+”时,会在右侧出现宏的分页,在这里编辑宏里的节点。


这里的“输入”就是宏的起始节点,必须从“输入”开始连接节点,“输出”是宏的结束节点,宏内的逻辑线连接到“输出”节点才会继续在主节点图中向后传播(这句话不明白没关系,继续往后看)。

新建好的宏,可以直接拖入到主ets生成一个节点。

下面我们把刚才倒计时的逻辑转移到“倒计时”宏内后,就是下面这样子。

在主ets上,把倒计时宏连到了“世界定时刷新”节点上(下图)。节点图的结构变得一目了然。

需要说明的是,如果倒计时宏内“真”那条支线连接到“输出”,那么无论是否在倒计时,“倒计时”节点后的节点都会继续执行;而如果 “真”那条支线不连接到“输出”,那么这个宏只会在进入倒计时后,继续往后执行1次。我们这里用不连接的方式。

好了,我们继续完善倒计时宏。按下图的方式修改倒计时宏的连线。

指令 /title @a title 3 表示在屏幕上显示“3”,效果如下图。上图的逻辑就会在屏幕上依次显示3、2、1。

执行指令是需要玩家的,在宏里并没有玩家这个参数。我们可以用临时变量把玩家参数传进来。也可以用设置宏的输入参数的方式(目前设置宏的输入参数的功能还不够完善和稳定,预计将在8月初优化完成)。

这里会用到两个新节点:设置临时变量(实体)、读取临时变量(实体)。
这两个节点和设置临时变量(数字)、读取临时变量(数字)基本一样,只是数值类型为实体,如果我们要存生物、玩家等实体的信息,就需要用到这两个临时变量节点。

在玩家加入世界节点后设置一个lastPlayer临时变量,用来存储最新加入世界的玩家。

倒计时宏内做了如下改动,取到lastPlayer的值,把它作为执行指令的主体。

这样我们的倒计时功能就基本完成了。

为了让主ets的逻辑更加清晰,我们把功能都整理为宏的形式,具体过程和倒计时宏基本相同,不再赘述,最后的结果如下。

目前的节点图,会存在两个问题:
倒计时没有和玩家数量关联起来,不符合人数满足后才开始倒计时的需求。
“世界定时刷新”事件会比“玩家加入世界”先执行,导致倒计时宏内取lastPlayer时并没有取到玩家。

这两个问题要解决,意味着我们要对游戏逻辑的先后顺序做一个安排,先执行了A,再执行B,然后才是C。我们用临时变量来实现这个顺序的管理。把isCounting变量修改为stage,stage变量的值在不同阶段的值如下:
“世界创建完成”时stage值为0。
“玩家加入世界”事件中,当玩家人数满足要求时stage值为1。
“倒计时”在stage为1时才执行,进入倒计时后stage值修改为2。
倒计时结束后stage的值设为3。
stage为3后,将玩家传送至羊毛区域,然后把stage值修改为4。

按照这个设计,修改后的节点图如下图。修改后,我们把设置和判断stage值的节点都放在了主ets里,这样我们能够在主节点图看到流程的路径。

图片里我们标注了①~④这些修改了stage的值的地方。
①:这里在人数提示满足要求后把stage改为1,可以让“世界定时刷新”事件后的节点进入倒计时。为了让人数不满足要求时不修改stage的值。“人数提示”宏改成了下面这样:

在宏内,当人数不满足要求时,节点没有连接到“输出”。那么在主ets里,人数不满足要求时,“人数提示”节点后的节点不会被执行到。

②④:进入判断后马上修改stage的值,这样保证该条支线的逻辑只会被执行1次。

③:倒计时结束后设置stage为3,然后将执行“传送到羊毛区域”的宏。

可能你会注意到判断相等时用的是1.0、3.0而不是1、3,这是因为判断节点内部会把数字转为字符串进行比较,而stage的值是浮点数而不是整数,所以会出现这样的情况。如果判断不准要填什么,可以先打印下要判断的值是多少,然后把打印出来的值填进来。

“传送到羊毛区域”宏的节点图如下,做的事情很简单,把玩家传送到羊毛区域的一个坐标。

这次的教程就到这里了。下一期教程我们将会让不同玩家脚底的羊毛变成不同颜色,并且统计不同羊毛的数量。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

232

主题

1万

回帖

6125

积分

Lv.9 终界行者

SingularityX

UID
5825625
小麦
1702
金锭
5403
下界之星
0

三周年纪念勋章二周年纪念勋章

发表于 2019-7-30 11:24:11 | 显示全部楼层 IP:浙江
感觉用命令做更简单

0

主题

3

回帖

1

积分

Lv.1 新手木匠

UID
6927754
小麦
0
金锭
5
下界之星
0
发表于 2019-8-5 15:15:37 来自手机 | 显示全部楼层 IP:浙江
顶一下

156

主题

897

回帖

579

积分

Lv.6 附魔大师

MinecraftCG渲染图签约作者

UID
50004
小麦
155
金锭
1717
下界之星
0

三周年纪念勋章玩家团队勋章

发表于 2019-8-9 22:30:50 | 显示全部楼层 IP:陕西
复杂的第三章,我看完了~!还做了出来,思姐 求更新啊!~
对了 § 这个符号,按住左下角的alt 再分别按小键盘的 1 6 7 就能打出来 、

虽然还不知道下一章的内容,不过按照游戏的内容,我猜想是这样的
进入游戏后-执行 判断玩家脚下方块 若不是绿色羊毛,则替换脚下方块为绿色羊毛(获取实体坐标)-拆分y轴,减一-替换成对应羊毛
统计我就不知道啦。。或许是统计特定范围的指定羊毛数量,然后输出数据,出现在右侧计分表上
求更新!!~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

156

主题

897

回帖

579

积分

Lv.6 附魔大师

MinecraftCG渲染图签约作者

UID
50004
小麦
155
金锭
1717
下界之星
0

三周年纪念勋章玩家团队勋章

发表于 2019-8-9 22:47:08 | 显示全部楼层 IP:陕西
看来,,这个语句需要循环起来



我又用了很笨的办法来修改


所以,,这个笨办法,只要延迟弄的低,够长,也是可以实现,不过肯定是很吃资源??
需要一个循环语句。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

27

主题

467

回帖

158

积分

Lv.4 怪物猎人

UID
8697438
小麦
7
金锭
596
下界之星
0
发表于 2022-12-31 02:12:27 | 显示全部楼层 IP:新疆
龙八夷 发表于 2019-8-9 22:47 陕西
看来,,这个语句需要循环起来

为啥不用中继器和testfor呢多方便啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部