编辑手册
介绍 Super Mario Ultra Edition Legacy(210807.1ver 及以后版本,后简称 UEL) 的编辑注意事项以及各种物件的使用方法。
编辑须知
这是在使用 UEL 时特别需要注意的一些地方,请一定要仔细阅读!!!
- 不要随意删改已有的图层及其名称
否则将会导致各种问题的出现!!! - level_main 为关卡主图层,level_back 为第一背景层
食人花,进水管的马里奥等将会被移至第一背景层
因此做背景时请特别注意遮挡问题的出现
当然,你可以随意添加新的图层,放在第一背景层之后,这是万无一失的做法。 - 不要删除 Frame Start Event 和 Frame End Event 对象,否则事件顺序会被永久打乱!
- 在同一工程中,建议保持各个物件的名称相同,以方便未来维护
(若有重大 bug 修复,你到时候才能用 Global Object 进行全局修改) - 由于 UEL 物理系统的精确性,
辣鸡CTF 不能单独设置对象的碰撞遮罩,请尽量保证动画尺寸的一致性!
如不容易解决,可尝试使用 Bouncing 动画碰撞遮罩,或 给物件添加 Group.AutoPlace。
程序设置
建议直接使用 UEL 默认程序设置,如果需要转移到其他程序,请注意以下两点:
事件顺序:
UEL 修改了程序默认事件顺序,这非常重要。
全局事件: UEL 全局事件与内置暂停(现默认关闭)有关。 frame_end loop 非常重要,缺失该 loop 会出现很多问题。
图层介绍
- sys_setting:用于存放核心事件相关的对象。你可以启用该图层可视性并将其作为背景图层使用,但一般不推荐这么做。
- level_back:马里奥进出水管,食人花,升起的道具,部分背景等处于此图层。因此你需要注意在 level_main 中不要有物件遮挡了该图层,你可以将滚屏范围置于此图层。
- level_main:关卡运行的核心图层。
- level_info:存放 HUD 的图层。
- level_circle:圈圈转场特效的图层。
- sys_pause:内置暂停的预留图层(现默认关闭)。
- sys_overlap:用于物理引擎处理碰撞检测的临时图层。请不要编辑此图层。
部分物件说明
系统
在图层 level_info 的 Info Time 对象中设置时间:
若设置为 ≤0,则不限时
通关器 和 小通关器 的相对位置决定其方向,可放心摆放。
滚屏 的使用:
当 马里奥 与 Scroll Free/Scroll Set 碰撞时,将会切换滚屏;
Scroll Set 拥有变量 ID,马里奥触发滚屏时,滚屏将会切换到拥有同样 ID 的 Scroll Region 对象中,
该对象的覆盖范围即为滚屏的范围。
如果 Scroll Set 的 渐变 Flag 打开,则会渐变式切换滚屏。
因此,当你需要制作不同区域的滚屏时,克隆 Scroll Set 和 Scroll Region 对象,修改 ID 使其对应即可。
新版滚屏追加视野调整功能,开启之后将会根据目标(默认为马里奥)的运动调整滚屏的视野。使用样例(SMMWW 2-2):
敌人
你可以轻松地指定一个敌人的初始方向,如图:
部分敌人支持 32 个方向,包括:
- 食人花:你应该 Clone 食人花并修改其方向,以此获得其他方向的食人花。
如有需要,你可以修改 Clone 后的食人花的编辑界面贴图,以方便编辑。 - 火球:不作过多解释,但需要说明的是,火球会记忆其初始距离岩浆的高度,
如果没有岩浆,那火球也回不来了。 - 石盾:也不需要太多解释,但需要注意的是,
以一个比较奇怪的方向砸到与其不垂直的实心上可能导致爆炸特效创建失败。
此外,炮台也支持 4 个方向。
道具
将 道具 覆盖于 问号砖/砖块 上,以装入此道具:
注意,道具 在升起的过程中也位于 level_back 图层。
水管链接
红绿箭头对象只拥有动画效果。
特别地,在一开始将马里奥与红色箭头重叠可以使其在一开始的时候出水管。
而后,我们需要其他的对象来完成水管的传送,跳帧等事件:
- 传送:
红绿 Warp 对象 根据其摆放的顺序进行瞬移式传送。 - 滚屏:
紫色 Warp 对象 将会开启滚屏式传送,通过黄色箭头更改滚屏的方向。
运动实心
- 修改实心类型:
对于平台和实心的转换,修改分组即可:
你还可以修改变量 实心类型:
0:正常实心
1:马里奥实心
2:敌人实心 - Reverse 的使用:
运动实心正常情况下为 Normal (后简称 N)状态,与其边缘接触后将会进入 Reverse (后简称 R)状态;
同样,处于 R 状态的运动实心与其接触后会切回 N 状态。
而后在特定的设置下会进行相应的速度反向。
当运动实心同时具有 x、y速度 时,Reverse 对象的 单方向碰撞 Flag 将决定反向一个方向的速度还是两个。 - 箭头的使用:
当运动实心只在单方向拥有速度的时候可以响应运动箭头,其响应的位置在箭头的中心。
若运动实心处于 N 状态,则响应绿色箭头;
若运动实心处于 R 状态,则响应红色箭头;
以此我们就可以制作复杂路径的往返。 - 需要注意的是,在某些情况下,最后一个摆放的运动实心可能会出现问题(原因不明),此时你最后在屏外摆一个运动实心即可。
开发手册
介绍 UEL 开发的注意事项和使用参考。
分组介绍
介绍主要分组的功能。
Group.Instance 介绍
本引擎物理核心分组,Group.Gravity 与 Group.Movable 均依赖于此组。
变量坐标
本条目对 Group.MovingBlock 也适用。
由于 CTF 的物件坐标只支持整数,属于本组的物件均采用 Alterable Value X 与 Alterable Value Y (后简称 变量 X 变量 Y)作为坐标进行运算,具体流程如下: 1. 帧开始时或创建对象时将物件的坐标 X Y 写入 变量 X Y; 2. 通过 变量 X Y 对物理过程进行相关计算; 3. 将物件的坐标 X Y 设置为 变量 X Y。
若你开发的物件属于此组,且你需要直接修改物件坐标,请参照上述流程的 2 3 完成。
你亦可直接修改物件的坐标 X Y,并在最后将物件的 变量 X Y 修改为坐标 X Y。
功能介绍
以下内容摘编自 UEL Group.Instance 注释: 使用变量:1000~1099 1000 = -1: 禁用该对象所有相关事件 = 0: 初始化,完成后赋值为 1 = 2: 恢复,完成后赋值为 1 需要注意的是,在编写物件行为的时候也应注意加上这个条件 (现内置暂停默认禁用,确定不使用内置暂停可以不管)
1001 = 1: 下一帧即销毁(模拟绘制功能) 你可以创建一个 Instance,并将其变量 1001 赋值为 1,这样它在下一帧就会被销毁,从而达到“绘制”的目的; 但如果需要用的话,一定要节约!!! (目前没有物件使用该功能)
1002 = -1: 不进行碰撞检测(对 Group.Gravity, Movable 等均适用) = 0: 正常碰撞检测 = 1: 马里奥实心 = 2: 敌人实心 (事实上你可以添加更多的编号,只要 Group.Solid & Platform 的 变量 900 与之匹配即可)
1003 = 0: 不禁用 = 1: 出屏禁用 = 2: 禁用直到入屏
1004 = 1: 被运动实心挤
1005 = 1: 调整图层至 level_back (物件会在每一帧最开始被调至 level_main,每一帧最后被调至 level_back)
1011 = 1: 对象属于 Group.Gravity 1012 = 1: 对象属于 Group.Movable 1013 = 1: 对象属于 Group.MovingBlock 1014 = 1: 对象属于 Group.Enemy = 2: 对象属于 Group.Shell = 3: 对象属于 Group.HardShell 1019 = 1: 对象属于 Group.Solid = 2: 对象属于 Group.Platform
2000 & 2001 & 2002: 用于内置暂停
Bouncing 动画碰撞箱 物件将会以 Bouncing 动画作为碰撞箱,同时其动画必须手动设置。 3000 = 1: 开启 3001: 动画切换间隔 3002: 动画帧数 3003: 当前动画序列 3004: 当前动画帧
使用 instance_place_fix
instance_place_fix:陷入实心补正 -Argument: --1098: 需要检测的实心类型(参见实心说明) --1097 = 1: 无视 Backdrop & Group.Solid --1096 = 1: 无视 Group.Platform --1095: 方向(角度制) --1094: 最大深度 --1093 = 1: 禁用最大深度 -Return: --1099 = 1: 执行成功 = 0: 未执行(超过最大深度)
使用样例:
Group.Gravity 介绍
基于 Group.Instance 的重力事件组。
功能介绍
以下内容摘编自 UEL Group.Gravity 注释: 使用变量 100~199
100 = -1: 禁用 = 0: 在地面上 = 1: 在空中
101:速度 102:重力方向(角度制) 103:空中加速度 104:空中减速度 105:水中加速度 106:水中减速度 107:空中最大速度(=0为无限制,<0为上浮) 108:水中最大速度(=0为无限制,<0为上浮) (以上参数将会默认初始化为普通敌人的配置)
109= 0: 应用加速度
180: 坦克滚屏相关
Foreach 介绍
物件着地瞬间将会执行 Foreach:gravity_down_finished 物件顶头瞬间将会执行 Foreach:gravity_up_finished
使用样例:
Group.Movable 介绍
基于 Group.Instance 的直线运动事件组。
功能介绍
以下内容摘编自 UEL Group.Movable 注释: 使用变量 200~299
200=-1: 禁用
201:速度 202:移动方向(角度制)
203:碰撞行为 =-1:什么都不发生 = 0:停止,速度(201)归 0 = 1:反向(方向角+180) = 2:返回 204 = 1,后续处理交由物件
205:斜坡容错
Foreach 介绍
物件碰撞瞬间将会执行 Foreach:movable_place_finished
Group.Enemy 介绍
用于处理龟壳/无敌星刷分,以及部分部分攻击判定的事件组。 以下内容摘自 UEL Group.Enemy 注释:
400 = 0: 正常 =1: 死亡
401 = -2: 不与龟壳和无敌星进行判定 =-1: 不与龟壳进行判定 = 0: 能被普通龟壳砸死 = 1: 能反死普通龟壳但能被硬壳砸死
402 = 0: 能被岩浆搞死 404 = 0: 出界销毁 405 = 0: 能被挤死 406 = 0: 能被顶死(有重力且在地面上时)
403=1: 位于 level_back 图层的调整
420: 砸砖块记录
Group.Block 介绍
以下内容摘自 Block 注释: Flag 9 on: 开启隐藏 Flag 10 on: 添加实心 Flag 11 on: 顶 Flag 12 on: 控制顶的动画 Flag 13 on: 金砖计时 Flag 14 on: 金砖控制 Flag 15 on: 属于 Brick
对于 Instance 组对象,添加砸砖事件可参考甜菜。 对于其他对象,在 overlapping 到 Group.Block 时打开其 Flag 11 并关闭 Flag 9 即可。
物理实现方法
马里奥
移动:在操作事件执行完成之后,马里奥会将速度和运动方向分别写入变量 201 202。 跳跃:直接利用变量 100 101 进行相关计算。 需要注意的是,马里奥的方向为变量 AS,-1 为左,1 为右(相对于重力向下时)。 马里奥的速度是用变量 AT 计算的。 与水管直接相关的是变量 AP,与受伤/无敌直接相关的是变量 AH。 具体内容可在 Mario 对象中寻找相关注释。
一般敌人
属于 Group.Instance 的一般敌人会在 init 时对重力进行默认配置,并将速度和运动方向分别写入变量 201 202。 需要注意的是, Group.Instance 对象才会调用 Foreach init 进行 init 操作,不属于此组的敌人一般属于不需要进行碰撞检测的,这类敌人你可能会在行为中看到 gravity、movable,这些行为属于没有碰撞检测的物理过程。而对于这类敌人,你可以这样进行 init: 这些对象为什么不可以加入 Group.Instance 并将变量 1002 设为 -1? 因为在目前主流的 CTF2.5+ 版本中,有着分组溢出的 bug,这是规避此 bug 的无奈之举。
运动实心(Group.MovingBlock)
运动实心会在每一帧的开始和结束记录其当前的坐标,并以这个坐标为依据去修正其他与之接触的对象。 其原生运动系统详见 Frame End Event 中的注释。
Bouncing 动画指定碰撞遮罩
使用 Bouncing 动画作为碰撞遮罩以规避物件动画尺寸不规整带来的问题。 目前使用该功能的物件包括:锤子龟系列,刺球。
Group.AutoPlace
处理极端情况的极端策略,如果实在没办法再考虑使用。 该分组的对象会在每一帧的最后检测是否与实心重叠,如果重叠,则从上下左右四个方向选取最短的一个方向执行防陷入。
滚屏实现方法
滚屏核心事件位于对象 Camera 中,以下内容摘自其注释: 1.设置滚屏跟随对象 滚屏模式 = 0:初始化并启动模式 1 = 1:将滚屏目标设置为 "Mario" = 其他:你需要手动设置目标 X Y 坐标和滚屏补正速度 (滚屏补正速度用于滚屏渐变的参数,否则可能会出现滚屏渐变追不上滚屏目标的问题)
2.设置晃屏功能 你需要打开 "晃屏" Flag,并设置变量 "晃屏时间" 晃屏时间>0:不允许晃屏超过当前的滚屏边界 晃屏时间<0:允许晃屏超过当前的滚屏边界
3.禁用滚屏系统 你可以打开 "禁用" Flag,也可以直接删除 Camera 的 Behavior 如果只需要禁用封位实心,打开 "禁用封位实心" Flag 即可
内置暂停实现方法
该功能现默认关闭,如果不需要可以略过以下内容。
对于 Group.Instance 对象,变量 1000,直接控制物件是否暂停,包括其动画和 CTF 自带运动。 对于非 Group.Instance 对象,Pause 对象的 Flag 0(命名为 Pause)直接控制物件是否暂停,但不包括其动画和 CTF 自带运动,对于后者的暂停请参考其他相关物件的 Pause 行为。
如果你需要使用内置暂停功能,在开发时必须要注意添加暂停条件的限制。
全局变量实现方法
全局变量实际上是 Frame Start Event 和 Frame End Event 的变量。 由于 CTF 的 bug,Restart current frame 会重置全局物件的变量,且此动作不会被判定为 Frame End,因此所有变量将会在帧开始时,帧结束时/Foreach: frame_restart 时读取/存入全局变量。 据此原理,UEL 理论上可以兼容任意其他工程的全局变量,参考:
在 Frame Start Event 中,激活/禁用相关事件
将 Global Event 复制至移植目标工程
修改工程设置,如图:
将 Event Order 调整为"Frame events, Behaviors, Global events"
你亦可将 Restart current frame 改为 jump to frame frame,如果没有移植至其他工程的需求,就不需要在帧开始时,帧结束时/Foreach: frame_restart 时读取/存入全局变量。
致开发者
- 如果需要使用内置暂停功能,开发过程中请特别注意 暂停条件 的限制,其中
对于 Group.Instance 对象,暂停条件应为 Var.1000 = -1
对于其他对象,暂停条件应为 Pause 对象的 Flag 0 on。 - 我在开发过程中,对于一些重要的东西都写了较为详细的注释,可供参考。
而对于一些外源引用的事件(均注明来源)则并没有作太多的处理。 - 你可能会注意到,有一些物件并不属于 Group.Instance,
理论上我们把所有物件都加上此组,那么就根本不需要 Pause 对象了。
你可能也已经发现,部分物件的行为中有 “低配版” Gravity 和 Movable。
其原因在于,CTF 对于分组的使用有上限!!!
这个上限具体我并不清楚,但这个上限是存在的,
如果超过,将会导致 Out of memory,编译直接崩溃!别问我怎么知道的,辣鸡 Clickteam
因此,对于不需要碰撞检测的对象,用"低配版"是更好的选择。 - Group.MovingBlock 绝对不能同时与 Group.Instance/Gravity 等加在同一个对象上,
原因可参见 Group.Solid&Platform 的注释。
如果需要开发其他运动方式的平台(如圆周运动),
直接禁用掉原生运动事件(比如将 Var.300 设为 233),然后自行在 Behavior 中编写即可。
这不会影响补正事件,因为补正事件用的是差值法计算。 - 我深知我使用的一些 Foreach 事件存在风险,
比如我迫不得已修改全局事件顺序来保证 Frame End Event 的正常运行(已改为 loop),
如果你实在担心,也可以自己改一改。
尾声
UEL 介绍&下载地址:https://dasasdhba.github.io/res-UEL 论坛地址:https://www.marioforever.net/thread-705-1-1.html
欢迎评论~