飞逝梦空 飞逝梦空
永远不放弃的追逐理想!
关注数: 1,252 粉丝数: 1,104 发帖数: 25,496 关注贴吧数: 40
MUGEN的舞台设定说明 舞台设定定义了背景与舞台的关系。舞台设定和背景必须在相同的舞台文件中。 构成舞台设定的是一些组。它们是: (所有的参数都是必要的,除非指明"可选") Info Group (信息组) name = stage_name 此参数设置舞台名称。必须写在双引号里。 displayname = display_name 此参数设置舞台选择列表中显示的名字。必须写在双引号里。缺省默认为stage_name。 versiondate = version 此参数设置舞台的版本号。能被接受的格式既可以是一个日期(MM,DD,YYYY)也可以使一个x.xx版本号,例如 1.23。 此参数为参考之用,当前不被引擎使用。 mugenversion = mugen_version 此参数设置此舞台用于的MUGEN版本号。有效值是2002,02,14或1.0。默认2002,02,14。 2002,02,14版本号限制摄像机移动到整个舞台坐标空间单位,而1.0允许摄像机位置设定为分数值? author = author_name 此参数设置舞台作者名。参数必须写在双引号里。 此参数为参考之用,当前不被引擎使用。 Camera Group (摄像机组) startx = pos_x 设置摄像机初始x位置。应该被设置成0。 starty = pos_y 设置摄像机初始y位置。应该被设置成0。 boundleft = min_x 这是摄像机能移动到的x坐标最小值。必须是负值。 调整此值可以限制摄像机往左平移多远距离。 boundright = max_x 这是摄像机能移动到的x坐标最大值。必须是正值。 调整此值可以限制摄像机往右平移多远距离。 boundhigh = min_y 控制摄像机能移动到的y坐标最小值。必须是负值。 调整此值可以限制摄像机往上平移多远距离。 boundlow = max_y 控制摄像机能移动到的y坐标最大值。一般情况必须是0。 verticalfollow = closeness 此值影响摄像机跟随最高点player的垂直运动。 此值必须在0到1之间。值为0表示摄像机不会向上运动。值越大使得摄像机追踪player越接近。 值为1表示摄像机尽可能近的追踪player。 floortension = v_dist 这是(在摄像机开始向上移动跟随player(移动)之前)player距离地面的最小垂直距离(以正值形式给出)。 tension = h_dist 在摄像机开始跟随player(移动)之前player能到达版边的水平距离。有效值从0到160。 PlayerInfo Group (玩家信息组) p1startx = x_start 设置player1初始x位置。 p1starty = y_start 设置player1初始y位置。 p2startx = x_start 设置player2初始x位置。 p2starty = y_start 设置player2初始y位置。 p1facing = facing_flag 控制player1初始将面向的方向。设置1面向右,-1面向左。 p2facing = facing_flag 控制player2初始将面向的方向。设置1面向右,-1面向左。 leftbound = x_min 设置所有player允许到达的最小x位置。 rightbound = x_max 设置所有player允许到达的最大x位置。 Bound Group (边界组) screenleft = min_dist_left player与屏幕左边界之间允许的最小距离。必须是正值。 screenright = min_dist_right player与屏幕右边界之间允许的最小距离。必须是正值。 StageInfo Group (舞台信息组) zoffset = v_dist v_dist是地平线与屏幕顶部垂直距离,单位是像素。 zoffset参数是不适当的命名,但为了兼容性所以没改过来。 zoffsetlink = elem_ID 如果指定这个参数,便使得zoffset的值与指定ID号的背景元素y方向位置产生链接。 例如,你能使用sin.y参数链接此值到特定的元素(见其他背景元素类型)使得人物以正弦方式上下摆动。 autoturn = turn_flag 保持这个参数(别去管他的意思)为1使得人物自动面向对方。 设为其他值将禁止这种特性。 resetBG = reset_flag 如果设置为1,背景将在每回合之间被重置。如果设置为0,背景将保持上回合状态并继续播放。 localcoord = width, height 舞台坐标空间的尺寸。缺省默认为320,240。 xscale = xscale 偏移量,速度,图片素材和动画 水平方向的缩放系数。 yscale = yscale 偏移量,速度,图片素材和动画 垂直方向的缩放系数。 Shadow Group (阴影组) intensity = darkness_val ;(可选) 控制阴影的色深。有效的取值范围是从0(最亮)到256(最暗)。缺省默认是128。 color = r,g,b ;(可选) 此参数影响阴影的颜色。r,g,b是player影子的颜色分量值(介于0到255之间)。 数值越高,阴影中相应此颜色的'数量'越少。反之亦然。数值越低,阴影中相应此颜色的'数量'越多。 缺省默认是0,0,0。 yscale = scale_y ;(可选) 阴影的垂直缩放系数。scale_y的值越大使得阴影越长。 你能设置scale_y为负值使影子落在player的另一边。缺省默认是0.4。 fade.range = top_y, bot_y ;(可选) 此参数设置阴影的可见度范围。 用来创建一个阴影可见度渐变效果就像player远离地面。 第1个值是上限水平线,第2个是中段水平线。都代表player的y坐标。 如果player在上限水平线的上方则他的影子将不可见,如果在中段水平线的下方将完全可见。 阴影在两条线之间渐变。缺省默认没有效果(影子总是完全可见)。 注意y坐标值是负的,TOP_Y应该小于BOT_Y。 Reflection Group (反射组) reflect = reflect_flag ;(可选) 设置reflect为1使得能够反射阴影(俗称倒影效果),0则不能。 反射阴影创建一个"光亮的地板"效果。缺省默认是0。 Music Group (声音组) bgmusic = bgm_filename ;(可选) bgm_filename是背景音乐的名字。声音文件一般放置在sound/路径下。 缺省将不播放背景音乐。如果指定的音乐文件不存在,也将不会播放音乐。 若要播放CD音频,写出音轨号然后写上".da"。使用音轨号0将随机播放一个音轨。例如,要从CD音乐中播放音轨3,使用bgmusic = 3.da。 缺省默认没有音乐。 bgvolume = volume_offset ;(可选) 此参数调整背景音乐的音量。0是普通,负值变小,正值变大(仅对mp3,mod,cda格式音频起作用)。 有效值从-255到255。缺省默认是0。
MUGEN的背景元素说明 注:元素指的是某部分的组成元素,这里背景元素指的是组成背景的每一部分被定义的图像素材。 通常一个背景有n个被定义的图像素材组成,定义图像素材就是定义图像的位置,速度,形式(图片形式,动画形式...)等等。(通俗来说背景就是很多元素拼接起来的) 定义舞台的背景元素,你必须首先在DEF文件末尾新建一个BGDef组。格式如下: [BGDef] spr = stages/my_stage.sff debugbg = 1 你应该把stages/my_stage.sff与包含你舞台图像素材的SFF文件放在一个路径中。 为了确保良好的运行速度,当你舞台完成时记住设置debugbg = 0。 一旦BGDef定义被新建,[BGDef]下面的所有东西都被认为是属于BGDef章节中的。 在BGDef章节中,你应该最少指定1个背景元素。 背景元素按它们出现在DEF文件中的顺序被绘制(后绘制的元素显示在先绘制的元素上方),所以最下方(最下层)的元素应该最先被定义。 (形象思考:如果我要画一幅画,首先我在一张草稿纸上先写上我画画的步骤: 1.绘制树木 2.绘制轿车 3.绘制美女 通过草稿纸上的1.2.3顺序来绘图,先画树木,再画轿车,再画美女。很容易就明白为什么上面说DEF先出现的背景元素绘制在后出现的背景元素下方。 当然,如果你把上述1.2.3每一步都绘制在一张完全透明纸上,即将树木绘制在透明纸上,然后放置在画布上,轿车绘制在另一张透明纸上,美女也是,最终按照这个顺序叠加在一起放置在画布上。 看上去的效果和没有用透明纸时是一样的,但是用了透明纸,我可以随时对每张透明纸进行修改同时不会影响其他透明纸上的东西。 比如我要在轿车上加上法拉利标志,如果没用透明纸,且标志所在的位置被美女挡住了一半,就很难绘制,如果用了透明纸,就能单独把轿车分离出来绘制,绘制完再把透明纸塞到原来的地方,甚至可以改变透明纸叠加的顺序。 背景元素绘制处理方式和透明纸很类似,当然说这些话只是为了有助于对绘制顺序的理解,在其他绘图软件中,透明纸就类似于‘图层’。) 静态型背景元素 指定一个静态背景元素的格式如下: [BG my_element_name] type = normal spriteno = 0,0 id = 0 layerno = 0 start = 0,0 delta = .5, .5 trans = none mask = 0 tile = 0,0 tilespacing = 0,0 window = 0,0,319,239 windowdelta = 0,0 许多参数可以省略。我们将一行行的解读这个例子: [BG my_element_name] ; (必要) 实际需要的其实只是[BG]。my_element_name可以是你想要的任何东西。 一般的,这能帮助给出每个元素独特性的、说明性的名字,因为"my_element_name"将出现在错误提示中。(一般都设置为定义的内容) type = normal ; (必要) 指定这个背景元素是静态图片素材,既不是动画型也不是视差型。 (normal-普通,所以也称普通型) spriteno = 0,0 ; (必要) 指定(要显示在此背景元素中的)SFF中的图片组号。 id = 0 ; (可选) 指定此背景元素ID号。 用于背景控制器控制指定ID号的元素。 必要时不同背景元素能够使用相同的ID号。 layerno = 0 ; (可选) 如果layerno = 0,则此背景元素绘制在人物下方。 如果layerno = 1,则此背景元素绘制在人物上方。 在背景元素层绘制顺序方面,是按照DEF文件中出现的顺序,从底层到顶层绘制。layerno默认为0。 start = 0,0 ; (可选) 指定背景元素(相对于屏幕顶部中心)初始位置。(正y朝下) 背景元素的坐标原点就在这个地方。缺省默认是0,0。 delta = .5,.5 ; (可选) 摄像机水平,垂直方向每移动1像素时背景元素应该移动多少像素。 设置 delta=1,1 将导致背景元素与摄像机移动速度相同。这对于脚下地面来说是合适的。 对于远景中的元素,将delta的值设置的小一点来创建深度错觉。 相同的,前景中的(layerno=1)元素一般设置的delta值大于1. 可以吧delta的值设置成负数,但是会有意想不到的效果。缺省默认为1,1。 trans = none ; (可选) 指定背景元素的透明度效果。透明度效果为none,add,add1,sub。 默认为none(不使用透明度效果)。add颜色叠加,add1 50%颜色叠加,sub颜色倒置。(详见trans控制器) mask = 0 ; (可选) 如果设置为1,图片色表上的0位置颜色将不会绘制出来。用来绘制不规则形状的物体。(也就是色表最后一格颜色会透明) 由于运行速度的关系,当不需要时尽量将mask设置为0。默认为0。 tile = 0,0 ; (可选) 分别设置背景元素在水平,垂直方向是否被平铺。 0表示不平铺,1表示无限平铺,若tile大于1,比如tile=3,表示元素被平铺3次。 缺省默认不平铺。(主要用于制作无缝背景,以及使背景能平移) tilespacing = 0,0 ; (可选) 如果设置了元素可以平铺,此参数分别指定平铺时相邻两张实例图片的水平,垂直间隔。 如果不可以平铺,则此参数无效。tilespacing默认为0,0。 window = 0,0,319,239 ; (可选) 指定4个坐标x1,y1,x2,y2组成的窗口。 屏幕左上角被假定为坐标原点(0,0),通过window参数设定的这2个点可以组成一个矩形((x1,y1)和(x2,y2)分别是这个矩形的对角线两个端点)。 任何给定时间内,只有这个矩形中的背景元素才能被绘制出来。 在这个例子中,window参数指定(0,0) - (319,239),范围是整个屏幕。如果不想使用这个效果,缺省这行。 windowdelta = 0,0 ; (可选) 指定背景元素窗口(就是上面说的矩形)中的delta效果。工作原理与背景元素自身的delta(上面的那个delta)参数相同。 在有些情况下,在delta和windowdelta中使用不同的值会形成很有趣的效果(两种情况配合使用)。 windowdelta默认是0,0 (不移动)。 动画型背景元素 指定动画型背景元素的格式几乎完全和静态型背景元素相同。 只有3处需要注意的不同之处,下面将介绍: [BG my_animated_element] type = anim actionno = 55 (除了spriteno之外的所有参数都与静态性背景元素相同) 首先,要使元素成为一个动画型,必须指定类型为anim。其次,必须指定动画号(actionno)。 这个地方代替了原来静态性元素的spriteno参数。 actionno的值必须是定义在此DEF文件中的一个动画。 在此例中,因为actionno是55,所以55号动作必须以类似下面的方式被定义: [Begin Action 55] 0,0,0,0,5 0,1,0,0,5 格式同指定在air文件中的动画是相同的,所以详细过程就省略了。 动作定义可以写在源[BGDef]组下面任何位置。 典型的做法是即可以在他所属的元素下方立即定义,也可以把用到的所有动作都写在一起,位置放在[BGDef]组的开始或者末尾处。 注意动画中使用的每张图片素材都有它自己的坐标。(SFF文件中指定) 当播放动画时,每张图片素材的坐标将被排列,对应背景元素自身的坐标。 tilespacing参数效果对于动画型元素和普通型元素是不同的。 对于普通型元素,此参数的x值指定了第1次平铺的右边缘与第2次平铺的左边缘之间的水平距离。 在任何动画型元素中,x值指定了第1次平铺的左边缘与第2次平铺的左边缘之间的水平距离。 y方向也相似。产生不同的原因在于动画的尺寸未必是常量。(因为图片是静态的,所以尺寸是常量,动画是图片构成的,每张图片尺寸不一定相同) tilespacing需要动画型元素使用平铺参数的这种特征。 动画型和普通型元素最后一个区别是动画型元素总是有mask = 1。 视差型背景元素 要查看视差型背景元素的例子,只要看KFM舞台的地面。(街霸2ce的地面就是这个效果) 视差型背景元素,顾名思义,给出视差幻觉。(当摄像机移动时,距离近的物体移动的较快,距离远的物体移动的较慢) 视差型背景元素必须包含一幅单独的图片(它们不能是动画)。它们也不能使用透明度效果。 示例格式如下: [BG my_parallax_element] type = parallax spriteno = 10, 0 xscale = 1,1.75 yscalestart = 100 yscaledelta = 1.2 其他所有参数和静态型元素一样,除了trans无效。 xscale两个参数分别缩放背景元素顶部和底部水平delta效果。(元素其余部分的delta效果在这2个值之间呈差值线性效果) 例如,我们指定delta = .78, .75,则摄像机每移动1像素,图片顶部将移动.78 * 1 = .78像素,图片底部将移动.75 * 1.75 = 1.3125像素。 xscale负责在水平方向创建视差效果。 yscalestart是当摄像机在地平线上时图像垂直逆缩放,用百分比表示。 例如,值100对应缩放系数是1,50对应缩放系数为2.默认值是100。 yscalestart(yscalestart/100) 加上 每摄像机单位时间摄像机向下运动的逆缩放系数 (yscaledelta/100 * camera_y),用百分比表示。 最终的缩放系数用下面的公式算出。 scale = 1 / (yscalestart/100 + yscaledelta/100 * camera_y) 上面的例子,如果摄像机向上移动1单位,缩放系数将是1 / (1.00 + .012 * -1) = 1.012,如果又移动了1单位,缩放将是1 / (1.00 + .012 * -2) = 1.025等等。 yscalestart和yscaledelta参数非直观的特征是由于历史原因造成的。 高级参数 必要时这些参数可以被加到任何背景元素中。 id = id_number 给背景元素指定一个ID号。不同的元素可以共享相同ID。 ID号作用是允许背景控制器指定要操作哪个元素。缺省默认是0。 positionlink = link_flag 设置positionlink为1可以固定此元素的位置到DEF文件中紧挨着它的另一个元素的位置。 如果设置为1,当前元素start参数值被视为是与上一个元素位置的偏移量。 delta参数在此情况下降无效。用于使一大堆元素整齐一致的运动。 如果你编辑positionlink链中的第一个元素的start和delta值,效果将在整个链中的所有元素中都体现出来。 缺省默认为0。 velocity = vel_x, vel_y 指定背景元素初始x,y方向速度。(默认为0) 此功能在背景控制器VelSet中也包含。 sin.x = amplitude, period, phase 指定元素在x方向的正弦运动。 第1个参数是振幅,第2个参数是运动周期(帧数),第3个参数指定初始正弦运动的相位偏移。(默认是0,例如,元素将正弦范围正中时开始运动) 这参数基本上被SinX背景控制器取代了。 sin.y = amplitude, period, phase 运行方式和sin.x相同,只是y方向。 其他背景元素类型 除了普通型,动画型,视差型背景元素类型,还有一个dummy(虚拟)类型。 人如其名,一个虚拟型背景没有相关的图形。一个虚拟型元素的位置就像被 随便其他什么任何元素类型 影响。 当前,虚拟元素的唯一用途是作为StageInfo组中zoffsetlink参数作用的一个占位符。
MUGEN的背景控制器 背景控制器操作一个内部计时器,计时器在每回合开始时从0开始计时,每个游戏帧增加1。 当计时器到达控制器起始的时间,则控制器变为激活状态。 当计时器到达控制器结束的时间,则控制器停用。 如果控制器指定了一个正的循环时间,则当循环时间到达时控制器的内部计时器将复位到0。 背景控制器必须以组的形式写在父级BGCtrlDef下。你能使用多个 BGCtrlDef将控制器分成几个组。 每个BGCtrlDef和背景控制器模块可以放置在DEF文件[BGDef]之内的任何位置。 这些模块的一般格式是: (格式类似StateDef) [BGCtrlDef my_controller_name] looptime = GLOBAL_LOOPTIME ctrlID = DEFAULTID_1, DEFAULTID_2, ... [BGCtrl my_controller_1] type = CONTROLLER_TYPE time = START_TIME, END_TIME, LOOPTIME ctrlID = ID_1, ID_2, ... (controller-specific parameters here) [BGCtrl my_controller_2] (等等) GLOBAL_LOOPTIME指定一个时间帧数,在这个时间之后BGCtrlDef将复位它的内部计时器,以及他包含的所有BGCtrl内部计时器。 要禁止循环时间,设置为-1或者缺省。 DEFAULTID_1, DEFAULTID_2, 等等, 指定将被 没有指定自身ctrlID列表的BGCtrl 影响的 背景元素ID号。 你能为此参数列出最多10个ID号。如果此行缺省,则默认将影响所有背景元素。 START_TIME, END_TIME, LOOPTIME是指定的时间,在这个时间点背景控制器应分别开始激活,停止激活,复位它的内部计时器。 如果LOOPTIME缺省或设置为-1,则背景控制器将不会复位它的计时器。(他的计时器仍然可以被他父级BGCtrlDef复位,只要GLOBAL_LOOPTIME被指定) 背景控制器将在START_TIME和END_TIME中被连续激活。 START_TIME是必要参数,但如果缺省END_TIME则将会默认为和START_TIME的值一样。(因此控制器将仅被触发1帧) ID_1, ID_2, 等等, 指定此控制器作用于的背景元素ID号。这个列表,如果指定,将覆盖BGCtrlDef中指定的默认列表。 ID最多能指定10个。 下面是BGCtrl类型和它们相关参数的列表:(大多数控制器和状态控制器相似) null 如其名,此控制器什么也不做。主要用在调试中,当你想短时间使一个控制器无效同时又不想删掉这些代码,就用null,而不必在每行代码前加";"。 把原来的控制器名称换成null同时在原来的名字前加";"。此控制器没有其他参数。 Visible value = visible_flag 设置元素的可见度状态。激活时,此控制器设置背景元素不可见(=0)或可见(=1)。不可见的元素中,计时将不会停止。 (也就是说,在动画型元素中,即使在不可见的状态,动画仍将持续播放) Enabled value = enabled_flag 设置元素是否被'关闭'(暂时先用这个词吧。。。) 此控制器要么关闭(禁止)(=0)要么开启(解禁)(=1)背景元素的效果。 当一个元素被关闭,将是不可见的且它的计时间停止(所以,在动画型元素的情况下,任何动画将停止)。 VelSet x = vel_x 设置元素x方向速度。 y = vel_y 设置元素y方向速度。 此控制器将设置 被影响的背景元素 x/y方向速度 为指定的值。 速度单位是 像素/游戏帧。你能在x,y参数中指定1个或2个数值。 缺省任何一个,元素在此方向的速度将不变。 VelAdd x = vel_incr_x 改变元素x方向速度。 y = vel_incr_y 改变元素y方向速度。 此控制器将增加 被影响的背景元素 x/y方向速度 指定的值。 你能在x,y参数中指定1个或2个数值。 缺省任何一个,元素在此方向的速度将不变。 PosSet x = pos_x 设置元素x方向位置。 y = pos_y 设置元素y方向位置。 此控制器将设置 被影响的背景元素 x/y方向坐标 指定的值。 你能在x,y参数中指定1个或2个数值。 缺省任何一个,元素在此坐标方向的位置将不变。 PosAdd x = x_displacement 替换元素x方向位置。 y = y_displacement 替换元素y方向位置。 此控制器将替换 被影响的背景元素 x/y方向坐标 指定的值。 你能在x,y参数中指定1个或2个数值。 缺省任何一个,元素在此坐标方向的位置将不变。 Anim value = action_no 改变 受影响元素 显示的动画到指定动画号。 SinX value = amplitude, period, offset 改变受影响元素正弦运动x方向的振幅,周期和相位偏移。 此参数效果和背景元素参数中的sin.x相同。 SinY value = amplitude, period, offset 改变受影响元素正弦运动y方向的振幅,周期和相位偏移。 此参数效果和背景元素参数中的sin.y相同。
MUGEN触发器重定向 在上例中,time触发器返回player的状态时间。但有时候希望检测player目标的状态时间,或者player父级的(如果player是一个helper),等等。 这能通过 在触发器名字前加上关键字说明应返回谁的信息 来完成。 此过程被称为触发器重定向。例如。 5 + (parent, time) 返回5+player父级的状态时间。 重定向键值关键列表如下: parent 重定向触发器到player的父级。(player必须是helper) root 重定向触发器到根级(最上级)。 helper 重定向触发器到第一个出现的helper。详见触发器文档中相关触发器"NumHelper"。 helper(ID) ID应该是一个有效格式的表达式,计算出的值为正整数。 触发器被重定向到一个拥有此ID号的helper上。 target 重定向触发器到第一个出现的目标。 target(ID) ID应该是一个有效格式的表达式,计算出的值为非负整数。 则将重定向触发器到指定ID号的目标。 targetID在HitDef控制器的"ID"参数中指定。 partner 重定向触发器到player的同伴。普通helper和中立玩家不被认为是同伴。 详见触发器文档中相关触发器"NumPartner"。 enemy 重定向触发器到第一个出现的敌人。普通helper和中立玩家不被认为是对手。 详见触发器文档中相关触发器"NumEnemy"。 enemy(n) n应该是一个有效格式的表达式,计算出非负整数。 触发器被重定向到第n个对手。 enemyNear 重定向触发器到距离最近的对手。 enemyNear(n) n应该是一个有效格式的表达式,计算出非负整数。 触发器被重定向到距离第n接近的对手。 playerID(ID) n应该是一个有效格式的表达式,计算出非负整数。 触发器被重定向到拥有唯一ID号且等于ID的player。详见触发器文档中相关触发器"ID"和"PlayerExistID"。 如果触发器被重定向到一个不存在的地址(例如,当没有helper时将触发器重定向到helper),则会返回bottom。 注意: 不支持递归重定向(例如,"root,target,time")
MUGEN触发器参数中的表达式 大多数函数型触发器要么没有参数要么有一个参数列表。 例如,time触发器没有参数,而ifelse却有3个参数。 ifelse(exp1,exp2,exp3) 这里exp1, exp2, exp3是所有有效的表达式。 在这种情况下,exp1, exp2, exp3都被认为是单独的子表达式,所以区间运算符可以出现在每个子表达式的最右方。 参数表运算顺序是从左到右。 由于不规则的语法,一些旧式函数型触发器不能使用表达式作为参数。 因为这个原因,它们不能通过标准方式被纳入表达式中。 对于这些类型的非标准触发器,触发器仅能与某些特定运算符和参数一起出现。 特别是,这些触发器不能用表达式作为参数。例如, trigger1 = AnimElem = (1+1) 是一个无效表达式。 旧式函数型触发器仅出现在"trigger, relational operator, argument"格式的"条款"中。 这些条款被视为一个独立的单元(特别的,单个0元触发器)用于表达式的计算。 这表示,在这些事物中,运算符优先级的概念在旧式函数型触发器条款中不适用。 例如,在 trigger1 = AnimElem = 5 + 4 中,表达式分为3部分。 AnimElem = 5 + 4 |__________| |_| |_| "AnimElem=5"部分被视为0元触发器的名字,于是'+'运算符的等级不在'='之上,从"AnimElem=5"中就能看出来。 换句话说,这个表达式意味着这样的计算方式"执行触发器调用'Animelem=5',然后加上4得到结果" 一些旧式函数型触发器拥有可替换的触发器(可用表达式作为参数)。它们是下面的: AnimElem, 被 AnimElemTime 取代 TimeMod, 被 % 运算符取代 ProjHit, ProjContact, ProjGuarded; 被 ProjHitTime, ProjContactTime, ProjGuardedTime 取代 完整的不规则触发器列表,详见trigger部分。不规则触发器用***标示出来。
MUGEN的代码效率 处理表达式不是向电脑收费,所以你代码的可读性比微优化表达式更重要。 然而,下面的某些好的做法将提高效率同时不影响最终的效果。 MUGEN在状态控制器中计算条件型触发器遵循如下原则: 首先计算triggerall,从上到下顺序计算。 如果任何triggerall计算出0,则剩余的触发器将被跳过且将计算下一个控制器。 如果所有triggerall计算结果都是非0,则引擎开始计算trigger1,也是从上到下顺序计算。 如果它们中任何一个计算出0,则跳过所有剩下的trigger1转而计算第一个trigger2,诸如此类等等。 如果一个块中的所有trigger(除了triggerall)都计算出非0,则将开始计算状态控制器参数且控制器被触发。 换句话说,触发器计算的逻辑是类似短路型的。在类似C语言的标记法中,这种方式也许被记为 triggerall,1 && triggerall,2 && ... && ((trigger1,1 && trigger1,2 && ...) || (trigger2,1 && trigger2,2 && ...) || ... ) 这里 trigger1,2 记作 trigger1 第2行; trigger2,1 记作 trigger2 第1行,等等. 这个trigger组的逻辑计算将是短路型的,就像C一样。 (注:通过那个逻辑关系式,表示了triggerall组与后面trigger1,trigger2等所有组关系是'&&',也就是说只要triggerall组一个是0,就不能触发。 通俗说法就是triggerall里面只要有1个是0就不能触发,要触发必须triggerall全部非0。 逻辑关系式还能看出trigger1组和trigger2组...之间都是'||',也就是这些组中只要有一个组为1就能触发(前提是triggerall已经检测为非0.) 而在每个trigger组中,他们之间的关系是'&&',比如trigger1组中,要保证trigger1的情况下触发,必须每个trigger1都非0。 控制器被触发的通俗说法就是:首先每个triggerall都要非0,然后每个 triggerN组 中最少要有1个非0,triggerN组 要非0,必须每个triggerN都非0。 ) 由于这个系统,可以通过 组织好表达式以便条件型触发器里的数字尽可能的即小又少 来实现大大提高效率。 状态控制器参数可以减少工作量(代码量),这些参数在触发时仅计算一次,而不是player在状态中每帧都计算。例如 [State -1] type = ChangeState trigger1 = command = "a" trigger1 = power < 1000 value = 3000 [State -1] type = ChangeState trigger1 = command = "a" trigger1 = power >= 1000 value = 3001 [State -1] type = ChangeState trigger1 = command = "a" trigger1 = power >= 2000 value = 3002 可以进一步简化为: [State -1] type = ChangeState trigger1 = command = "a" value = 3000 + (power >= 1000) + (power >= 2000) 你同时能为引擎排忧解难,通过把最容易计算出false的triggerall放在triggerall块的顶部。(可以减少引擎计算量) 同样,trigger1块应该是最可能被触发的块,但是在trigger1块内部,最有可能计算出0的trigger1应该放置在顶部。 对于有很多包含重复条件trigger的状态控制器,最好将这个控制器打断为2个独立的块,每个块独立设置triggerall。 如果你有一个复杂的条件,这个条件是许多连续状态控制器的触发条件,你可以把这个条件的值存储到一个变量中,然后把这个变量作为后面触发器的控制条件。 例如: trigger1 = (command="abc" && command!="holddown" && power>=1000) || (command="abc" && command!="holddown" && var(5)) || ((command != "abc" || command = "holddown") && power>=2000) 可以被写成 (直接给 var(0) 赋值是可行的): trigger1 = (var(0):=(command="abc" && command !="holddown") && power>=1000) || (var(0) && var(5)) || (!var(0) && power>=2000) 这里,你必须权衡提高可读性。(在使用子表达式和使用:=运算符这两种情况中权衡,这2种情况都会降低可读性) (或者使用varset控制器: [State -1] type = varset ... var(0) = command="abc" && command !="holddown" 然后: trigger1 = var(0)&&power>=1000 || var(0)&&var(5) || !var(0)&&power>=2000 由于&&运算等级高于||,所以这么写不违背原意。)
MUGEN特殊状态号(common1.cns) 状态号 描述 0 站立 10 站立到蹲下 11 蹲下 12 蹲下到站立 20 走 40 跳跃开始(起身阶段) 45 空中跳跃开始 50 跳跃空中阶段 52 跳跃落地 100 向前跑 105 向后小跳 106 向后小跳落地 120 防御(开始阶段) 130 站立防御 (防御中) 131 蹲下防御 (防御中) 132 空中防御 (防御中) 140 防御 (结束阶段) 150 站立防御住攻击 (震动) 151 站立防御住攻击 (被击退) 152 蹲下防御住攻击 (震动) 153 蹲下防御住攻击 (被击退) 154 空中防御住攻击 (震动) 155 空中防御住攻击 (被击飞) 170 输了 (时间终了) 175 平局 (时间终了) 190 准备开场介绍 191 开场介绍 (覆盖此状态给人物一个开场介绍) 5000 站立受击(震动) 5001 站立受击(被击退) 5010 蹲下受击(震动) 5011 蹲下受击(被击退) 5020 空中受击(震动) 5030 空中受击(被击飞) 5035 空中受击(过渡阶段) 5040 空中受击(空中恢复,没有进入下落状态) 5050 空中受击(下落状态) 5070 绊倒受击(震动) 5071 绊倒受击(被击飞) 5080 倒地受击(震动) 5081 倒地受击(被击退) 5100 倒地受击(下落状态撞击地面) 5101 倒地受击(从地面弹起) 5110 倒地受击(躺在地上) 5120 倒地受击(起身) 5150 倒地受击(被击败时的躺在地上姿势) 5200 空中受击(在地面上受身,仍然处于下落状态) 5201 空中受击(在地面上受身) 5210 空中受击(空中受身) 5500 接关动画 5900 初始化(每回合开始时)
MUGEN背景控制器 背景控制器操作一个内部计时器,计时器在每回合开始时从0开始计时,每个游戏帧增加1。 当计时器到达控制器起始的时间,则控制器变为激活状态。 当计时器到达控制器结束的时间,则控制器停用。 如果控制器指定了一个正的循环时间,则当循环时间到达时控制器的内部计时器将复位到0。 背景控制器必须以组的形式写在父级BGCtrlDef下。你能使用多个 BGCtrlDef将控制器分成几个组。 每个BGCtrlDef和背景控制器模块可以放置在DEF文件[BGDef]之内的任何位置。 这些模块的一般格式是: (格式类似StateDef) [BGCtrlDef my_controller_name] looptime = GLOBAL_LOOPTIME ctrlID = DEFAULTID_1, DEFAULTID_2, ... [BGCtrl my_controller_1] type = CONTROLLER_TYPE time = START_TIME, END_TIME, LOOPTIME ctrlID = ID_1, ID_2, ... (controller-specific parameters here) [BGCtrl my_controller_2] (等等) GLOBAL_LOOPTIME指定一个时间帧数,在这个时间之后BGCtrlDef将复位它的内部计时器,以及他包含的所有BGCtrl内部计时器。 要禁止循环时间,设置为-1或者缺省。 DEFAULTID_1, DEFAULTID_2, 等等, 指定将被 没有指定自身ctrlID列表的BGCtrl 影响的 背景元素ID号。 你能为此参数列出最多10个ID号。如果此行缺省,则默认将影响所有背景元素。 START_TIME, END_TIME, LOOPTIME是指定的时间,在这个时间点背景控制器应分别开始激活,停止激活,复位它的内部计时器。 如果LOOPTIME缺省或设置为-1,则背景控制器将不会复位它的计时器。(他的计时器仍然可以被他父级BGCtrlDef复位,只要GLOBAL_LOOPTIME被指定) 背景控制器将在START_TIME和END_TIME中被连续激活。 START_TIME是必要参数,但如果缺省END_TIME则将会默认为和START_TIME的值一样。(因此控制器将仅被触发1帧) ID_1, ID_2, 等等, 指定此控制器作用于的背景元素ID号。这个列表,如果指定,将覆盖BGCtrlDef中指定的默认列表。 ID最多能指定10个。 下面是BGCtrl类型和它们相关参数的列表:(大多数控制器和状态控制器相似) null 如其名,此控制器什么也不做。主要用在调试中,当你想短时间使一个控制器无效同时又不想删掉这些代码,就用null,而不必在每行代码前加";"。 把原来的控制器名称换成null同时在原来的名字前加";"。此控制器没有其他参数。 Visible value = visible_flag 设置元素的可见度状态。激活时,此控制器设置背景元素不可见(=0)或可见(=1)。不可见的元素中,计时将不会停止。 (也就是说,在动画型元素中,即使在不可见的状态,动画仍将持续播放) Enabled value = enabled_flag 设置元素是否被'关闭'(暂时先用这个词吧。。。) 此控制器要么关闭(禁止)(=0)要么开启(解禁)(=1)背景元素的效果。 当一个元素被关闭,将是不可见的且它的计时间停止(所以,在动画型元素的情况下,任何动画将停止)。 VelSet x = vel_x 设置元素x方向速度。 y = vel_y 设置元素y方向速度。 此控制器将设置 被影响的背景元素 x/y方向速度 为指定的值。 速度单位是 像素/游戏帧。你能在x,y参数中指定1个或2个数值。 缺省任何一个,元素在此方向的速度将不变。 VelAdd x = vel_incr_x 改变元素x方向速度。 y = vel_incr_y 改变元素y方向速度。 此控制器将增加 被影响的背景元素 x/y方向速度 指定的值。 你能在x,y参数中指定1个或2个数值。 缺省任何一个,元素在此方向的速度将不变。 PosSet x = pos_x 设置元素x方向位置。 y = pos_y 设置元素y方向位置。 此控制器将设置 被影响的背景元素 x/y方向坐标 指定的值。 你能在x,y参数中指定1个或2个数值。 缺省任何一个,元素在此坐标方向的位置将不变。 PosAdd x = x_displacement 替换元素x方向位置。 y = y_displacement 替换元素y方向位置。 此控制器将替换 被影响的背景元素 x/y方向坐标 指定的值。 你能在x,y参数中指定1个或2个数值。 缺省任何一个,元素在此坐标方向的位置将不变。 Anim value = action_no 改变 受影响元素 显示的动画到指定动画号。 SinX value = amplitude, period, offset 改变受影响元素正弦运动x方向的振幅,周期和相位偏移。 此参数效果和背景元素参数中的sin.x相同。 SinY value = amplitude, period, offset 改变受影响元素正弦运动y方向的振幅,周期和相位偏移。 此参数效果和背景元素参数中的sin.y相同。
首页 1 2 下一页