撰写了文章 更新于 2019-06-01 16:30:10
16个地图工坊基础案例
地图工坊的“事件-条件-动作”规则类似计算机语言,只是一种工具。光复制某种具体的“事件-条件-动作”规则,未必能完全吃透背后的机制。
虽然奶牛关以游戏制作者和资深玩家居多,很容易理解地图工坊的判定逻辑,但仍有很多想要入门却不得其法的玩家。这些玩家想要实现自己的想法,可以根据案例举一反三,将自己的想法拆分为各种类型的需求,并拟定出有效的判定条件和动作流程。
该案例合集是本人主笔,QQ群“地图工坊|设计师茶馆”(985062474)成员合力修改而成。如发现案例有错漏或有更优解,欢迎在评论区指出。
这里举出的参考解法未必是所有或唯一解
1.设置一个变量,令其等于每个玩家自己的实时生命值
参考解法1
需求分解:
1.这是一个等于生命值的玩家变量,需要设置玩家变量A。
2.该变量在任何条件下都生效,且对应单个玩家,所以事件应当为“持续-每名玩家-双方-全部”,且不设条件。
3.每个玩家各有一个生命值数据,因此“每个玩家自己的生命值”在地图工坊中应表达为“每个事件玩家的生命值”,即“生命值-事件玩家”。
4.实时生命值随时可能发生变化,因此要反复重新设置变量,这需要一个循环动作来检查。这个循环动作不需要设置任何条件。
5.该变量处于反复重设之中,因而没有输出。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“双方”,玩家“全部”
2.创建动作“设置玩家变量-A”
3.玩家变量A的值为“生命值-事件玩家”
4.设置动作“等待”,时间“数字-0”,条件“无视条件”
5.设置动作“循环”
*如果“等待”动作后没有其他动作,其等待时间的数字会被自动修正为0.016,设置“循环”动作后再修改一次即可
最终生效规则的算法图示例:
参考解法2
需求分析:
1.这是一个等于生命值的玩家变量,需要设置玩家变量A。
2.该变量在任何条件下都生效,且对应单个玩家,所以事件应当为“持续-每名玩家-双方-全部”,且不设条件。
3.每个玩家各有一个生命值数据,因此“每个玩家自己的生命值”在地图工坊中应表达为“每个事件玩家的生命值”,即“生命值-事件玩家”。
4.变量的值无法实时变更,但可以比较和修改。如果变量的值不等于事件玩家的生命值,可以修改为当前生命值。这需要设置一个比较的条件。
5.若如此做,该变量就不能设置于“比较-修改”的规则中,因为“设置变量”是一次输入行为。因此,必须另设一条事件条件一致的规则以重新设置变量,否则该变量将被反复修改为“设置变量”中给出的值。即,规则1给出变量,规则2进行修改。
6.该变量在不满足条件时会固定为一个值,因而存在输出。
文字说明:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“双方”,玩家“全部”
2.创建动作“设置玩家变量-A”
3.玩家变量A的值为“数字-0”
规则2
1.创建规则2,事件“持续-每名玩家”,队伍“双方”,玩家“全部”
2.设置条件“玩家变量A!=生命值-事件玩家”
3.设置动作“修改玩家变量-玩家变量-A”,值“生命值-事件玩家”
最终生效规则的算法图示例:
思考题:设置一个变量,令其等于每个玩家自己的击杀数
进阶题:设置一个置于屏幕右侧的HUD,持续显示每个玩家自己的消灭数
2.当莫伊拉释放聚合射线时,在她身上附加持续的爆炸效果
参考解法
需求分析:
1.聚合射线是一个持续释放的终极技能,因此莫伊拉的状态为“正在释放终极技能”。
2.持续的爆炸效果意味着多次爆炸,每次爆炸都是独立的。可以使用“播放效果”中的各种爆炸来实现,在此以“环状爆炸”举例。
3.爆炸发生在莫伊拉身上,即以莫伊拉为圆心,半径一定长度的圆形区域。因此,爆炸的位置应为莫伊拉,即“事件玩家”。
4.此规则仅对莫伊拉生效,因而事件定位应为英雄“莫伊拉”。
5.爆炸为所有人可见,因而播放效果的可见应设为“所有玩家-双方-全部”。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“双方”,玩家“莫伊拉”。
2.设置条件“正在使用终极技能-事件玩家==真”。
3.设置动作“播放效果”,可见对象“所有玩家-双方-全部”,效果“环状爆炸”,位置“事件玩家”。
*爆炸的半径大小可以自行调整,默认为“数字-5”
最终生效的规则算法图示例:
思考题:当温斯顿使用原始暴怒时,在他身上附加持续的红色有害爆炸,并播放半径70的有害爆炸音效
进阶题:当麦克雷击杀开大的敌人时,他身上播放一次爆炸效果及环状爆炸音效
3.队伍1死神开大时移动速度翻倍
参考解法1
需求分析:
1.死神开大是指死神释放死亡绽放期间,即使用终极技能时。
2.该规则仅对队伍1的死神生效。
3.移动速度翻倍可以通过“设置移动速度”来实现。设置移动速度的单位是1%,翻倍即乘以200%,则该设置的值为“数字-200”,对象为“事件玩家”。
4.死神是否使用终极技能是两种状态,而“设置移动速度”意味着移动速度的永久改变。可以在两种状态下各修改一次,这样就能仅在使用终极技能时将移动速度翻倍了。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“队伍1”,玩家“死神”
2.设置条件“正在使用终极技能-事件玩家==真”
3.设置动作“设置移动速度-事件玩家”,值“数字-200”
规则2
1.创建规则1,事件“持续-每名玩家”,队伍“队伍1”,玩家“死神”
2.设置条件“正在使用终极技能-事件玩家!=真”
3.设置动作“设置移动速度-事件玩家”,值“数字-100”
最终生效的规则算法图示例:
参考解法2
需求分析:
1.死神开大是指死神释放死亡绽放期间,即使用终极技能时。
2.该规则仅对队伍1的死神生效。
3.移动速度翻倍可以通过“设置移动速度”来实现。设置移动速度的单位是1%,翻倍即乘以200%,则该设置的值为“数字-200”,对象为“事件玩家”。
4.死神终极技能“死亡绽放”的释放时间为3秒,而标准情况下的复活时间是10秒。这意味着在不修改复活时间的前提下,即使死神在释放终极技能期间被击杀,其重生时间也远远超过完整释放终极技能的时间。
5.根据上一步的结论,如果在修改死神移动速度的3秒后将其速度调回原值,即可实现“开大期间速度翻倍”的效果。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“队伍1”,玩家“死神”
2.设置条件“正在使用终极技能-事件玩家==真”
3.设置动作“设置移动速度-事件玩家”,值“数字-200”
4.设置动作“等待”,时间“数字-3”,条件“无视条件”
5.设置动作“设置移动速度-事件玩家”,值“数字-100”
最终生效的规则算法图示例:
参考解法3
需求分析:
1.死神开大是指死神释放死亡绽放期间,即使用终极技能时。
2.该规则仅对队伍1的死神生效。
3.移动速度翻倍可以通过“设置移动速度”来实现。设置移动速度的单位是1%,翻倍即乘以200%,则该设置的值为“数字-200”,对象为“事件玩家”。
4.死神是否使用终极技能是两个状态,可以进行真或假的判定。而“设置移动速度”是将原始值乘以设置速度的百分比,不存在累乘问题。当前等待动作的最小值是0.016,即使重生时间为0秒也大大短于绝大多数玩家的反应极限。
5.根据上一步的结论,如果在死神使用终极技能期间不断检测其状态,并在检测到停止释放终极技能时将移动速度调回原值,即可实现“死神开大时移动速度翻倍”
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“队伍1”,玩家“死神”
2.设置条件“正在使用终极技能-事件玩家==真”
3.设置动作“设置移动速度-事件玩家”,值“数字-200”
4.设置动作“等待”,时间“数字-0”,条件“无视条件”
5.设置动作“如果条件为‘真’则循环”
6.设置动作“设置移动速度-事件玩家”,值“数字-100”
最终生效的规则算法图示例:
思考题:队伍2路霸开大期间伤害翻倍
进阶题:将复活时间缩短为0秒后,在不使用参考解法1和3的情况下实现“队伍1死神开大时移动速度翻倍”
4.队伍2铁拳开大时击倒大招范围内敌人1秒
参考解法
需求分析:
1.该规则生效对象为队伍2的英雄“末日铁拳”。
2.此规则对应的技能是末日铁拳的终极技能“毁天灭地”,因而条件要包括“正在使用终极技能”的检测。
3.末日铁拳落地造成伤害时仍判定为“正在使用终极技能”,因此事件可使用“玩家造成伤害”。
文字描述:
规则1
1.创建规则1,事件“玩家造成伤害”,队伍“队伍2”,玩家“末日铁拳”
2.设置条件“正在使用终极技能-事件玩家==真”
3.设置动作“设置状态-被攻击方”,值为“击倒”,时间为“数字-1”
最终生效的规则算法图示例:
思考题:当莱因哈特使用终极技能时,将所有被伤害的敌人点燃10秒
进阶题:当黑影使用“电磁脉冲”时,将终极技能影响范围内的所有敌人击倒1秒
5.掉落超过10米受到坠落伤害
参考解法
需求分析:
1.是否造成坠落伤害,首先要区分“在空中”和“在地面”两种状态。这需要一个玩家变量进行标识,以决定是否启动位置记录。
2.玩家在空中时,对应高度的是Y方向分量。这个分量在不断变化,应当取最高点作为计算坠落伤害的点。这需要一个对应Y方向分量的,被循环检测和修改的玩家变量。这个变量应取玩家在空中时Y方向分量的最大值。
3.玩家落到地面上时,会产生一个Y方向分量值。用玩家在空中最高点的相应坐标值减去地面上的这个值,再比较结果是否超过10,即可决定是否造成坠落伤害。
4.源氏、法老之鹰、艾什等英雄拥有在空中也能触发的自身位移技能,按照物理学来看,它们的跳跃最高点——即Y方向分量坐标值——应当在使用技能跳得更高时被重新计算。
5.坠落伤害是一种环境伤害,不应视为任何英雄造成的伤害。
文字描述:
规则1
1.创建规则1,事件“持续-全局”,队伍“双方”,玩家“全部”
2.设置条件“正在空中-事件玩家==真”
3.设置条件“玩家变量Z==数字-0”
4.设置动作“设置玩家变量”,对象“事件玩家-A”,内容“位置-Y方向分量-事件玩家”
5.设置动作“等待”,时间“数字-0.02”,条件“无视条件”
6.设置动作“根据条件跳过”,条件“比较”,内容“玩家变量(事件玩家-A)》Y方向分量(位置-事件玩家)”,跳过动作数量“数字-1”
7.设置动作“如条件为‘真’则循环”
8.设置动作“设置玩家变量”,内容“玩家变量(事件玩家-Z)==数字-1”
规则2
1.创建规则2,事件“持续-全局”,队伍“双方”,玩家“全部”
2.设置条件“玩家变量(事件玩家-Z)==数字-1”
3.设置动作“设置玩家变量”,对象“事件玩家-B”,内容“Y方向分量(位置-事件玩家)”
4.设置动作“等待”,时间“数字-0.02”,条件“无视条件”
5.设置动作“根据条件跳过”,条件“比较”,内容“玩家变量(事件玩家-B)<=Y方向分量(位置-事件玩家)”
6.设置动作“如条件为‘真’则循环”
7.设置动作“设置玩家变量”,内容“玩家变量(事件玩家-Z)==数字-0”
规则3
1.创建规则3,事件“持续-全局”,队伍“双方”,玩家“全部”
2.设置条件“在地面上(事件玩家)==真”
3.设置条件“玩家变量(事件玩家-Z)==数字-1”
4.设置动作“根据条件跳过”,条件“比较”,内容“减[玩家变量(事件玩家-A),Y方向分量(位置-事件玩家)]>数字-10==真”,跳过动作数量“数字-1”
5.设置动作“伤害”,对象“事件玩家”,伤害者“无”,伤害量“数字-10”
6.设置动作“设置玩家变量(事件玩家-Z)==数字-0”
思考题:画出该解法最终生效的规则算法图
进阶题:掉落超过10米,每多1米受到10点伤害(提示:负数伤害视同0点伤害)
6.如果队伍的第一个人选了源氏,将其强制切换为天使
参考解法
需求分析:
1.“队伍的第一个人”是指双方队伍的第一个人,即自定义房间两侧队伍最上方的玩家。这个位置在游戏中对应“位置0”。
2.选择某个英雄时,该玩家的英雄常量会发生变化。因此,可以通过英雄常量来判定该玩家是否选择源氏。
3.强制切换为天使意味着“选择天使并重生”,这需要强制玩家选择英雄。
4.需求中没有要求该玩家在后面的游戏中只能适用天使,所以上述“强制选择英雄”应当在天使加载并重生后解除。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“双方”,玩家“位置0”
2.设置条件“英雄(事件玩家)==英雄-源氏”
3.设置动作“开始强制玩家选择英雄”,对象“事件玩家”,英雄“英雄-天使”
4.设置动作“预加载英雄”,对象“事件玩家”,英雄“英雄-天使”
5.设置动作“停止强制玩家选择英雄”,对象“事件玩家”
最终生效的规则算法图示例:
思考题:如果队伍的最后一个人选了布丽吉塔,将其强制切换为莱因哈特
进阶题:如果案例规则生效时已有其他同队伍玩家选择了天使,怎样修改才能防止在队伍中同时出现两个天使?
7.选择法鸡的玩家可以在屏幕右边看到自己的英雄头像,其他英雄看不到自己的
参考解法
需求分析:
1.英雄头像是指“英雄图标字符串”,这可以在“创建HUD”中找到。
2.“创建HUD”创建的文字和图标理论上是持续存在的。考虑到标准情况下每队只能有一个法老之鹰,英雄头像仅对法老之鹰可见即可。
文字描述:
规则1
1.创建规则“持续-全局”,队伍“双方”,玩家“法老之鹰”
2.设置行动“创建HUD”,可见对象为“选择英雄的玩家(英雄-法老之鹰,双方)”,坐标“右边”
最终生效的规则算法图示例:
思考题:选择狂鼠的玩家可以看到自己的消灭数,而选择路霸的玩家可以看到自己的击杀数
进阶题:双方位置0/2/4的人在选择半藏时可以看到自己释放终极技能的次数,而位置1/3/5的人在选择半藏时可以看到自己的击杀数
8.麦克雷开枪时,被打中者额外受到等于友方活人数量十倍的伤害
参考解法
需求分析:
1.麦克雷开枪有三种情况:使用主要武器“维和者”、使用辅助武器“维和者-快速射击”和使用终极技能“午时已到”。虽然技能2“闪光弹”同样会造成伤害,但它不应受到加成。
2.因为是额外造成伤害,只需要创建一个“伤害”动作,将额外伤害加到原本的伤害上即可。
3.额外伤害的值为友方活人数量,即“同队伍人员的存活人数”。由于场上存在两支队伍,这是两个时刻变化的值,因而要创建两个变量。
4.上述两个变量的值需要时刻更新,因而要设置一条规则进行检查。
5.双方麦克雷的额外伤害需要分开计算,因而需另设两条规则。
文字描述:
规则1
1.创建规则1,事件“持续-全局”
2.创建行动“设置全局变量-A”,值“存活玩家数量”,队伍“队伍1”
3.创建行动“设置全局变量-B”,值“存活玩家数量”,队伍“队伍2”
规则2
1.创建规则2,事件“持续-全局”
2.创建条件“全局变量-A!=存活玩家数量(队伍-队伍1)”
3.创建行动“设置全局变量-A”,值“存活玩家数量”,队伍“队伍1”
规则3
1.创建规则3,事件“持续-全局”
2.创建条件“全局变量-B!=存活玩家数量(队伍-队伍2)”
3.创建行动“设置全局变量-B”,值“存活玩家数量”,队伍“队伍2”
规则4
1.创建规则4,事件“玩家造成伤害”,队伍“队伍1”,玩家“麦克雷”
2.创建条件“正在使用技能2!=真”
3.创建行动“伤害”,对象“被攻击方”,值“乘”,乘数分别为“玩家变量-A”和“数字-10”
规则5
1.创建规则5,事件“玩家造成伤害”,队伍“队伍2”,玩家“麦克雷”
2.创建条件“正在使用技能2!=真”
3.创建行动“伤害”,对象“被攻击方”,值“乘”,乘数分别为“玩家变量-B”和“数字-10”
最终生效的规则算法图示例:
参考解法2
需求分析:
1.麦克雷开枪有三种情况:使用主要武器“维和者”、使用辅助武器“维和者-快速射击”和使用终极技能“午时已到”。虽然技能2“闪光弹”同样会造成伤害,但它不应受到加成。
2.因为是额外造成伤害,只需要创建一个“伤害”动作,将额外伤害加到原本的伤害上即可。
3.额外伤害的值为友方活人数量,即“同队伍人员的存活人数”。
4.由于该规则仅在双方麦克雷造成伤害时生效,因而不需要设置变量并反复检查,只需在造成伤害时调用相应的值即可。
5.双方麦克雷的额外伤害需要分开计算,因而需设两条规则。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“队伍1”,玩家“麦克雷”
2.创建条件“正在使用技能2!=真”
3.创建行动“伤害”,对象“被攻击方”,值“乘”,乘数分别为“存活玩家数量(队伍-队伍1)”和“数字-10”
规则2
1.创建规则2,事件“持续-每名玩家”,队伍“队伍2”,玩家“麦克雷”
2.创建条件“正在使用技能2!=真”
3.创建行动“伤害”,对象“被攻击方”,值“乘”,乘数分别为“存活玩家数量(队伍-队伍2)”和“数字-10”
最终生效的规则算法图示例:
思考题:队伍1美妈对敌人造成10倍友方活人数量的伤害,队伍2黑百合对敌人造成10倍敌方阵亡者
进阶题:法老之鹰的火箭弹命中敌人时仅造成自身生命值*2+友方活人数量*10+12点伤害(提示:综合使用地图工坊和英雄设置)
9.队伍1或队伍2被团灭时,直接宣布对方胜利,没有其他获胜方法
参考解法
需求分析:
1.该需求需要更改获胜条件,因此要关闭游戏预设的胜利条件。
2.“团灭”意味着该队伍所有存活玩家均已被消灭,即存活玩家数量为0。
3.任意一队存活玩家数量归零时,即宣布另一队胜利。
4.该规则在全部游戏阶段生效。
文字描述:
规则1
1.创建规则1,事件“持续-全局”
2.设置行动“关闭游戏预设完成模式”
规则2
1.创建规则2,事件“持续-全局”
2.设置条件“存活玩家数量(队伍-队伍1)==数字-0”
3.设置行动“宣告队伍胜利”,队伍“队伍-队伍2”
规则3
1.创建规则2,事件“持续-全局”
2.设置条件“存活玩家数量(队伍-队伍2)==数字-0”
3.设置行动“宣告队伍胜利”,队伍“队伍-队伍1”
最终生效的规则算法图示例:
思考题:先消灭对方100次的队伍取得胜利,没有其它获胜方法
进阶题:双方各有100次重生机会,耗尽后无法重生。先消灭对方全部人员的队伍获得胜利,没有其它获胜方法
10.所有人都可以发送“收到”治疗自己200血,但原本无法治疗自己的英雄如此做时会被定身2秒
参考解法
需求分析:
1.“所有人都可以”意味着“发‘收到’治疗自己”是一个整局游戏都生效的规则。
2.“收到”是交流转盘上的一个通讯选项,可使用“正在通讯”选项进行判定。
3.“原本无法治疗自己的英雄”意味着该英雄无法直接通过使用武器或技能给自己恢复生命值。相应地,挑出“能够治疗自己的英雄”再将其排除出定身效果生效范围即可。当前版本(1.36.01)能够治疗自己的英雄包括:士兵:76(生物力场)、死神(饮血)、堡垒(自我修复)、美(急冻)、路霸(呼吸器)、卢西奥(切歌-治愈音效)、天使(恢复)、莫伊拉(生化之握、生化之球-治疗)、布丽吉塔(鼓舞)、安娜(生物手雷)、巴蒂斯特(愈合冲击)。
4.“治疗自己”意味着治疗者为玩家自己,而不是环境。如果该治疗没有治疗者,应当表述为“增加200点生命值”。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”
2.创建条件“正在通讯(事件玩家)-收到==真”
3.创建动作“治疗”,对象“事件玩家”,治疗者“事件玩家”,治疗量“数字-200”
规则2
1.创建规则2,事件“持续-每名玩家”
2.设置条件“正在通讯(事件玩家)-收到==真”
3.设置条件“英雄(事件玩家)!=英雄(士兵:76)”
4.设置条件“英雄(事件玩家)!=英雄(死神)”
5.设置条件“英雄(事件玩家)!=英雄(堡垒)”
6.设置条件“英雄(事件玩家)!=英雄(美)”
7.设置条件“英雄(事件玩家)!=英雄(路霸)”
8.设置条件“英雄(事件玩家)!=英雄(卢西奥)”
9.设置条件“英雄(事件玩家)!=英雄(天使)”
10.设置条件“英雄(事件玩家)!=英雄(莫伊拉)”
11.设置条件“英雄(事件玩家)!=英雄(安娜)”
12.设置条件“英雄(事件玩家)!=英雄(巴蒂斯特)”
13.设置行动“设置状态”,对象“事件玩家”,状态“定身”,持续时间“数字-2”
最终生效的规则算法图示例:
思考题:所有人都可以发送“需要治疗”给自己增加100生命值,但源氏如此做时会死亡
进阶题:半藏击杀数小于15时,可以发送“需要治疗”给自己增加100生命值;击杀数大于15时,可以发送“需要治疗”令自己无敌3秒并清除所有负面效果
11.双方各有100次复活次数;双方玩家均能在屏幕右侧看到一条HUD,显示每个队伍的剩余复活次数
参考解法
需求分析:
1.复活次数可以通过全局变量表示,两队需各设一个全局变量。计数和显示均可调用该变量。
2.该HUD需要显示四个部分:队伍1标识、队伍1复活次数、队伍2标识、队伍2复活次数。一条字符串最多同时显示3个部分,因此要在3个部分中进行嵌套。
3.将该HUD的内容可定为“{防守}{复活次数}:{进攻}{复活次数}”,相当于结构“{0}{1}{2}{3}”的字符串。字符串最多支持“{0}{1}{2}”的结构,因此要把上述四个元素拆分为不超过这一长度的结构。
4.“{进攻}{复活次数}:{防守}{复活次数}”可以拆分为“{防守}{复活次数}:”和“{进攻}{复活次数}”两个“{0}{1}”结构。
5.上述两个“{0}{1}”仍需统一到一个字符串中。这两个“{0}{1}”结构可以各视为一个{0},进而统一到一个“{0}{1}”字符串中。
6.“{防守}{复活次数}:”在实际操作中为“{0}{1}:”结构,需进一步拆分为“{0}”和“{0}:”两个结构。
文字描述:
规则1
1.创建规则1,事件“持续-全局”
2.设置行动“设置全局变量-A”,内容“数字-100”
3.设置行动“设置全局变量-B”,内容“数字-100”
规则2
1.创建规则2,事件“玩家阵亡”,队伍“队伍1”,玩家“全部”
2.设置行动“修改全局变量”,对象“全局变量-A”,修改方式“减-(数字-1)”
规则3
1.创建规则3,事件“玩家阵亡”,队伍“队伍2”,玩家“全部”
2.设置行动“修改全局变量”,对象“全局变量-B”,修改方式“减-(数字-1)”
规则4
1.创建规则4,事件“持续-全局”
2.设置条件“全局变量-A==数字-0”
3.设置行动“关闭游戏预设重生模式(队伍1)”
规则5
1.创建规则4,事件“持续-全局”
2.设置条件“全局变量-B==数字-0”
3.设置行动“关闭游戏预设重生模式(队伍2)”
规则6
1.创建规则6,事件“持续-全局”
2.设置行动“创建HUD文本”,可见“所有玩家-双方-全部”,标题“字符串”,坐标“右边”
3.“字符串”内容设置为“{0}{1}”
4.“{0}”一栏内容设置为“字符串”,下属“字符串”一项设置为“{0}{1}”
5.上述“{0}{1}”中,{0}的内容设置为“字符串”,标题为“防守”;{1}的内容设置为“字符串”,标题为“{0}:”
6.由上述{1}选项下的字符串“{0}:”中,{0}的内容设置为“字符串”,标题为“全局变量-A”
7.回到最顶层位于“可见”一栏下的字符串中,将“{1}”一栏的内容设置为“字符串”,下属“字符串”一项设置为“{0}{1}”
8.上述“{0}{1}”中,{0}的内容设置为“字符串”,标题为“进攻”;{1}的内容设置为“字符串”,标题为“{0}”
9.由上述{1}选项下的字符串“{0}”中,{0}的内容设置为“字符串”,标题为“全局变量-B”
该规则创建的字符串嵌套结构示例图:
思考题:设置一条HUD,持续显示双方的阵亡次数
进阶题:当士兵:76抱大时,显示一条提示对方队伍存活玩家数量的HUD
12.艾什每开一枪就在身上叠加一个紫色光环,每扔一个雷管就消除一个紫色光环;叠加到第四个光环时艾什死亡
参考解法
需求分析:
1.艾什开枪即使用主要武器。考虑到“毒蛇”是半自动步枪(即按一打一),可以通过是否使用主要武器来识别。
2.雷管即艾什的技能2“延时雷管”,同样是按一打一类型的武器,可以通过是否使用技能2来识别。
3.由于可能叠加的紫色光环数量较多,不能使用“消除效果(最后创建的实体)”,否则只能消除最后叠加的紫色光环。因此,每一个紫色光环都需要记录在一个变量下的数组中,并在使用技能2时按顺序逐个消除。
4.上述消除动作完成后,被消除光环的效果ID依旧留在数组中,会干扰规则的执行,因而需要一并消除。
5.虽然叠加到第四个光环时可以强制击杀艾什,但光环不会自动消除,还需要一系列后续动作。
6.光环数量与艾什是否被对手击杀无关,因而不能简单以玩家是否阵亡来判定消除所有光环的时机。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“双方”,玩家“艾什”
2.设置行动“创建玩家变量-A”,内容“空数组”
规则2
1.创建规则2,事件“持续-每名玩家”,队伍“双方”,玩家“艾什”
2.设置条件“正在使用主要武器(事件玩家)==真”
3.设置行动“创建效果”,可见“所有玩家(队伍-双方)”,类型“环”,颜色“紫色”,位置“事件玩家”
4.设置行动“修改玩家变量-A”,操作“加”,值“最后创建的实体”
规则3
1.创建规则3,事件“持续-每名玩家”,队伍“双方”,玩家“艾什”
2.设置条件“正在使用技能2(事件玩家)==真”
3.设置行动“消除效果”,对象“数组中的值”,数组“玩家变量(事件玩家)-A”,指针“最后”,指针数组“玩家变量(事件玩家)-A”
4.设置行动“修改玩家变量”,对象“玩家变量(事件玩家)-A”,操作“根据指针从数组中移除”,指针“最后”,数组“玩家变量(事件玩家)-A”
规则4
1.创建规则4,事件“持续-每名玩家”,队伍“双方”,玩家“艾什”
2.设置条件“数量==数字-4”,数组“玩家变量(事件玩家-A)”
3.设置行动“击杀”,对象“事件玩家”,击杀者“无”
规则5
1.创建规则5,事件“玩家阵亡”,队伍“双方”,玩家“艾什”
2.设置条件“数量==数字-4”,数组“玩家变量(事件玩家-A)”
3.设置行动“等待”,时间“数字-0”
4.设置行动“消除效果”,对象“数组中的值”,数组“玩家变量(事件玩家)-A”,指针“最后”,指针数组“玩家变量(事件玩家)-A”
5.设置行动“修改玩家变量”,对象“玩家变量(事件玩家)-A”,操作“根据指针从数组中移除”,指针“最后”,数组“玩家变量(事件玩家)-A”
6.设置行动“根据条件循环”,条件“比较”,比较对象为“数量-玩家变量(事件玩家)-A!=数字-0”
思考题:画出该解法最终生效的规则算法图
进阶题:源氏每进行一次二段跳获得1个光环,每爬墙一次消除1个光环,积累4个光环时强制切换为黑百合并在重生室重生
13.源氏使用反弹后无敌3秒,该效果冷却15秒。无敌时间和冷却时间均在计时时显示
参考解法
需求分析:
1.反弹是指源氏的“闪”,即技能2。这是一个瞬发技能,因而可以通过是否按下按钮来识别。
2.“无敌”是一个特殊状态,需要通过“设置状态”行动进行设置。由于该状态有时长限制,因而不需要另设“消除状态”行动。
3.技能冷却可以通过“等待”行动实现,“等待”的时长即为冷却时间。由于需求中没有注明冷却是在使用反弹后还是无敌结束后开始,为操作方便将其视为无敌结束后开始。
4.无敌时间和冷却时间各需要一条HUD显示,显示内容为“无敌/冷却时间 时间数字”,均为“{0}{1}”字符串结构。由于计时不同步,两个时间数字可以通过一个变量表示,并持续追踪。
5.为了方便检索,HUD的显示和消除可以单列一条规则,触发条件为源氏是否具有无敌状态。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“双方”,玩家“源氏”
2.设置条件“按钮被按下(事件玩家-技能2)==真”
3.设置行动“设置状态”,对象“事件玩家”,状态“无敌”,持续时间“数字-3”
4.设置行动“等待”,时间“数字-3”,条件“无视条件”
5.设置行动“等待”,时间“数字-15”,条件“无视条件”
规则2
1.创建规则2,事件“持续-每名玩家”,队伍“双方”,玩家“源氏”
2.设置条件“具有状态(事件玩家-无敌)==真”
3.设置行动“设置玩家变量-A”,值“数字-3”
4.设置行动“持续追踪玩家变量”,对象“玩家变量(事件玩家)-A”,终点“数字-0”,持续时间“数字-3”
5.设置行动“创建HUD文本”,可见“事件玩家”,标题“字符串”,坐标“顶部”
6.“字符串”标题设置为“{0}{1}”
7.“{0}”一栏内容设置为“字符串”,该字符串内容为“正在保护”
8.“{1}”一栏内容设置为“字符串”,该字符串内容为“玩家变量(事件玩家)-A”
9.设置行动“等待”,时间“数字-3”,条件“无视条件”
10.设置行动“消除HUD”文本,对象“上一个文本ID”
11.设置行动“设置玩家变量-A”,值“数字-15”
12.设置行动“持续追踪玩家变量”,对象“玩家变量(事件玩家)-A”,终点“数字-0”,持续时间“数字-15”
13.设置行动“创建HUD文本”,可见“事件玩家”,标题“字符串”,坐标“顶部”
14.“字符串”标题设置为“{0}{1}”
15.“{0}”一栏内容设置为“字符串”,该字符串内容为“冷却时间”
16.“{1}”一栏内容设置为“字符串”,该字符串内容为“玩家变量(事件玩家)-A”
17.设置行动“等待”,时间“数字-15”,条件“无视条件”
18.设置行动“消除HUD”文本,对象“上一个文本ID”
思考题:画出该解法最终生效的规则算法图
进阶题:如果双方队伍中各有一个源氏,怎样修改该解法才能保证两个源氏的计时HUD不互相消除?
14.使用主武器时,自动瞄准视线内最近敌人的头
参考解法
需求分析:
1.这是一个“锁头自瞄”,会强制自瞄者转向。为了加快反应时间,“使用主武器”这一条件以是否按下按钮来判断。
2.强制转向包含两个部分:是否强制朝向以及强制朝向什么方向。前者可以通过行动“开始朝向”解决,后者需要提供一个“带方向的量”,也就是“向量”。
3.向量的起止点需要分别设置。由于该自瞄锁头,因此只要给出“准星到敌方头部”的向量即可。这一向量较为简单的取法,是“瞄准者眼睛位置到相应敌人眼睛位置”。
4.“视线内离准星最近的敌人”中,敌人有两个限制条件:“在瞄准者视线内”和“离瞄准者最近”。还有一两隐含条件:该敌人仍然存活且不在敌方屏障后,这两者均无法直接对其造成伤害。通过以上限制条件的筛选,符合要求的敌方玩家将仅剩一个。
5.根据上一步的结论,我们需要建立一个包含敌方所有存活玩家的数组,并对其进行筛选。首先,要过滤掉不在瞄准者视线范围内的玩家;其次,要将剩余的玩家按距离远近排序,并瞄准距离最近的那个。
6.由于“开始朝向”的最大角速率为10000,对于一些延迟弹道英雄来说依然不够快,可以使用“绝对值”选项绕开这一上限。
7.“开始朝向”会持续迫使瞄准者朝向一处,因此需要一个“停止朝向”。这一指令不能干扰可以持续射击的英雄,因而需要一个循环指令进行检查和纠正。
文字描述:
规则1
1.创建规则1,事件“持续-每名玩家”,队伍“双方”,玩家“全部”
2.设置条件“按钮被按下(事件玩家-主要攻击模式)==真”
3.设置玩家变量“事件玩家-A”,值“首个”,数组“已排序的数组”
4.排序的数组为“已过滤的数组”,过滤的数组为“所有存活玩家”,队伍“对方队伍”,玩家“事件玩家”
5.过滤条件“在视线内”,开始位置“事件玩家”,结束位置“当前数组元素”,屏障“敌方屏障阻挡视线”
6.数值排序条件为“相距距离”,开始位置“当前数组元素”,结束位置“事件玩家”
7.设置行动“开始朝向”,对象“事件玩家”,方向“向量”
8.向量开始位置“眼睛位置(事件玩家)”,结束位置“眼睛位置(玩家变量-A)”
9.角速率为“绝对值”,值“数字-999999”,相对位置“至地图”,重新赋值“方向及角速率”
10.设置行动“等待”,时间“数字-0”,条件“无视条件”
11.设置行动“如条件为‘真’则循环”
12.设置行动“停止朝向(事件玩家)”
思考题:画出该解法最终生效的规则算法图
进阶题:如果要瞄准视线内生命值最低的玩家,且杜绝没有可瞄准敌人时使用主武器的异常转向问题,应如何修改该解法?
15.美妈冰冻敌人之后可以用右键将敌人弹飞
参考解法
需求分析:
1.美冰冻敌人的手段包括“冰霜冲击枪”的主要攻击模式和终极技能“暴雪”,都会对敌人造成伤害。可以通过“玩家造成伤害”事件来触发这一效果。
2.是否被冰冻是两个状态,需要一个条件进行检查。
3.“将敌人弹飞”可以理解为“给敌人一个极大的推力,将其沿冰锥的发射方向推出”。冰锥的发射方向无法直接调用,但可以通过双方玩家的位置划定一个向量,该向量可以等同冰锥的发射方向。
4.冰锥只有命中才能触发效果,而此时必然造成伤害。可以通过检索“是否造成伤害”来决定是否触发效果,即查询“被攻击方”。
5.是否使用冰锥无法通过“正在使用辅助攻击模式”判断,因为冰锥是延迟弹道武器,该条件仅在冰锥发射前的时间里为“真”。当前版本(1.36.01)美的冰锥伤害浮动范围为22-75,而“冰霜冲击枪”主要攻击模式和终极技能“暴雪”的单次伤害均无法达到22的下限。因此,可以通过比较事件伤害来判定美是否使用冰锥进行攻击。
文字描述:
规则1
1.创建规则1,事件“玩家造成伤害”,队伍“双方”,玩家“美”
2.设置条件“具有状态(被攻击方-冰冻)==真”
3.设置条件“事件伤害>=数字-22”
4.设置行动“施加推力”,玩家“被攻击方”,方向“向量”,速度“数字-100”,相对“至地图”
5.向量开始位置“事件玩家”,结束位置“被攻击方”
思考题:画出该解法最终生效的规则算法图
进阶题:将路霸的终极技能修改为“将被击中者吸附到路霸位置”
16.黑百合击杀敌人后对所有敌人隐形3秒,并在击杀时的位置产生所有人都能看到的,半径5米的白色云雾;黑百合显形后云雾消失
参考解法
需求分析:
1.不论以何种方式,黑百合的击杀都是“造成最后一击”,适用于事件“玩家造成最后一击”。
2.隐形在地图工坊中的等效设置为“设置不可见”。若对所有敌人隐形,不可见的对象应为敌方队伍所有玩家。
3.若将白色云雾创建在“事件玩家”位置,其运动会跟随“黑百合”。即使不更新效果位置,该云雾同样对敌方玩家不可见。可以通过变量记录“黑百合”击杀敌人时的位置,并在该位置生成云雾,这样就能设置为对所有人可见了。
4.效果和不可见都需要使用消除行动进行消除。考虑到两个队伍各选出一个黑百合的情况,需要用玩家变量记录每个白色云雾并分别消除。
文字描述:
规则1
1.创建规则1,事件“玩家造成最后一击”,队伍“双方”,玩家“黑百合”
2.设置行动“设置玩家变量(事件玩家)-A”,值“位置(事件玩家)”
3.设置行动“创建效果”,类型“云”,可见“所有玩家(所有队伍)”颜色“白色”,位置“玩家变量(事件玩家)-A”,半径5
4.设置行动“设置玩家变量(事件玩家)-B”,值“最后创建的实体”
5.设置行动“设置不可见”,对象“事件玩家”,不可见对象“对方队伍(事件玩家)”
6.设置行动“等待”,时间“数字-3”,条件“无视条件”
7.设置行动“消除效果”,对象“玩家变量(事件玩家)-B”
8.设置行动“设置不可见”,对象“事件玩家”,不可见对象“无”
思考题:画出该解法最终生效的规则算法图
进阶题:死神在不开枪或大招结束五秒后对所有敌人隐身并在隐身位置留下一团云雾,开枪或放大后显形并消除云雾
【完】
目录