M.U.G.E.N格斗游戏引擎简介by AKara 2011-10-23 @
http://blog.csdn.net/akara @ akaras(at)163.com @
weibo.com/akaras M.U.G.E.N 是经历了12年的(1999-2011)格斗游戏引擎(http://elecbyte.com),
官方称已忘记它的缩写:本是一个射击游戏,但MUGEN日文意思是:无限 (unlimited)。
稍微详细的信息推荐前往官网或wiki:
http://en.wikipedia.org/wiki/M.U.G.E.N 本文分 4 大部分简介M.U.G.E.N(2011 v1.0)的机制:
(1)
术语:格斗/动作游戏的术语非常多,M.U.G.E.N中出现的只是一部分,不过足矣。
(2)
核心:精炼格斗系统5要素:1.anim 2.state 3.state controller 4.trigger 5.command
(3)
其他:control api, trigger api, .def, .sff, .ai, storyboard
(4)
总结:总结。
身为一个曾经的KOF高手,同时身为一个按轻脚通关M.U.G.E.N并看到如下画面的玩家,
激发了我简单翻译和整理一下M.U.G.E.N功能的热情。
---------------------------------------------------------------------
术语---------------------------------------------------------------------
基础篇* P1:己方
* P2:对手
* round:回合
* has control:受控(受键盘事件)
* not has control:不受控
* attack boxs:攻击判定盒s
* hit boxs:受击判断盒s
* power bar:能量槽
* helper:援助者
* parent:helper的召唤者(仍可为helper)
* root:helper的根玩家
* KO:KO(又称kill)
招式篇* move:动作(广义)
* attack:攻击(狭义的move,常与move混称)
* trip sweep:下盘attack
* throw:投技
* special:特殊技(方向+按钮)
* super:超杀击(又称hyper)
* projectile:飞行道具
状态篇* hit:受击
* stand:站立
* crouch:蹲下
* miss:miss
* dodge:躲避
* guard:防御
* air:空中has control的状态
* fall:空中not has control的状态
* lying down:倒地not has control的状态
* ground:指地面一切has control的状态
* slide:hit导致的滑退
* recoil:从pause回复到has control
* back:击倒
* up:浮空(垂直击起)
* diaup:击飞(又称吹飞:向后击起)
* pause:硬直(hit/attack均有)
* superpause:super导致的pause
进阶篇* charge-move:蓄气技(按键指定时间才可发动)
* chain-move:连续技(要求对方处于get-hit state)
* connect:attack成功产生hit(有时特指发生chain-move)
* contact:attack成功产生hit或attack被guarded
* block:截击(又称counter,指从attack起手打断)
* move cancel:取消(又称move interrupt,指技巧性缩短pause)
* juggle:追击(对fall或lying down的角色进行attack)
* juggle point:追击点(attack和P2均携带,此设定防止无限追击)
* superarmor:超级护甲(受击后除了扣血,不应用任何效果(物理...)
另有partial superarmor,指不能忽视throw, AOE super)
* grazing:掠步(可过projectile)
设计实现篇* state:状态
* FSM:Finite State Machine
* transition:state间的跳转
* command:键序
* trigger:触发器(condition-type / function-type)
* trigger redirection:触发器(属主)重定向(parent / root / helper / ...)
* state controller:简称controller:
由trigger触发指定control api实现指定功能。
M.U.G.E.N中state controller与control api常混称;
为免混淆,下面state controller与control api严格区分。
* time:时间,M.U.G.E.N中所有时间的单位均为tick。
* game-time:round开始时置0,每tick加1
* state-time:state重入时置0,每tick加1
* anim:动画(M.U.G.E.N中常与action混称)
* anim-time:anim开始/结束时置0,每tick加1
* anim-element:anim的element下标(anim由N个element组成)
* looptime:一个anim的所有times字段值之和;如有一值为-1即总为-1
* no loop anim:looptime为-1的anim(不会重头播放)
* clsn1:attack boxs(编辑态显红色)
(常不设于anim-element 1,否则瞬发伤害不可block)
* clsn2:hit boxs(编辑态显蓝色)
---------------------------------------------------------------------
核心---------------------------------------------------------------------
M.U.G.E.N将格斗系统精炼为 5 种核心要素:
(1)
anim (2)
state (3)
state controller (4)
trigger (5)
command 而且都支持文本化配置,强大地定义格斗中的方方面面!
下面逐个简介。
anim(.air)* 配置实例:
[Begin Action 200]
Clsn2Default: 1
;定义默认hit boxs Clsn2[0] = -10, 0, 10,-79
0,1, 0,0, 7
; group,image, offset_x,offset_y, times(-1表示inf) Clsn1: 1
; 定义element 2有attack boxs Clsn1[0] = 27,-86, 64,-60
Clsn2: 2
; 定义element 2使用特殊hit boxs Clsn2[0] = 47,-31, -6, 0
Clsn2[1] = 17,-31, 47,-78
0,2, 0,0, 7
LoopStart
; 指定anim从这element开始循环 ; element 3以后没有attack boxs,hit boxs使用默认值 0,3, 0,0, 7
15,1, 0,0, 5, H
;<-- 水平翻转(做throw很方便) 15,2, 0,0, 5, V
;<-- 垂直翻转 15,3, 0,0, 5, VH
;<-- 水平+垂直翻转 15,4, 0,0, 5, ,A
;<-- 不翻转 + color Addition 15,4, 0,0, 5, H, S
;<-- 水平翻转 + color Subtraction 15,4, 0,0, 5, ,AS128D128
;<-- color Addition* 定义anim序列,应用于所有可视物件:
> 动作(move)
> 特效
> 背景动画
> 血条动画
> ...
state(.cns, .cmd)* 配置实例:
[Statedef 200]
type = S
; state的类型。最重要的作用是用于受击判断。
; S(Standing,默认) C(Crouching) I(In The Air) L(Lying Down)
; U(Unchanged, 保持上个state的type) movetype = I
; 当前动作的类型:A(attack) I(Idle,默认) H(being Hit) U(Unchanged) physics = S
; 物理类型。S(Stand,接受地面摩擦力) C(Crouch,摩擦)
; A(Air,加速向下直至y>=0落地)
; N(None,默认。不应用预设物理,此时可通过后续controller设定特殊物理)
; U(Unchanged) anim = 200
; 动画编号 velset = 0, 1
; x, y速度设置 ctrl = 1/0
; 是否可控,默认保持前state的ctrl poweradd = 40
; 本state为power bar添加的数值 juggle = 8
; juggle值 facep2 = 1/0
; 是否强制面向P2; 默认为0 hitdefpersist = 1/0
; Hit Def的开启或禁用 movehitpersist = 1/0
; move hit是否从上个state继承。默认0(即重置) hitcountperisist = 1/0
; hit counter是否从上个state继承。默认0(即重置) ; 可供trigger判断。 sprpriority = 0
; sprite渲染层次。(0)standing/crouching (1)jumping (2)attacking(使攻击态最上)* state ID分段规则
-3 unpause_heartbeat
-2 alltime_heartbeat
-1 alltime_heartbeat(command ONLY)
0-199 reserved
200-299 Standing attacks
300-399 More standing attacks, running attacks
400-499 Crouch attacks
500-599 More crouch attacks
600-699 Air attacks
700-799 More air attacks
800-999 Unused - use if you need more states
1000-2999 All special attacks
3000-4999 All hyper attacks
5000-5999 reserved
* helper角色:没有-3,-2;而-1有无取决于配置
* FSM:-3 -> -2 -> -1 -> 当前
* 该分段推荐和anim分段一致
* 两层优先级:player*.cns > common*.cns (.snd, .air亦然...)
state controller(.cns, .cmd)* 配置实例:
[State 200, 1]
type = [control api]
param1 = *
param2 = *
...
paramN = *
triggerall = [condition_exp_all_1]
triggerall = [condition_exp_all_2]
trigger1 = [condition_exp1]
trigger2 = [condition_exp2_1]
trigger2 = [condition_exp2_2]
ignorehitpause = [0/1]
persistent = [0/1/2/3...]
* 功能:满足triggers的触发条件后,
调用control api(param1, param2, ..., paramN)
* 任何statedef必须定义至少一个的controller
* 配置顺序敏感:配置越前,执行优先级越高
trigger(.cns, .cmd)* 配置实例:
[State 200, 1]
type = [control api]
param1 = *
param2 = *
...
paramN = *
triggerall = [condition_exp_all_1]
triggerall = [condition_exp_all_2]
trigger1 = [condition_exp1]
trigger2 = [condition_exp2_1]
trigger2 = [condition_exp2_2]
ignorehitpause = [0/1]
persistent = [0/1/2/3...]
* 上述triggers语义为:
if (triggerall AND triggerall) AND (trigger1 OR (trigger2 AND trigger2)):
control api(param1, param2, ..., paramN)
* 任一controller至少拥有trigger1
* 支持null trigger:debug
* condition_exp支持类似C语言的表达式,但数据类型只有3种:
> 32bit signed int
> 32bit float
> bottom(只由引擎隐式产生)
更像一个异常对象:除0/负数开方/对象不存在的exp结果便是bottom对象。
结果为bottom的trigger不触发。
> string(?)
* persistent参数用于修饰controller内所有trigger的持续性
0:本state一次进入/离开期间,只能触发一次
1:每次满足条件即触发(默认)
2:累积2次满足条件才触发
3:.........3次..............
command(.cmd)* 配置实例:
[Command]
name = "Two_quarter_circles_forward_plus_y"
command = ~D, DF, F, D, DF, F, y
time = time
;可选,指定command须在time内完成 buffer.time = time
; 可选,如command达成, ; 那它在本time内有效。
; 1表示瞬间有效;
; time越大combo越易:因可提早输入;
; 本参数对纯pressing系列(/F)不生效,
; 这系列command.buffer.time强制为1* 支持 8 个方向键:B, DB, D, DF, F, UF, U, UB
* 支持 6 个功能键:a, b, c, x, y, z
* 支持 5 种修饰符前缀:
(无修饰符则表示键必须press)
/:被修饰键必须pressing
~:被修饰键必须released
$:只能修饰方向键,语义:$D 等价于 /D, /DB, /DF
+:只能修饰功能键,语义:a+b 表示 a和b键同时被press
>:在被修饰键和前一个键定义间,如果有其他按键事件发生,则不成功。
如:a, >~a 表示在press a和released a这两事件间,不能有其他事件。
* 可以组合修饰:
~30$D, a+b 表示
先pressing (D或DB或DF) 30 tick,然后release,最后同时press a和b
* 连续出现的键,MUGEN会按固定规则强制转化,用作快进语义:
F, F 经强制转化后为 F, >~F, >F
* 简易发招考虑,motion command(如前四分一圆),应以~开始第一个键。
* 如一move使用两个同样的[Command].name而又有不同的[Command].command,
则两种command都可以发动该move。
* state -1(AtHc)出场:将command和state跳转联系起来
[State -1, controller custom name]
type = ChangeState
value = 1020
trigger1 = command ="Two_quarter_circles_forward_plus_y"
; 注:trigger1处command为一fucntion-type trigger api---------------------------------------------------------------------
其他---------------------------------------------------------------------
* control api 库(详看
HitDef )
* trigger api 库
* .def:各种预设参数。
* .sff:sprite。教程:anim序列基准点(脚,腰,头)
* .ai:
难度:基于人类1/6秒反应时间原则,调整CPU的反应时间。
功能:trigger(AILevel)+ control api + 定制state -1/any;
效果:实时取P1/P2/Env属性,当前tick反应,智能到无限。
http://www.elecbyte.com/wiki/index.php/AI
* storyboard:cutscene = anim + text + music + sound
---------------------------------------------------------------------
总结---------------------------------------------------------------------
啥都不说了,自己看
M.U.G.E.N DNF:
http://www.youtube.com/watch?v=95-E-NtJMuw---------------------------------------------------------------------
作者:akara 发表于2011-10-23 15:29:29
原文链接