mugen之家吧 关注:840贴子:4,490
  • 1回复贴,共1

转载.关于CNS文件的制作(2)

只看楼主收藏回复

a. Mugen的Finite State Machines总览 
b. States的导言 
c. State的基本部分 
d. StateDef的详细资料 
e. State控制指令的详细资料 
f. common1.cns 


------------------------------------------------- 
III.a. Mugen的Finite State Machines总览 
------------------------------------------------- 

本节介绍一种在Mugen中建立的人物创造工作(启发式的):finite state  
machines。(方可的翻法是:有限量的状态集机体) 这并不是特别的技术,but  
it is aimed at the analytically minded reader. 如果你已熟悉 finite  
state machines 或对其细节不感兴趣,可以放松一点跳过去。 

Finite state machine(以后简称FSM)是一个用有限量的子程序设定的“自动 
机”。每一个子程序都执行一些功能函数且按一定准据跳到下一个子程序中去。 
这些子程序被称为一个"state",而FSM存在于一个State里并按该State的指示 
处理当前项。一个FSM在任何时候都只能存在于一个State里。 

下面是FSM的一点简单的例子,伪代码如下: 

State 0: 
1. Read in a number. 
2. If the number is 0, go to state 0. Else, go to state 1. 

State 1: 
1. Print "Woohoo!" 
2. Go to state 3. 

State 2: 
1. Go to state 0. 

State 3: 
1. Quit 

假设该FSM启动于state 0且得到一个值0。则会转回到state 0,去读另外一个 
数。继续直到FSM读到非0值,照指向转到state 1。在state 1里,FSM打出 
"Woohoo!"并转到state 3。State 3引起FSM退出。在本例中State 2未被执行。 

这里可能是一个格斗游戏人物的FSM。 

State 555: 
1. 试图攻击别的家伙。 
2. 如果成功,而玩家接着攻击,就到state 555(连续攻击)。 
3. 如果成功而玩家没有接着攻击,播放回复动作。 
4. 如果没有成功,播放打空动作。 
5. 回复/打空动作完成后,转向state 0。(idle). 

人物在MUGEN里就是一个FSM。人物的CNS定义了State号,每一个State包含了 
一个或多个状态控制指令(state controllers)。State控制指令事实上赋予 
了人物机能,类似于上面给出人物的FSM的指令。例如,控制指令—HitDef  
使人物攻击对方,控制指令—ChangeState使人物转换State,而控制指令— 
ChangeAnim是人物播放指定的动画(animation)。每个State控制指令由一些 
测试条件发动,称为"triggers"或"condition-type triggers"。当满足条件 
controller就被执行。 

每个Mugen人物有三个特殊States,编号-1,-2,和-3。负号的State 
是合法的只有这些。State -1一般包含由键盘输入(commands)决定State转换 
的判断准则。State -2包含其他每一时刻都在判断执行的controllers。 
State -3包含也是每一时刻都在判断执行的controllers,但除去人物暂时处 
于对方State的情况(如,人物被投中)。 

在游戏时间的每一个tick,MUGEN简单的从头到尾测试这些特殊states,以升 
序处理(-3,-2,再-1)。遇到每个state controller,其中的triggers就判别是 
否,如果满足,controller就执行。然后接着判别下一个。在这些特殊State 
中的transition(ChangeState)会使人物转向指定State号,但是不会中止特殊 
State的运行,这些特殊state里的所有state controller逐一检查完毕后,人 
物的继续运行,再次从头到尾。一旦State转换在该State里发生,剩下的同样 
的state controllers(如果有)就会被跳过,(这里方可有点疑问,这一句翻译 
插进了自己的话,请各位研究一下原文)然后继续从新State的开头运行。当到 
达当前State的结尾处而没有发生任何State转换,该tick的运行终止(halt)。 

上述情形有一点例外。如果人物是个“援助”("helper")人物, 也就是说,是 
由state controller—Helper产生的,这人物就不会有states -3和-2。援助 



1楼2008-12-05 11:39回复
    人物也没有state -1,除非激活了它的键盘输入(state controller—Helper产 
    生援助人物时设定。) 

    技术上的注意事项: 人物的状态机体应该认为是一个“不纯”的FSM,因为有一 
    些隐含的State转换规则不是用户指定的。例如,攻击人物引起的State转换不 
    是在人物CNS里有明确代码的。此外,一个简单的CNS state远复杂于一个典型 
    的作用于数学和计算机学的FSM。无论如何,你找不到一个严格的定义关于特别 
    适用于在Mugen下工作的FSM。 


    ----------------------------- 
    III.b. States的导言 
    ----------------------------- 

    规划states是制作人物最艰苦的一关。这要承担很多的工作、测试、不时的尝 
    试和错误。在本节中,因为经常谈及要做的人物和它的对手。不如称编辑中的 
    人物为P1,其对手为P2。 

    第一次看这文件如果不明白请不要泄气。学习States最好的办法是首先玩玩看 
    完成的人物的CNS的那些值,看看对人物起什么作用。不要害怕“拧”CNS; 
    M.U.G.E.N原有监测语法错误并报告的功能。(方可:嘿嘿,功能不算太强) 

    包括在M.U.G.E.N发布包里有一个人物叫功夫人(简称KFM),可以在目录 
    chars/kfm下发现。 

    CMD文件包含了command的声明和State -1的定义, 有关人物怎样对输入反应的 
    特殊State.参看CMD文件以获得更多信息。(这句好像是微软老说的) 

    这里是一些让你知道的有用概念。 
    1. 生命和能量/Life and power 
    2. 控制/Control 
    3. 游戏时间和State时间/Game-time and state-time 
    4. 位置、速度、加速度/Position, velocity and acceleration 
    5. 连击/Juggling 

    1. Life and power 
    人物这边顶部的黄色条就是血条。血条空了就是KO了。蓝条是能量条,到一定 
    值就能发超杀了。(方可:玩你这个的有不知道的吗?) 

    2. Control 
    当说人物"在控制",意思是说他准备走或跳或攻击。不在控制的人物不会对输 
    入(键盘或手柄)有反应。例,P1在站立中,如果在控制则按前键就会往前走。 
    一般人物在攻击状态下时不在控制的,否则打到一半又会跑开。 

    这规则还是有例外的。有些时候即使不在控制,也会在特定State发出某些招, 
    这叫"招式打断"或"招式取消"。具体请看CMD文件。(方可:其实这是很自由的, 
    以上说的只是通常情况,并非规矩) 

    我们常常要涉及控制标记(control flag)。这个标记值不是true就是false。 
    如果说control flag是true,那就是他在控制下。 

    3. Game-time and state-time 
    M.U.G.E.N记下游戏中经过的时间,任何时间游戏在刷新(Update)(包括刷新人 
    物状态,检查碰撞块,画屏幕),我们说的game-time就是由此增加的。 
    人物在State里花费的时间叫"state-time"。State-time当State开始的时候设 
    为0,然后每game-time的一个tick,他也增加一个tick。 

    4. Position, velocity and acceleration 
    位置、速度、加速度是描述物体运动的量。学过高中物理就可以玩得很转了吧, 
    要是学过高等数学,那就只有它们怕你的份了。还不行的话来找方可帮你补课 
    吧。M.U.G.E.N用的是相同的系统。 
    X-position越大, 人物就越往右边。越小,则靠近的人越往左边。 
    Y-position为0时在地面上。人物的Y-position越大越往下。负的Y-position 
    就是升天了。 
    同样的,正的X-velocity,是前进。负的就是后退了。正的Y-velocity是往下 
    跑,负的就是又升天啦! 
    正的X-acceleration往前加速,负的是往前方减速。Y-acceleration同理。 
    (总算会简单点说话了,累死我了) 

    5. Juggling 
    M.U.G.E.N可以让一个动作"juggle",就是说,攻击一个被打到空中或倒在地 
    上的对手。 
    连击系统是这样工作的:每个人开始第一次攻击时设定一些juggle点数让他们 
    倒(fall),一般是15。(请看人物变量部分) 
    术语快递:人物fall的意思是,该人在空中没有回复到control,就要掉在地 
    上。 
    人物在fall在空中或倒在地上遭到连击时,他的juggle点数就会减少掉此攻击 
    State中设定的值(juggle)。如果遭到攻击需要的juggle点数少于人物剩余的 
    juggle点数,则此招落空。任何引起对方fall的动作在第一击时马上会扣去 
    juggle点数。 
    例, 某攻击需要7点juggle点数,理论上他就可以连击两次(假设初始值15点), 
    然后还剩1点,那么以后的该攻击就落空了。 
    设定这个系统的目的是防止无限连击。 
    现在方可再说两句,以前在下对这个参数先是不明白,有点明白后实现起来又 
    不太顺手。因此做人物一概不理这个参数,所有防止无限连击的都是通过其他 
    参数完成的。现在Mugen在中国又被称为乱舞格斗,应该是Dao版引起的,乱舞 
    固然是漂亮的(方可本人不承认这点),但是失去了理性的东西就不免落于下乘。 
    有的人物连击就不太合理,甚至一招连杀。去调整这个参数其实表面效果看不 
    出,但实际工作量还是挺大的。因此很多作者都置之不理。最近看了K'2000后 
    发现他的juggle值设得很详细,甚至是以表达式而不是常数来设定的。虽然没 
    看过是否合理,但方可还觉得肃然起敬,在完美的做功和强大的AI背后是有深 
    刻的内涵的,完美的人物正该如此。 
    方可不是要要求大家怎么样,只是个人的想法,和大家一谈而已。 
    


    2楼2008-12-05 11:39
    回复