新元的无名杀扩展教程(一)技能_9 filter进阶,分支语句
引子
在前面几期中,我们已经了解做一个简单技能的要素,而在接下来的几期中我们将继续深入对技能的编写。
我们首先了解了几种技能的基本格式,然后我们了解了一些语法和算法,在第8期中,我们讲了一系列的函数。
知道了这些后,我们将进一步了解更多的filter和content的相关内容。
filter
对于一个触发的事件,如:
trigger:{
player:"damageEnd"
},
我们希望它满足一定条件才触发,这就要用到filter
就像进行物质提纯一样,我们要的物质通过了,而我们不要的物质被阻挡了;
而在这里,满足一定条件的触发通过了,我们不要的触发被阻挡了。
这就是filter过滤器的作用。
在技能这一object当中,filter是一个函数,触发事件时,就会调用它。
而它会用return语句设置返回值,返回值为true就执行,反之,不执行。
接下来我们来讲讲return以及返回值
return
我们知道,filter当中有一个return的语句,这个return就是返回,而它后面内容就称为返回值。
例如,
return false
返回值就是false
任何一个函数都有返回值,写不写return语句都有,只是不写return语句时,返回值默认为undefined,而return语句后不填时,返回值也为undefined。
那返回值怎么用呢?
可以这样理解返回值:
当一个函数被调用后,它会执行一串代码,代码执行结束时,该函数就会变为返回值。
比如,这里有一个名为MyFunc的函数
function(){
return 1
}
我们调用这个函数:
MyFunc()+1
函数执行完毕后,这段调用语句就变成了
1+1
return还有一个作用就是终止该函数的执行,一旦执行到return的语句,函数就执行完毕。
比如,有一个函数
function(){
return "how"
return true
}
该函数的返回值就为"how",而非true
总结一下,return有两个作用
1.设置函数的返回值
2.终止函数执行
分支语句
当我们限制条件比较少时,我们用一个return就可以实现目的
return 条件1
注:此处条件1是一个计算式,计算的结果是true或false,或者是一个变量,其值为true或false
两个呢?
return 条件1&&条件2
勉强可以接受
如果是要:满足条件1且满足条件2,或满足条件3才发动呢?
return (条件1&&条件2)||条件3
似乎有些麻烦了。
这里介绍分支语言,以方便filter的书写
if-else语句
if语句的写法是:
if(条件){
执行的语句
}
比如,filter中有语句:
if(player.hp>3){
return false
}
效果为,技能拥有者体力值>3时,返回值为false。
if中的满足条件时,if后的代码就执行,否则,不执行。
这种单if语句只有一个分支。
而双分支的语句为:
if(条件){
执行的语句
} else{
执行的语句
}
也举一个例子:
filter中有
if(player.hp>3){
return false
}else{
return true
}
效果为,技能拥有者体力值>3时,返回值为false,否则返回值为true。
当if中的条件满足时,则执行if后的代码,否则执行else后的代码
而三分支语言则是
if(条件1){执行的语句}
else if(条件2) {执行的语句}
else if(条件3){执行的语句}
…
else if(条件n){执行的语句}
else{执行的语句}
这里是先看if中的括号是否满足,否则向下看else if 中括号的条件,若else if中括号的条件均不满足则执行else的语句
还是那个例子:
if(player.hp>4){return flase}
else if(player.hp==3){return true}
else if(player.hp==1){return true}
else{return flase}
玩家体力值大于四,返回值为false,为3,返回值为true,为1,返回值为true,其余的情况返回值为false。
简而言之,单分支语句用if,双分支语句用if-else语句,多分支用if-else if-else语句;if条件满足则执行,否则执行else。
在一般情况下,我们只需要判断if小括号的条件是否满足,就可判断if后语句是否执行。
而我们可以理解为它是这样完成效果的:
第一步,将if小括号中的语句变成true或者false。
如>,<,==,===,它们的计算结果本来就是true或false,算完就走到了第二步。
而如果是非bool的数据类型,则按一定规则变成对应的bool,再走第二步。
规则如下:
0,-0,NaN,''(空字符串),undefined,null→false
其余的数据→true
第二步,如果是if(true){}则执行if后的语句,否则if(false){}则不执行。
即:
if(false){
return true
}
return flase
会返回false
if(0){
return true
}
return false
会返回false
if(NaN){
return true
}
return false
会返回false
if(undefined){
return true
}
return false
会返回false
if(null){
return true
}
return false
会返回false
而:
if(1){
return true
}
return false
会返回true
除了if-else分支外,还有switch分支,这里不做介绍。
分支语句的用法
那么,分支语句怎么用呢?
设想以下情况:
司马懿被闪电劈中了,但是被救回来了。
这时,我们触发了受到伤害的事件,但根据技能描述,由于没有伤害来源,技能是不会发动的,此时就要用filter了。
那么filter怎么写了?
filter函数调用后,此时的情况应该是false,其余的情况则是true。
即:
如果(伤害来源存在) 返回 false
返回 true
那么伤害来源不存在怎么表示呢?
就是判断它是否为undefined
即:
filter:function(event){
if(event.source==undefined) return false
return true
},
此外,还有进阶的写法,由于if语句执行时,它先会将()中的内容转化为bool。触发时,无伤害来源,就转化为false;有伤害来源,就转化为true
完全可以这样写:
filter:function(event){
if(event.source) return true
return false
},
有伤害来源,返回true,无伤害来源返回false
即:
filter:function(event){
if(!event.source) return false
return true
},
我们可以直接这么理解第二种写法,该if语句的条件就是要否定(!)伤害来源(event.source)的存在,即无伤害来源。
!→无,event.source→伤害来源