level 12
说明:天外系列教程需要读者对2dfm比较熟悉才能学习,虽然不是什么高难度的东西,但毕竟属于进阶教程
2014年02月21日 21点02分
1
level 12
实际使用方法:
实际上我们在使用画面外攻伤区时,不是在人物本体中直接使用攻击区和伤区,而是用【物】来携带攻击区和伤区
============================
原因有三:
【1:可以分别进行不同命中判定】
首先,本体中多个并列的攻击区攻击命中时,都遵守同一套【招】脚本的攻击命中判定
也就是说,我在人物本体中设定了一个【招】判定攻击命中后人物跳转去一个弯腰的动作,那么我给人物本体在画面外不同高度设定三个攻击区,这三个攻击区之中任何一个攻击命中,人物都会跳转去那个弯腰动作
而我们通常希望一个攻击区命中后跳转去弯腰,另一个攻击区命中后跳转去梳头,第三个攻击区命中跳转去做V字手势,也就是说我们希望每个攻击区的命中能触发不同的结果
这显然是在人物本体中设置攻击区无法实现的
但如果用三个物体携带这三个攻击区,就完全不同
我们知道【物】脚本产生的物体,实际上是调用了一个事前存在的招式的脚本所创建的图块,这个图块本身可以带有攻防区
如果我现在让三个物体分别引用三个事前做好的不同招式,来创建三个物体
每个物体有自己的一个攻击区,该物体对应的那个招式的脚本里有他自己专门的一个【招】来对这个物体的攻击命中做定义,那么三个物体对应的三个招式里就各自设定了三个不同的【招】脚本,可以跳转去不同的结果
这就在理论上解决了三个攻击区攻击命中后分别导致不同结果的问题
【2:人物本体不会受伤】
我们用物体携带伤区,去供敌人攻击命中的时候,人物本体就不会受伤
例如我们要让安迪判定不知火舞的身份,我们肯定不希望判定过程导致不知火舞受伤,那么不知火舞脚下的那个伤区就应该是由一个物体携带的,它可以供安迪攻击命中判定不知火舞的身份,却不会导致不知火舞跳转去受伤动作
【3:不产生多余的连击数】
我们都知道,人物本体受伤时会被系统计算连击,这是我们不想看到的,而物体的攻击区打中物体的伤区不会计算连击数
==============================
但有一个问题:物体中的【招】导致的跳转,实际上是物体的动画脚本的跳转,而不会引起人物本体的跳转
换句话说,我们需要让物体动画的跳转影响人物本体,那就必须借助角色变量
实际上画面外攻防区应用中几乎是必须使用角色变量的
通常我们让物体所引用的脚本中的【招】跳转去一个【变】脚本,对某个角色变量K设置数值
比如在上面的例子里,我们希望安迪攻击命中不知火舞后,安迪的画面外攻击区所在的物体脚本中的【招】跳转去一个【变】,把给角色变量K代入数值1(而平时默认角色变量K是0)
然后我们在人物本体中适当的位置设置一个【变】检测角色变量K是否为0,如果是,就继续执行后面正常的开场亮相动画,如果不是(K=1的时候当然不是)就跳转去那个遇到不知火舞才会做出的动作
这就实现了物体所携带的攻防区攻击命中后影响人物本体的动画
2014年02月21日 22点02分
4
level 12
我们通常需要同时判定好几个人的身份,怎么办呢?
首先每个人物应该在画面外特定高度有自己独有的一个伤区,当然是由一个物体携带的,这样能避免人物本体被打伤
例如不知火舞的伤区在y+2000,安迪的伤区在y+4000,特瑞的伤区在y+6000
其次是需要检测对方身份的那个人,他检测别人身份的那个招式应该在画面外诸多个高度都有一个攻击区,每个攻击区由一个物体携带,以便可以分别定义攻击命中后的脚本跳转(跳转去不同结果)
比如我们想要安迪在游戏开战前检测对手身份,安迪的战前亮相招式的开头就应该有三个【物】引用三个不同招式
第一个招式中的攻击区位于y+2000高度,第二个招式中的攻击区位于y+4000高度,第三个招式中的攻击区位于y+6000高度
第三,每个携带攻击区的物体的【招】,各跳转去一个【变】,这些不同的【变】分别把同一个角色变量K设置成不同的数值
例如安迪的三个【物】对应的三个招式中的【招】和【变】的设定是:
第一个招式中的【招】攻击命中时跳转去【变】设定K=1,第二个招式中的【招】攻击命中时跳转去【变】设定K=2,第三个招式中的【招】攻击命中时跳转去【变】设定K=3
第四,人物本体在需要根据敌人身份做出反应的时候,该时段人物本体动画脚本中应该有一系列【变】分别检测角色变量K的不同数值跳转去不同的动画或者招式
例如安迪的战前亮相招式在三个【物】之后加一个【图】停留时间2用来给攻击命中判定留时间,然后就是三个【变】,分别检查K=1时(遇到不知火舞)跳转去讨好的动作,K=2时(遇到安迪)跳转去指责对方假冒自己的动作,K=3时(遇到特瑞)跳转去互相鼓励的动作
第五,如有必要,记得在跳转去的动画招式开头设置一个【变】对角色变量K进行清零,以便可以进行下一次身份检测
2014年02月21日 22点02分
5
level 12
最后,也是最关键的内容:
每一批处于相同高度的攻防区域,我们称之为一个攻防属性体系,一般来说我们不希望它与其他相近高度的攻防区域相互干扰
所以,两个不同攻防体系之间最合适的高度差是2000像素,至于具体为啥,这里我不详细说了,你就照做就好,这个不仅是“经验”那么简单,而是最合理的设计,没有之一
2014年02月21日 22点02分
6
另外,不要试图去使用x+2000这类的画面外区域,具体原因非常复杂,反正你不要用就是了,让你用纵向高度你就用纵向高度的,横向的问题太多
2014年02月21日 22点02分
y-2000这类向上移动的也是可以用的,别只知道用y+系列。另外,最大不要超过y+28000或y-28000,具体为啥我不告诉你,你用了后果自负
2014年02月21日 22点02分
level 12
所有废话都说完了,我们进入正题:传递数据(其实这部分内容很少,因为前面都铺垫完了)
2dfm不允许人物之间不经系统变量就直接相互通信,告知对方一个数据
但实际上我们前面的例子已经显示出,安迪可以检测敌人身份,我们等于给安迪提供了三个数值(按照敌人是不知火舞、安迪、特瑞)
如果我们不是要判断敌人身份,而是要获取敌人的数据,其实可以利用类似的手段
【例1】
比如敌人血量少于50%时,我们给敌人加一个物体(管理号1,与源同在,随着敌人本体移动),该物体携带一个y+2000高度的伤区,我方只要攻击命中检测到这个伤区,就得知敌人血量少于50%(当然你要做出这些个检测跳转脚本),设置角色变量K=50
敌人血量少于25%时,我们添加一个物体(管理号还是1,以便取代上面那个),该物体携带一个y+4000高度的伤区,我方只要攻击命中这个伤区就知道敌人血量少于25%,设置角色变量K=25
敌人血量不少于50%的时候,我们给敌人加一个空白物体(管理号1,其实就是让前两个物体消失),我方此时检测不到敌人有画面外伤区,于是设置角色变量K=100,代表敌人血量不少与50%
然后在脚本AI中可以利用角色变量K,比如我方自己有一个角色变量J记录我方自己的血量百分比,然后就可以根据敌我血量不同情况设定进攻防守策略,例如:
我方不少于50,敌方不少于50,使用试探性策略,比如多扔飞镖,用重攻击尝试进攻
我方不少于50,敌方少于50,使用压制性策略,比如多尝试进攻
我方少于50,敌方不少于50,使用偏防守策略,远距时才扔飞镖,多用收招快破绽小的轻攻击
我方少于50,敌方少于50,使用试探性策略,比如多扔飞镖,用重攻击尝试进攻
我方少于50,敌方少于25,使用压制性策略,比如多尝试进攻
我方少于25,使用保命策略,多用收招快破绽小的轻攻击,多用判定强的无赖攻击招式,或者尽可能防御
我们也可以把血量换成是敌人的行动状态,例如跳跃、站立、蹲,只要在对应状态下给敌人配备对应的画面外伤区,我方检测之后就知道敌人此刻的状态,来选用对空技、中段技等
【例2】
传递数值:
例如我方有三个高度的攻击区:y+2000,y+4000,y+6000
敌人也可以有这三个高度的伤区
我方定义y+2000的伤区命中时,给角色变量K+1
y+4000的伤区命中时,给角色变量K+2
y+6000的伤区命中时,给角色变量K+4
那么敌人如果想要给我方传递数据5,那就只要他在y+2000和y+6000高度各有一个伤区,两个伤区同时存在,我方攻击命中这两个伤区,K被分别增加1和4,最后得到K=5
这个方法可以参考下表传递数据:
K的最终结果-------敌人出现伤区的位置---------我方角色变量K的累加过程
0---------------------都不出现-----------------------0+0+0=0
1---------------------2000----------------------------1+0+0=1
2---------------------4000----------------------------0+2+0=2
3---------------------2000和4000-------------------1+2+0=3
4---------------------6000----------------------------0+0+4=4
5---------------------2000和6000-------------------1+0+4=5
6---------------------4000和6000-------------------0+2+4=6
7---------------------2000和4000和6000----------1+2+4=7
这类检测通常有重复性,因此在每次检测完毕后,应该在适当时候给K清零(一般是在下次检测开始时先清零再检测)
2014年02月21日 23点02分
7