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, Super AKara]
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
* 如需更細緻更潮流的設定,可往SF4 frame/box data參考。
---------------------------------------------------------------------
總結
---------------------------------------------------------------------
啥都不說了,自己看M.U.G.E.N DNF:
http://www.youtube.com/watch?v=95-E-NtJMuw
相關文章
---------------------------------------------------------------------
<<遊戲中的有限狀態機>> byAKara
http://blog.csdn.net/akara/article/details/6003703
---------------------------------------------------------------------