发信人: dennyzeng2() 
整理人: metalsolo(2001-08-02 17:16:23), 站内信件
 | 
 
 
III.c. State的基本部分
 -----------------------------
 
 注意:本节假定你至少看了有关Air的文件并掌握了animation的概念。明白一
 些Action里的关键词汇的意思如action,element等。
 
 这里是P1的一个短例子:
 
 [Statedef 200]
 type = S
 physics = S
 movetype = I
 ctrl = 0
 anim = 200
 velset = 0
 
 [State 200, 1]
 type = ChangeState
 trigger1 = AnimTime = 0
 value = 0
 ctrl = 1
 
 这个state播放P1 animation的Action 200,还当animation播完后返回到站立
 State。本例中,假定Action 200是有限的播放时间。也就是说Action 200里
 没有任何一个elements时间设定是-1。
 
 在这点上,你不用担心细节。让我们来了解一个State的组成。
 
 所有states必须有一个单一的Statedef节和一个或多个State节。
 
 Statedef包含了开始State的开始信息,如是哪种类型的姿态(站、蹲、空),
 哪种类型的动作(攻击、空闲)。
 
 每个State节要有一个state controller或一个简化controller。Controllers告
 知程序如何和何时对P1做动作。有各种类型的controllers,每个都有自己的功能。
 如,改变人物的位置和速度,设定攻击动作,创造飞行道具,改变animation
 Actions,改变states,等等。每个controller必须有至少一个触发条件(trigger)。
 Trigger是一个事件将controller激活。例如:开始State是触发,完成animation
 时触发(看上例),当animation Action的某一Elem时触发,当P2处于P1的某个State
 时触发,等等。
 
 
 
 --------------------------
 III.d. StateDef的细节
 --------------------------
 
 每个state必须开始于一个StateDef组,上述的Statedef节。一个StateDef组必须
 看起来像这样(在点的地方加入更多参数):
 [Statedef state_number]
 . state_parameters
 .
 .
 把state_number换成你编写的State号。不要用特殊组号(见附录A),还有0-199,
 5000-5999。
 
 下列是必须要的参数:
 1. type
 2. movetype
 3. physics
 4. anim
 
 1. type
 角色的目前状态。定义他是站立、蹲下、空中或倒地。相应的值分别是"S","C",
 "A"和"L"(不包括引号)。缺省值是"S"。保持前一个State的状态不变用值"U"。
 一般常用的是"S","C"和"A"。如,蹲态的State类型需要下面一行:
 
 type = C
 
 Type会确定几个要素,最重要的是P1被击中时的反应。例如,在"stand"-type
 state,P1会对作用于地面的攻击起反应(被打中)。而在"air"-type state,
 P1就对此没有反应。
 
 2. movetype
 这是指P1的动作是在干什么:"A"是攻击,"I"是无作用(idle),"H"是被攻击。
 保持前一个State的movetype不变用值"U"。缺省值是"I"。"A"和"H"就不用说
 了。"I"就是P1不攻击也不是被打。(回避,自由下落等等)如,攻击的State
 movetype需要下面一行:
 
 movetype = A
 
 一定要指定movetype,这样程序才能正确处理该State。错误赋值movetype会使
 P1行动错误。
 
 3. physics
 必须指定state里角色的性状。合法的类型有"S"站立,"C"蹲下,"A"空中,"N"
 是无特性。保持前一个State的physics不变用值"U"。缺省值是"N"。physics的
 类型能确定角色的行为表现。
 
 "S" physics,P1将受到地面摩擦,以前设的stand.friction(见第二节)。
 "C" physics, P1将受到地面摩擦。(crouch.friction)
 For "A" physics, P1会加速下降,如果Y-position大于0(也就是:碰到地面),
 就会立即转入着陆state。
 如果用"N",P1就不会有这些预编制性状。
 
 不要把"physics"和"type"混起来。通常情况下它们是一样的,但是如果需要更
 强的控制,要用"N"(no physics),然后自己定义你的下降加速度和着陆检测。
 
 以A为例,实际上效果相当于在该Statedef下有这两个State:
 
 [State 000,0]
 type = VelAdd ;加速Controller
 trigger1 = 1 ;永远满足条件
 y = Const(movement.yaccel) ;获取人物基本参数yaccel赋给变量Vel Y
 
 [State 000,0]
 type=ChangeState ;转State的Controller
 trigger1 = Vel Y > 0 ;当运动方向是下落时
 trigger1 = Pos Y >= 0 ;当人物位置超过地面时
 value = 52 ;转向State 52(Landing)
 
 如果要定义不同的下降加速度,或不同的着陆检测,或不同的着陆转向等。就
 需要设定physics=N,且用自己的编写代替,如
 
 [State 000, 0]
 type = VelAdd
 trigger1 = 1
 y = Const(movement.yaccel)/2 ;以通常加速度的一半下降。
 
 大部分复杂的空中动作都不能用A而需用N,但是用N的话VelAdd和ChangeState这
 两个State必须存在。因为State不会默认有这两个操作,没有的话人物不是飞上
 九天就是钻到地下。
 
 
 4. anim
 该参数改变P1的Animation Action。指定值为action号。如果不想让P1改变anim,
 就省略此参数。
 
 现在你在state 400,人物要播放蹲攻击--Action 400, 正式的参数表示是:
 
 [Statedef 400]
 type = c
 movetype = a
 physics = c
 anim = 400
 
 
 你可用的其他可选参数:
 4. velset
 5. ctrl
 6. poweradd
 7. juggle
 8. facep2
 9. hitdefpersist
 10. movehitpersist
 11. hitcountpersist
 12. sprpriority
 
 4. velset
 在State开始的时候可以用velset来设定P1的初速度。格式是个数字对,分别
 为x速度和y速度。省略就是保持P1原来速度不变。例如:
 velset = 4,-8
 使P1以斜上前方开始运动。速度方面有个例外,即使velset=0,攻击在角落里
 的P2会使P1推开。
 
 5. ctrl
 设定P1是否受控制的参数,"0"为false,"1"设为true。省略的话,P1的控制
 标记不会改变。例如:给予P1受控制,用
 ctrl = 1
 
 6. poweradd
 当进入该State,poweradd参数增加P1的power。值为数字,可取正负值。该参
 数一般用于攻击动作中,当你想让P1出招就获得能量。例如:要加40点能量,
 写:
 poweradd = 40
 
 7. juggle
 juggle参数只对攻击动作有效。是指该攻击需要多少juggle点数才能实现,如
 果省略,该攻击就会总是连击成功只要前一招是成功连击的。对于每个攻击
 State,你都该设定此参数。如果一个攻击动作跨越几个State,只要在第一个
 State里设定。Juggling在第三节a里有详细解释。
 
 8. facep2
 如果有一条"facep2 = 1",P1就会转向P2相同的方向。所以默认值是"0"。
 
 9. hitdefpersist
 如果设为1,该State里设定的任何HitDefs(攻击信息)在State转向后依然有效,
 如果是默认值0,转向后HitDefs就会失效。
 
 10. movehitpersist
 如果设为1,前一个State里的攻击效果信息(是击中,击空,还是被防住了)就
 会保留到这个State。如果是默认值0,这些信息将在进入这个State时被复位。
 
 11. hitcountpersist
 如果设为1,前一个State里的连击数信息就会保留到这个State。如果是默认值
 0,这些信息将在State转向时被复位。这个参数和屏幕上的连击计数没有关系。
 可以看trigger文件的hitcount和uniqhitcount部分来了解如何检测连击数。
 
 12. sprpriority
 这个参数有的话,人物的图片就会画载指定的图层(sprite layer)。省略的话
 就保持原图层不变common1.cns(公用继承的CNS文件)定义了站,蹲的默认图层
 是0,跳跃的图层为1,大多数攻击的图层为2,所以攻击者会在前面。
 可以看controller文件的SprPriority部分来了解如何改变人物图层。
 
 
 -----------------------------------
 III.e. State控制指令的详细资料
 -----------------------------------
 
 e.1 Controller格式
 e.2 Triggers
 e.3 常用controllers
 
 
 III.e.1 Controller格式
 -------------------------
 
 所有必须要至少一个state controller,否则会引起错误。State controller
 组的格式如下:
 [State state_number, some_number]
 type = controller类型
 trigger1 = 条件表达式
 . 普遍可选参数
 . controller的附加参数
 .
 .
 
 State_number一定要同该State的statedef号相同。(不相同没关系,不过为了
 你自己好…)some_number可以任选一个数字;(不光是数字,你就是写"天上天
 下、惟我独尊"也没关系,可以用你认为清楚的表示。)报错的时候会报告发生
 错误的state_number,some_number,这样你就可以知道哪里该修正了。(乱写的
 话,吃苦头的是自己。)
 
 普遍可选参数(所有的state controllers通用)是参数ignorehitpause和
 persistency。
 如果ignorehitpause设为1,即使人物处于hitpause(被击中时的停顿,在Hitdef
 里有设定),MUGEN 仍会检查该controller。否则在hitpause期间将不检测。除了
 一个特殊情况下默认值都是0。(方可不知道那个情况是什么。)
 参数persistency的解释,请看有关trigger persistency的章节。
 
 controller类型是你用的controller的名字。每种controller有不同的功能,需
 要不同的参数。请看sctrls.txt中完整的state controllers列表。
 
 Controllers的顺序是重要的。如果需要,排在前面的Controller先被激活。
 
 这是一个在开始State时赋予P1 control的例子。(效果等同于在StateDef中设参
 数ctrl = 1)
 
 [State 300, 1] ;State 300. 1 是任意数。
 type = CtrlSet ;Changes the control flag.
 trigger1 = Time = 0
 value = 1
 
 在这个例子里,CtrlSet可以改变P1的控制标记。trigger1=Time=0意思是
 controller在state-time为0时激活,也就是说,这个State的开始。value = 1
 这行表明要将控制标记设为1,也就是true。如果想使P1开始时进入不能控制状
 态,该把最后这一行改为value = 0。
 
 我们看另外一个例子吧。该controller使P1向前移动10个象素两次:在Anim action
 的第二、第三个图片元素(element)。对于controller跟随的参数不了解不必担心,
 可以从state controller文件(sctrls)中得到更多信息。
 
 [State 300, 2]
 type = PosAdd ;增加P1位置
 trigger1 = AnimElem = 2 ;在第二个element触发
 trigger2 = AnimElem = 3 ;在第三个element触发
 x = 10
 
 正如上述,每个controller必有至少一个trigger。Trigger是一个让controller激
 活的条件。这个例子有两个triggers,controller 在任意一个为真时激活。
 
 
  | 
 
 
 |