本章主要讲飞行道具类的技能,比如波动拳这种。前面讲过人物招式的代码构成,这里就不再重复。
飞行道具主要通过projectle或者addhelper类型的state来实现,现在用helper的更多些,主要是比较自由。由于中文功夫男没有飞行道具,所以我们用别的人物来作为实例。
一、projectile类做法
首先来介绍一下这个state类型,该类型作用是为游戏者创建一个飞行道具,也就是说一个招式里必须有一个state类型为projectile的才行。另外,飞行道具(Projectile)控制器包括所有HitDef飞行道具部分的参数。
以下为实例,可以看到有damage这种hitdef的参数,因为projectile拥有大部分hitdef的参数:
[State 1400]
type = Projectile
trigger1 = AnimElem = 7 ;这是个trigger条件判断,表示该动作的第7张图时触发
projid = 1400 ;指定涉及的该飞行道具ID号。若指定应为正。
projanim = 1410 ;为使用飞行道具的动画而指定动画的动作号,也就是飞行道具本身。如果省略缺省为0。
projhitanim = 1411 ;当飞行道具击中对手时指定播放动画的动作号,例如一个波打中对手后这个波会爆掉,这个动作号就是指波爆掉的动画。若省略,缺省为-1(不改变动画)。
projremove = 1 ;设置非0值使得飞行道具在击中后被移除,或0取消该行为。缺省为1。
projcancelanim = 1411 ;当飞行道具被移除(由于时间到期或击到它的移除边缘,等等)时指定播放动画的动作号,大部分情况下和projhitanim一样。若省略,将由projhitanim代替。
projremovetime = -1 ;指定飞行道具应从屏幕中被移除时间帧(tick)数。缺省为-1(永不移除)。
offset = 75, -50 ;指定飞行道具被创建时的x和y坐标偏移量。若省略,两个参数都缺省为0。该偏移量参数的准确行为依赖于postype(参数)。
这里有个小技巧,可以在FF中根据方块的大小来估算一个飞行道具出现的大概位置
velocity = 7.5, 0 ;指定飞行道具行进的x和y的初速度。若省略,缺省为0,0。
Postype = p1 ;type_string指定postype——怎样说明(解释)pos参数。任何情况下,正的y坐标偏移量表示向下的位移。
attr = S, SP ;从这里开始往下都是hitdef的参数,基本攻击招式时介绍过,详情请查阅hitdef词典,这里就不复述了。
animtype = Hard
damage = 70, 8
pausetime = 0, 13
guardflag = MA
hitflag = MAF
sparkno = s7004
guard.sparkno = s7102
sparkxy = 0, 10
hitsound = s2,10
guardsound = s3,1
ground.type = High
ground.slidetime = 16
ground.hittime = 18
ground.velocity = -8.0
ground.cornerpush.veloff = 0
air.velocity = -4.0, -8.4
air.cornerpush.veloff = 0
yaccel = .50
air.fall = 1
实例中省略了一些projectile的参数,细则可以去查阅sctrl词典。基本上简单的飞行道具都可以用projectile来实现。而如果飞行道具有特殊效果,比如命中敌人后产生二次爆炸什么的,那就必须要用helper来做了。
二、helper类做法
helper这个state类型是很常用的一个类型,虽然官方说明中的作用是创建另一个游戏者实例作为一个援护人物,不过现在常用于飞行道具、援护人物(如jojo的替身)、以及距离检测等非常规手段,功能非常强大,因此可以实现很多projectile实现不了的飞行道具效果,但制作也比projectile要复杂。
以下是用helper做飞行道具的实例:
1、先在放出飞行道具的那个招式里加上这个state。
[State 1000, ヘルパー]
type = Helper
trigger1 = AnimElemTime(2) = 0
helpertype = Normal ;若helpertype = normal,则该援护者允许离开屏幕边缘。此外,镜头不会试图保持援护者在屏幕内
name = "Projectile" ;指定该helper的名字,该名字应被加上双引号。如果省略,该名字缺省为“
id = 7000 ;设置一个相关该援护者的ID号。缺省为0。
stateno = 7000
size.xscale = 1*Const(Size.XScale);helper的横向缩放比例,这里指helper是和本体缩放比例一样
size.yscale = 1*Const(Size.YScale);helper的纵向大小
postype = P1 ;说明pos相对于p1的坐标轴。正的x偏移量是朝向p1的前方。p1是postype的默认值。
pos = Ceil(20*Const(Size.XScale)),Ceil(-39*Const(Size.YScale))
facing = 1 ;postype的值如果为非p2且facing为1,援护者将与游戏者面向相同的方向。
keyctrl = 0 ;如果keyctrl = 0,则该援护者不受指令输入的影响,并不能继承State -1。keyctrl默认值为0。
ownpal = 1 ;如果ownpal = 1,则援护者将用他自己的色表,不受创建者色表改变的影响,例如本体中了火焰,色表临时变为红色,为0时,援护者也会变色,为1时,援护者不会因此改变。默认为0。
supermovetime = 0 ;在SuperPause(超级暂停)中决定援护者应被“unfrozen(解冻)”的时间帧(tick)数。通常在你想要援护者在SuperPause时露面时有用。默认为0。
pausemovetime = 0 ;在Pause(暂停)中决定援护者应被“unfrozen(解冻)”的时间帧(tick)数。默认为0。
2、再创建一个statedef,来定义刚刚创建的helper的具体参数
;指定刚刚创建的helper的动画和基本参数
[Statedef 7000]
type = A
movetype = A
physics = N
anim = 7000
velset = 2.5,0
sprpriority = 4
;这段是定义helper的攻击参数
[State 7000, ヒット定義]
type = HitDef
trigger1 = AnimElemTime(1) = 1
attr = A,SP
damage = 100,0
animtype = Medium
air.animtype = Back
guardflag = M
hitflag = LHA
priority = 4,Hit
pausetime = 0,15
sparkno = -1
guard.sparkno = -1
sparkxy = 0,0
hitsound = S5,0
guardsound = -1
ground.type = High
ground.slidetime = 40
ground.hittime = 15
ground.velocity = -3.5,-5
guard.velocity = -7
fall = 1
air.type = High
air.hittime = 10
air.velocity = -3.5,-5
air.fall = 1
;这段表示该helper无法被攻击
[State 7000, 無敵]
type = NotHitBy
trigger1 = 1
value = SCA,AA,AP,AT
time = -1
ignorehitpause = 1
;这段表示该helper没有影子
[State 7000, 影無し]
type = AssertSpecial
trigger1 = 1
flag = NoShadow
;这段表示该helper超出边缘30时销毁自己,这里是和projectile的一大区别,因为projectile不能自由定义什么时候销毁自己
[State 7000, 消滅]
type = DestroySelf
trigger1 = FrontEdgeDist <= -30
;这段表示当该helper命中目标时,跳转至statedef为9000的状态
[State 7000, ステート変更]
type = ChangeState
trigger1 = MoveContact = 1
value = 9000
3、再创建一个statedef,来定义helper命中目标后的效果
;指定helper消失时的动画和基本参数
[Statedef 9000]
type = A
movetype = I
physics = N
anim = 9999
velset = 0,0
sprpriority = 4
;这段表示该helper没有影子
[State 9000, 影無し]
type = AssertSpecial
trigger1 = 1
flag = NoShadow
;这段表示该helper在该状态第一帧时销毁自己
[State 9000, 消滅]
type = DestroySelf
trigger1 = AnimTime = 0
以上就是用helper来制作一个常规飞行道具,理解了上面的结构就可以根据自己需要在适当的地方加state来实现很多额外效果了。