精  
【图文】Rainbow Engine代码讲堂(入门)
id: 4677648045 | 楼主:w1194600239 | 返回首页
id: 94142520744
1L | 作者:w1194600239 | 发布于 2016-07-18 14:53

一楼喂熊,楼下开始正文


id: 94142543173
2L | 作者:w1194600239 | 发布于 2016-07-18 14:53

【目录】
前言
第一章——代码的认识及其基本构成
第二章——坐标与位置
第三章——顺序和碰撞检测
第四章——创建与销毁
第五章——动画帧和动画方向
第六章——物品的开关和分组
第七章——数值变量入门
第八章——探究较复杂的运动代码
第九章——基本辅助代码(一)
第十章——基本辅助代码(二)
第十一章——loop的使用
第十二章——综合应用及小结


回复
w1194600239 于 2016-07-20 10:24:12 id: 94278907795
7.18更新【前言】【第一章】【第二章】【第三章】
w1194600239 于 2016-07-20 10:24:19 id: 94278915223
7.20更新【第四章】
w1194600239 于 2016-07-25 13:27:06 id: 94681727149
7.23更新【第五章】
w1194600239 于 2016-07-25 13:27:14 id: 94681735727
7.25更新【第六章】
w1194600239 于 2016-08-01 10:13:48 id: 95203884478
8.1更新【第七章】
w1194600239 于 2016-08-05 12:43:07 id: 95463888540
8.5更新【第八章】
w1194600239 于 2016-08-24 10:18:38 id: 96690689541
8.24更新【第九章】


id: 94142583273
3L | 作者:w1194600239 | 发布于 2016-07-18 14:54

【【【前言】】】
本教程主要针对MMF新人和代码小白而写,以Rainbow Engine 0.10.6单关版为范例,讲述MMF的代码入门,其内容大多是一些常用的、基本的代码,旨在让新人们能更好的掌握MMF,认识MMF的核心。如有讲的不合理的地方或不懂地方请指出并回帖反馈。
我默认大家都熟知MMF的基本操作(如创建物品等)和基本结构(如图层工具栏、属性栏等),于是这些操作就不再详细介绍了。
本教程使用Chickteam Fusion 2.5 Developer汉化版教学,没有汉化版的吧友请下载汉化文件并按照要求安装。
下载地址:http://pan.baidu.com/s/1gdk6JVt



id: 94142991009
4L | 作者:w1194600239 | 发布于 2016-07-18 15:01

【【【第一章-认识代码及其基本架构】】】
【代码的认识及分布】
代码,俗称事件、行为等,代码是应用程序运作的核心,没有代码任何操作都不能实现。
RE的代码主要分布在三个区域:全局事件、事件编辑器、行为栏。
①全局事件
全局事件在应用程序的行为栏中。

点击“编辑”进入全局事件。

如果一个帧的属性栏中勾选了“包含全局事件”这一选项,那么这个帧就受全局事件控制。

在用MMF制作马里奥游戏中,基本上所有的帧都应该受全局事件控制。
退出程序重开后,这些代码的工作又要重头开始,如果需要存档则要写存档代码,存档代码不属于本教程教学范围内。
②事件编辑器
事件编辑器俗称帧事件,它控制着整个帧的运行,而不能控制其他帧。


如图就是RE的事件编辑器,以此例来介绍一下主要的代码面板,红框部分是代码序号,蓝框部分是正式的代码内容(其实应该包括左边的条件,图没截好),绿框表示参与代码的对象。
③行为栏
RE中的物品分类大致可以分为4类:背景、快速背景、活动对象(active)、计数器
其中,背景、快速背景没有行为栏,而活动对象和计数器有行为栏。
行为栏是写在物品内部的代码,其作用主要是方便查找和编辑。


【代码的基本架构】
本教程以事件编辑器为例,讲述代码的基本架构。
①代码的基本形式
MMF中的代码主要形式是:代码执行条件-(若满足此条件)-执行xx事件,相当于英语中的if从句
条件又分为主条件和副条件,一条代码的主条件只能有一个,副条件可以有若干个,但其实这两者并无差异,只有满足了所有的条件(无论主条件或者副条件),才能执行代码。
or在代码中表示或者,一个or连接着两组条件,每组条件都有自己的主条件和副条件,当然,一条代码中的or也可以是若干个。编辑代码时,可以看到有or(逻辑)和or(过滤),其实这两者并无太大差异,一般情况下可随便选一个使用。
代码中的事件也可以有若干条,内容也分为很多种,本教程将在第二章到第九章一一讲述。
②事件组和注释
有时候很多条代码可以合并起来,成为一个事件组,事件组有激活和未激活两种状态,这两种状态的切换也可以在代码中进行编辑。
如马里奥事件组

当自己写的代码比较复杂,为了方便他人理解,需要在代码前加一行注释,用来解释相关事实。
③代码的工作顺序
在事件编辑器中,代码序号大的事件永远比代码序号小的事件优先。
在每条代码中的若干个事件中,写在前面的事件先执行,写在后面的事件后执行。


回复
w1194600239 于 2016-07-18 17:02:08 id: 94150463983
更正:“第二章到第九章”改为“第二章到第十一章”……因为后期把目录章节数增加了这个忘记改了。


id: 94143063080
5L | 作者:w1194600239 | 发布于 2016-07-18 15:02

【几种最常用的代码执行条件】
①总是执行(Always)指无论什么时候都执行,应用十分广泛。
②帧开始时执行(Start of frame)指刚运行帧的时候执行,只执行一次。
③每次条件满足只执行一次(Only one action when even loops)这个顾名思义,就不多说了。
④只执行一次(Run this event once) 同样顾名思义。
⑤从不执行(Never)一般只在制作防彻删时使用(在第四章会讲到),其余没啥卵用。




id: 94143353890
6L | 作者:w1194600239 | 发布于 2016-07-18 15:06

【【【第二章-坐标与位置】】】
从本章开始,就要正式开始学习怎样写代码了,于是我们先从最简单的坐标与位置开始讲起。
【坐标与相对坐标】
①认识MMF中的坐标
MMF中的帧的实质是一个平面直角坐标系,其原点就是帧左上角的这个点,x轴的正方向向右,y轴的正方向向下(注意不是向上,和数学中的不同),单位长度就是1像素。


于是,由于有了平面直角坐标系,在MMF中的所有物品都可以用坐标来表示。
②中心点(热点)的研究
我们知道,MMF中的物品都是有宽度、有高度的,在MMF中我们引入热点(俗称中心点)来表示一个物品的坐标。每个物品都有自己的中心点,而中心点也是可以任意更改的。
其实很简单,我们打开一个物品(如马里奥位置),点击它的中心点,就可以查看其中心点的坐标了。


双击物品,点击红框中的眼睛查看/编辑中心点

同样,图像面板也是一个平面直角坐标系,这与MMF类似。
那中心点怎么修改呢?有三种方法:第一种当然是直接输入具体的坐标啦;第二种就是用鼠标点击图像中的一点(也可以在图像外),那么坐标栏中同样会显示这一点的坐标;第三种方法是最常用的,左边有一个像九宫格一样的东东,它就是用来调教中心点的,例如,左上角表示中心点在图像的左上角,右边一列中间的一个位置就表示中心点在图像最右端的中心,其余点都是如此,大家可以自行尝试。
注意:RE中的物品的中心点最好不要随意更改,否则可能会出各种各样的bug.
③相对坐标的计算
在MMF中,除了坐标外,用的更多的是相对坐标。
相对坐标主要表示一个物品的中心点相对于另一个物品中心点的坐标,我们把一个物品简化为“1”,另一个物品简化为“2”,当两个物品的中心点重叠时,我们就说“2”相对于“1”在(0,0),反过来也可以说成“1”相对于“2”在(0,0)。
如图,在属性栏中可以查看物品的坐标。

现在这种情况,“2”的中心点在“1”的右方100像素,上方200像素,我们就说“2”相对于“1”在(100,-200),反过来也可以说成“1”相对于“2”在(-100,200)



id: 94144231237
8L | 作者:w1194600239 | 发布于 2016-07-18 15:20

【从位置到基本运动】
坐标是表示位置的工具,而不断的更改位置可以实现物品基本的运动。
这就是MMF中的位置代码。
下面介绍几种位置代码的写法。
①直接坐标代码(实用性:1星 最高10星)
我们先创建一个active,把它放在关卡的左上角,接着我们打开代码,如果我们要把这个active移动到(100,200)的位置,该怎样写代码呢?在以后的教程中,我们用*符号来表示具体的代码内容。
*帧开始时——设置“活动对象”的x坐标为100,设置“活动对象”的y坐标为200

这时我们测试一下,是不是发现active的位置改变了?

②相对坐标代码(实用性:3星)

写相对坐标的代码,就要用到我们之前学过的相对坐标的计算了。现在我们创建两个active,用画笔分别画上“1”和“2”便于区分,并放到不同的位置,如果我们需要“2”永远跟随着“1”下方32像素,就应该使用选择位置代码:
点击“相对于”
在导入中点击我们刚刚创建的“1”

*总是执行——设置“2”位置在相对于“1”的(0,32)

——实例研究——
我们知道lyh做了一个光源教程,在教程的最后lyh因为偷懒而没有写如何使光源跟随马里奥的代码,下面我们按照lyh的方法引入一个光源,给出规范的代码写法:

*1.总是执行——设置“光源”位置在相对于“马里奥位置”的(0,0)
*2.“马里奥位置”的数量=0——设置“光源”位置在相对于“马里奥尸体”的(0,0)


其中,代码1就是我们刚刚学过的相对坐标代码(代码2还没有学过),对此,是不是对相对坐标的应用价值有所领会了呢?



id: 94144317096
9L | 作者:w1194600239 | 发布于 2016-07-18 15:22

③匀速直线运动代码(实用性:8星)
运动代码可谓是复杂多变,今天我们就从位置的基础上学习最简单的一种运动代码——匀速直线运动代码
我们创建一个active,如果要让它缓慢的水平向右做匀速直线运动,怎么做呢?
在设置x坐标代码中,右击下方的“活动对象”
如图所示选择
*总是执行——设置“活动对象”的x坐标为x“活动对象”+1

下面我们来解读一下这条代码:总是执行是条件,设置“活动对象”的x坐标可以达到运动目的,但在代码中的x“活动对象”指的是当前活动对象的x坐标,MMF会自动读取,这样再一直+1,就不难理解了。
那么怎么更改运动速度呢?其实很简单,把代码后的“+1”改大即可增加运动速度,但要注意一点,x坐标代码中正数表示向右运动,负数表示向左运动,这与平面直角坐标系的正方向有关,同理,设置y坐标的运动代码时,负数表示向上运动,正数表示向下运动。
我们再举一例,如果要这个active向左下方向运动,且速度为2,运用刚刚学过的代码知识不难写出:
*总是执行——设置“活动对象”的x坐标为x“活动对象”-2,设置“活动对象”的y坐标为y“活动对象”+2



id: 94144463560
10L | 作者:w1194600239 | 发布于 2016-07-18 15:24

【【【第三章——顺序与碰撞检测】】】
在MMF中,每次添加物品都意味着物品顺序的改变,在本章中主要讨论active的顺序及调试方法,以及在同一图层中物品间的碰撞检测。
【active的顺序代码】

①顺序的认识
在没有代码控制的情况下,我们在同一个帧中如果依次摆两个active,那么后摆的active就会盖住先摆的active.例如我们先在地面上摆一个扎地花,再摆一个刺猬,测试时刺猬就会盖住扎地花,反之扎地花就会盖住刺猬。
刚刚我们讨论的是同一图层内的顺序情况,如果是不同图层的那么就不一样了。在图层工具栏中(ctrl+K召唤),遵循高图层永远覆盖低图层的原则(无论物品在同一图层内的顺序怎样调节)。
②顺序的调节
调节active的顺序除了摆放的先后,最重要的调节方法还是代码调节。细心的吧友就会发现,RE中的水管似乎总是覆盖住同一图层内的大部分物品(除了抽风和个别active外),而我们放置水管的时候总不可能是在关卡地形、敌人等摆完后再摆吧,这就是因为RE中写了关于水管的顺序代码。
顺序代码(实用性:9星)
在制作岩浆关卡时,如果我们要设置从岩浆中长出来的水管,那么水管遮住岩浆是不是不太美观呢?下面我们就来调节一下岩浆的顺序:
*总是执行——“岩浆”移动到顶部 移动到顶部 “岩浆背景”移动到顶部 移动到顶部



上面的代码中,岩浆和岩浆背景的事件“移动到顶部”写了两遍是起加强作用,确保它们能覆盖住水管。
在顺序的代码中,除了“移动到顶部”“移动到底部”这两个常用的代码外,还有“对象上移”“对象下移”“移动到图层”这三种代码。
“对象前移”和“对象后移”代码是要以另一个active为参照的,如:
*总是执行——对象“刺猬”上移到“地夹子”上方


注意这两种代码不要和“移动到顶部”“移动到底部”混合使用,否则是无效的。
而“移动到图层”代码的使用也很简单,在MMF弹出的提示框输入图层数值就可以了。



id: 94144711042
11L | 作者:w1194600239 | 发布于 2016-07-18 15:28

【碰撞检测】
①碰撞检测的认识

碰撞检测是MMF用来判定一个物品与其他物品是否碰撞或重叠,俗话说“孤掌难鸣”,碰撞检测亦是如此,一个单独的物品是无法完成碰撞检测的。
注意:不同图层的物品无法完成碰撞检测,代码一律无效。
碰撞代码只执行一次,重叠代码重复执行。
由于MMF的工作原理,碰撞代码比较容易抽风(特别是在卡顿的时候),而碰撞代码远不如重叠代码常用,为此本章节只讨论重叠的情况。
②active间的重叠(实用性:8星)
我们在帧画面中的同一高度摆上两个active,用画笔涂上“1”和“2”,其中“1”在不停地向右运动,如果我们需要做到在两者重叠时销毁二者,该如何做呢?
碰撞检测的条件如图所示
*总是执行——设置“1”的x坐标为x“1”+2
*“1”与“2”重叠——“1”销毁“2”销毁




注意:销毁代码是MMF中最基础的代码,右击一个框后弹出的矩形最下端就是销毁代码,在此先提前渗透,我们将在第四章继续讲解。

——实例研究——
active间的重叠代码在敌人的攻击判定中应用的非常广泛,我们随意打开一个敌人的攻击判定代码(如板栗仔),我们会发现有这么一条:
*“子弹(马里奥)”与“板栗仔”重叠——(此处省略)


此代码就是用来判定子弹与板栗仔是否接触,从而杀死板栗仔。
③active与背景重叠(实用性:10星)
此处说的“背景”,是广义的背景中加了实心的,而不是我们制作关卡时后面垫的一张图,地面、砖块、水管中部是“加实心的背景”的主要组成部分。
下面我们就来动手研究active与背景重叠:创建一个active到帧画面中,写代码使其缓缓下落,当它与背景重叠时就销毁。

*总是执行——设置“活动对象”的y坐标为y“活动对象”+1
*“活动对象”与背景重叠——“活动对象”销毁



测试的结果便是如此√
由于active与背景重叠的应用较为复杂,往往与开关、分组、数值变量等代码元素混合使用,在此就不再举实例具体说明了,我们将会在以后的章节再详细解读。


回复
w1194600239 于 2016-07-18 15:29:35 id: 94144780145
今天先更新到此


id: 94144840626
12L | 作者:大爷23大买卖吗 | 发布于 2016-07-18 15:30

太棒了!正愁不知道代码,W11神贴就出来了!必须赞!


id: 94146076724
13L | 作者:End冰凌 | 发布于 2016-07-18 15:50

好顶赞!!!


id: 94147551050
14L | 作者:jijinqi2001 | 发布于 2016-07-18 16:14

支持下,另外图截的太好了非常清楚,截的恰到好处

回复
w1194600239 于 2016-07-18 17:02:55 id: 94150513136
喝了


id: 94148954004
15L | 作者:无视我…… | 发布于 2016-07-18 16:37

喝了


id: 94149736149
16L | 作者:我爱吃烧饼哈哈 | 发布于 2016-07-18 16:50

好难

回复
w1194600239 于 2016-7-18 16:52 id: 94149842478
喝了我已经讲的很细很明白了不会的话可能是MMF基本功不扎实
我爱吃烧饼哈哈 于 2016-7-18 16:53 id: 94149915159
回复 w1194600239 :MMF我现在只会做关


id: 94150516463
17L | 作者:马里奥X7 | 发布于 2016-07-18 17:02

很好,但碰撞与重叠也有区别:一个是每次条件满足只执行一次,一个是条件满足时重复执行

回复
w1194600239 于 2016-07-18 17:05:17 id: 94150661075
这个我知道,所以说碰撞代码远不如重叠代码常用,因为是入门教程所以不想讲太深。


id: 94162470462
18L | 作者:878yfy | 发布于 2016-07-18 20:10

求RE0.10.6地址

回复
快乐mario8 于 2016-07-18 20:42:36 id: 94164582561
mfe吧有
w1194600239 于 2016-07-18 21:58:28 id: 94169815159
我觉得你应该去看一下RE更新帖http://tieba.baidu.com/p/3471351863


id: 94164692346
19L | 作者:快乐mario8 | 发布于 2016-07-18 20:44

运动代码搞这么麻烦干蛤?直接用弹跳球设置方向速度即可。

回复
w1194600239 于 2016-07-18 21:57:15 id: 94169730483
然而这是基本的运动代码,联系上开关和数值变量之后就复杂了,复杂的运动代码就是以简单的运动代码为基础的,所以我今天讲的只是一个铺垫
快乐mario8 于 2016-07-18 22:15:12 id: 94170993945
回复 w1194600239 :搞复杂的也很简单啊,改方向和速度即可
w1194600239 于 2016-07-18 22:20:48 id: 94171400221
回复 快乐mario8 :你把锤子龟运动用弹跳球做试试啊……
快乐mario8 于 2016-07-18 22:24:37 id: 94171674055
回复 w1194600239 :一样的啊,将方向速度改为数值就可以了啊
快乐mario8 于 2016-07-18 22:25:51 id: 94171762247
回复 w1194600239 :好吧其实差不多的233
我爱吃烧饼哈哈 于 2016-7-18 22:44 id: 94173099068
回复 快乐mario8 :设置了怎么保存
快乐mario8 于 2016-07-19 00:38:40 id: 94180360562
回复 我爱吃烧饼哈哈 :按确定键,然后重开
快乐mario8 于 2016-07-19 17:42:34 id: 94228682145
回复 快乐mario8 :不对这是语言设置


id: 94172698724
20L | 作者:w1194600239 | 发布于 2016-07-18 22:39

如果不出意外的话,以后每2~3天更新一章节


id: 94177989390
21L | 作者:躺着喝牛奶喔 | 发布于 2016-07-18 23:57

收藏了,高考之后好好研读!


id: 94278641724
22L | 作者:w1194600239 | 发布于 2016-07-20 10:19

【【【第四章——创建与销毁】】】
物品的“出生”和“消失”也是很重要的代码,相对于复杂的运动,本章节的代码就只讨论物品的创建与销毁,因此本章内容不多而且较为简单,但也是代码学中非常重要的一环。
【物品的创建代码】
创建代码利用MMF代码中自带的“创建新对象”工具执行
右键它下方的任意一个方框,就会出现两个选项。其中本章研究第一个“创建对象”(第二个实用性不高)

①具体坐标创建(实用性:3星)
看到这种代码,自然就会想到我们第二章学到了具体坐标位置代码了,因此具体坐标创建代码就不难写了,我们不妨动手试试:如图,将一个active扔到屏外,
然后我们写代码使它创建在屏幕内(300,300)的位置:
*只执行一次——创建“活动对象”在(300,300)图层1




由此可以看出,具体坐标创建代码不仅可以自由输入创建的坐标,还能进一步写出创建的图层,可谓一举两得。注意条件是“只执行一次”或“帧开始时”而不是“总是执行”,否则MMF就会不断地创建这个active导致程序卡顿。
——实例研究——
这种代码目前最广泛的应用是随意创建一个物品在窗口外判定用,打开事件编辑器,在第64行就可以看到RE中有这样一条代码:
*帧开始时——创建“滚屏控制物件”位置在:(-152,13)图层1

这条代码有什么用呢?其实这是方便MMF判定用的,如果关卡中不存在这个active就无法进行相关判定,其他类似代码同理。
然而,具体坐标的创建还经常被一些代码大触用来暴力修bug,用来替代其他复杂的代码,不过它也有很大的局限性,但效果也是非常可观的,在此由于讲的太深就不赘述了。
②相对坐标创建(实用性:8星)
同样是类比相对位置代码,我们直接进入正题:如果我们要使一个不断下落的active接触地面时创建一个新的active在自己本身,同时自己销毁,我们把两个active分别标号“1”、“2”,该怎么去做呢?
*总是执行——设置“1”的y坐标为y“1”+2
*“1”与背景重叠;每次条件满足只执行一次——创建“2”相对于“1”的(0,0);“1”销毁



注意:相对坐标创建代码中只可输入相对坐标,不可输入图层编号。大家可以自己写代码测试效果。
创建代码的条件同样需要注意控制,不要重复创建。


回复
w1194600239 于 2016-07-20 10:28:38 id: 94279183445
卧槽我还有一楼被傻贲T度删了
w1194600239 于 2016-07-20 10:30:11 id: 94279279760
只能等帖子恢复了


id: 94278848364
23L | 作者:w1194600239 | 发布于 2016-07-20 10:23

——实例研究——
我们以WSW扩展中的红色解密砖为例来研究相对坐标创建代码的应用。

打开红色不透明叹号砖的代码,看到第一条:
*“红色砖块”的内部开关30为关闭;【反转】“红色砖块”不与透明实心块重叠——创建“透明实心块”位置在:相对于“红色砖块”的(0,0)

这就是红色砖块的添加实心代码,在这条代码中出现了开关,而我们完全可以无视它,因为开关在帧开始时都是关闭的(除了有特殊代码控制),在此补充一个知识点:
反转条件:即对某一个条件进行反转,使原有的意思相反。例如:重叠相反就是不重叠、位置在(0,0)相反就是位置不在(0,0).
如图,在某一个条件上按右键即可选择反转,如果一个已经反转了的条件再继续反转,那么它就会恢复原样。

③防彻删代码(实用性:2星)
防彻删代码主要是用来防止物品被彻底删除的,当MMF中没有此物品,但它又有防彻删代码时,它就会被MMF保存下来而不会丢失。虽然它没有太大的用处,但它也是必要的。
防彻删代码的结构很简单,条件都为从不执行(Never),事件内容就随意创建一个坐标值在任意的图层。
在RE的物品库事件组中都是防彻删代码,用来储存物品。

【物品的销毁代码】
销毁代码在之前我们已经渗透过了,它是MMF中最最基础的代码,在此我们主要点明一些注意事项:
不用担心销毁代码执行时所有的同类active都会被销毁,只有满足条件的active会被销毁
我们具体来研究一下:将两个同样的active放到帧画面中不同的高度,写代码使它们缓缓向下运动,碰到地面销毁:
*总是执行——设置“活动对象”的y坐标为y“活动对象”+1
*“活动对象”与背景重叠——“活动对象”销毁



测试结果表明,离地面低的active在先接触地面时先销毁,而一旁在空中的active并没有被销毁,而是继续下落直到与地面接触再进行判定。

创建与销毁代码还与物品的动画帧有一定的联系,我在下一章会讲到。



id: 94279129105
25L | 作者:gurcd | 发布于 2016-07-20 10:27

看见楼主说if从句条件从句说明楼主真正领悟了mmf代码规则


id: 94286095096
26L | 作者:w1194600239 | 发布于 2016-07-20 12:16

【首先声明刚刚帖子被吞了,正好我发现了我还漏了一点没讲,这次重发,要是被吞的帖子恢复了我就删了恢复的帖子】
——实例研究——
我们以WSW扩展中的红色解密砖为例来研究相对坐标创建代码的应用。
打开红色不透明叹号砖的代码,看到第一条:
*“红色砖块”的内部开关30为关闭;【反转】“红色砖块”不与透明实心块重叠——创建“透明实心块”位置在:相对于“红色砖块”的(0,0)

这就是红色砖块的添加实心代码,在这条代码中出现了开关,而我们完全可以无视它,因为开关在帧开始时都是关闭的(除了有特殊代码控制),在此补充一个知识点:
反转条件:即对某一个条件进行反转,使原有的意思相反。例如:重叠相反就是不重叠、位置在(0,0)相反就是位置不在(0,0).
如图,在某一个条件上按右键即可选择反转,如果一个已经反转了的条件再继续反转,那么它就会恢复原样。

在相对坐标创建的时候,我们可以点击下方的选项

然后弹出这个画面,我们可以通过红框中的选项调整物品创建时相对另一个物品的热点还是作用点。
注意:作用点是物品的另一个点,它的调试方法类似热点,在物品的这里可以查看/调试。

③防彻删代码(实用性:2星)

防彻删代码主要是用来防止物品被彻底删除的,当MMF中没有此物品,但它又有防彻删代码时,它就会被MMF保存下来而不会丢失。虽然它没有太大的用处,但它也是必要的。
防彻删代码的结构很简单,条件都为从不执行(Never),事件内容就随意创建一个坐标值在任意的图层。
在RE的物品库事件组中都是防彻删代码,用来储存物品。

【物品的销毁代码】
销毁代码在之前我们已经渗透过了,它是MMF中最最基础的代码,在此我们主要点明一些注意事项:
不用担心销毁代码执行时所有的同类active都会被销毁,只有满足条件的active会被销毁
我们具体来研究一下:将两个同样的active放到帧画面中不同的高度,写代码使它们缓缓向下运动,碰到地面销毁:
*总是执行——设置“活动对象”的y坐标为y“活动对象”+1
*“活动对象”与背景重叠——“活动对象”销毁

测试结果表明,离地面低的active在先接触地面时先销毁,而一旁在空中的active并没有被销毁,而是继续下落直到与地面接触再进行判定。


创建与销毁代码还与物品的动画帧有一定的联系,我在下一章会讲到。


回复
w1194600239 于 2016-07-20 12:19:31 id: 94286279374
注意:创建相对坐标的时候,MMF默认是热点,所截的图选的是作用点是我后来改的
无视我…… 于 2016-07-20 12:22:36 id: 94286479185
似乎位置在(0,0)这类条件是不允许反转的。不是所有条件都能反转 只有特定的条件可以
w1194600239 于 2016-07-20 14:57:33 id: 94296279346
回复 无视我…… :喝了那都不是条件,我只是举个例子说明什么叫“反过来”


id: 94329499343
27L | 作者:HappyLee_12 | 发布于 2016-07-20 23:12

写得很棒的,永吧迫切需要这样的教程,正好自己也学习一下,感谢。

回复
HappyLee_12 于 2016-07-20 23:14:29 id: 94329633897
迫切想问一下,有没有好的方式搜索活动对象(例如敌人)的代码?有时想找某句代码,翻遍各种对象就是找不到它藏在哪儿……
HappyLee_12 于 2016-07-21 00:05:10 id: 94332928231
问题:可不可以把关卡帧中的那一大堆代码写在全局事件中?因为可能有多关,一般改一关的代码其它关都需要改,一个个改岂不很麻烦?还是有更简易的做法……
无视我…… 于 2016-07-21 00:36:35 id: 94334724558
回复 HappyLee_12 :全局事件本质上是自动改变的所有场景的关卡事件。因此改变全局事件就会同时改变所有场景的事件 对于场景数少的作品没什么问题,但是场景数多的例如MFR(大概450 Frames)一旦轻微改动全局事件可能会卡顿十分钟之久
无视我…… 于 2016-07-21 00:38:13 id: 94334810518
回复 HappyLee_12 :有的 MMF上面有个表格状的按钮(事件编辑器/Event Editor),里面是按照对象列表显示事件 单击第一行的对象就会只相应显示和该对象有关的事件
HappyLee_12 于 2016-07-21 00:53:45 id: 94335576577
问题2:为何我经常看到在Rainbow Engine中同样的代码被写两次或更多?写一次又会有哪些区别呢?
w1194600239 于 2016-07-21 08:05:05 id: 94349352468
回复 HappyLee_12 :WSW正解,另外代码被写两次的话貌似是防抽风?
马里奥X7 于 2016-07-21 09:17:43 id: 94352495253
回复 HappyLee_12 :lyh貌似说过:一条代码写两遍是为了防止mmf/ctf2.5的一个碰撞误判的bug(也就是加强电脑的印象(雾))


id: 94362953848
28L | 作者:HappyLee_12 | 发布于 2016-07-21 12:09

回复 无视我…… : 就是说,场景的那堆代码理论来说是可以写进全局事件中的,只是对于场景较多的作品,在每次编辑代码时可能造成卡顿?这算是MMF的bug还是……

回复
无视我…… 于 2016-07-21 12:12:50 id: 94363157735
确理论上大部分代码可以,但是全局事件因为不能够使用分组所以仍然有大量代码(敌人运动 马里奥动画等等)无法写入全局事件 这个大概算是MMF的设定吧
HappyLee_12 于 2016-07-21 12:16:07 id: 94363364306
回复 无视我…… : 回复得好快,非常感谢。之前一个问题中,帧的Event Editor中还是无法读取每个活动对象自身的代码,我想问的是有没有简便方法可以搜索每个活动对象内部的那些代码,而不是把它们一个个点开。
无视我…… 于 2016-07-21 12:21:53 id: 94363725653
回复 HappyLee_12 :其实我不是特别明确"活动对象内部代码"的意思。活动对象是支持自带事件的,是在属性(properties)的行为(behavior)一栏中设置,但是是自带,和关卡代码无关,关卡事件代码的搜索的话Event Editor可能是最简便的方法了
无视我…… 于 2016-07-21 12:22:47 id: 94363782423
回复 HappyLee_12 :其中Rainbow Engine活动对象自身的部分属性的设置是在活动对象的行为里面
HappyLee_12 于 2016-07-21 13:09:35 id: 94366794829
回复 无视我…… : 嗯我想问的就是活动对象自带事件。因为活动对象太多了,有时不知道某行自己要找的代码藏在哪里,一个个点开活动对象的行为太累,我问的是有没有一种搜索方式能便于搜到藏在活动对象自带事件中的代码?谢谢。
w1194600239 于 2016-07-21 13:59:39 id: 94370065323
回复 HappyLee_12 :应该没有方法吧……写在活动对象自身事件本来就是为了好查找啊
无视我…… 于 2016-07-21 15:33:47 id: 94376243102
回复 w1194600239 :其实还有一个好处,活动对象自带事件中的条件指的都是该活动对象,而不是整一类。
HappyLee_12 于 2016-07-21 16:22:57 id: 94379417879
回复 无视我…… : 不一定啊,例如有城堡关的通关代码却写在Koopa敌人里面,还有一部分是在Koopa尸体里,至今我还没找到击败Koopa后使Mario不受伤这行代码藏在哪里……
w1194600239 于 2016-07-21 18:39:13 id: 94388284884
回复 HappyLee_12 :在库巴的攻击判定代码里,当库巴血量为0时,打开马里奥内部开关29,打开了马里奥就不会受伤了
HappyLee_12 于 2016-07-21 21:34:31 id: 94400003210
回复 w1194600239 : 哦原来写在最后一行了,经提醒后才发现。非常感谢。


id: 94402625528
29L | 作者:快乐mario8 | 发布于 2016-07-21 22:10

膜拜楼主

回复
w1194600239 于 2016-07-22 08:47:16 id: 94429028897
不敢当


id: 94434014881
30L | 作者:w1194600239 | 发布于 2016-07-22 10:19

抱歉今天有特殊情况更不了了……

回复
马里奥X7 于 2016-07-22 11:02:17 id: 94436687372
没关系的,支持一下lz,希望越做越好


id: 94457494594
31L | 作者:马里奥X7 | 发布于 2016-07-22 16:27

其实lz可以把这个教程发到wiki上,或是写到doc里然后上传。但真心希望lz的教程会越做越好


id: 94459764021
32L | 作者:w1194600239 | 发布于 2016-07-22 17:02

wiki上次出了事故都不敢去碰了……


id: 94513734047
33L | 作者:w1194600239 | 发布于 2016-07-23 10:05

【【【第五章——动画帧和动画方向】】】
各式各样的动画使得关卡丰富多彩,那么这些动画的机制是怎样的呢,本章节就来探讨一下这个问题及其相关代码。
【MMF的动画机制】
①动画序列
每个active都有很多种动画,我们把不同的动画叫做动画序列。
双击一个active(如红刺猬)可以看到左下方的动画栏中有许许多多的动画序列。

其中带点的动画序列为可用序列,指该序列中有图像。如果在不带点的动画序列中插入/粘贴一张图片,那么该序列也会变成可用序列。
动画序列是调整active动画的最好手段,但是需要注意几点:
active被创建时会播放“显现”动画,active被销毁时会播放“消失”动画。在没有特殊代码控制的情况下,active在帧开始时播放“停止”动画。
②动画帧
在每一个动画序列中,都可以编辑无数个图像,这些图像叫做动画帧。
在动画帧左侧的“方向选项”中,可以看到有几个数值,我们一一来介绍。

速度:指播放各个帧的间隔时间长短,速度最小为0最大为100,当速度为0时相当于只播放第一帧。有些动画序列的速度有“最高速度”和“最低速度之分”,我们编辑图像时一般把这两者的速度值都设置为一样的大小。
重复/返回到/循环:指该动画序列下的动画帧全部播放完后是否再继续播放,重复=1则播放一遍,重复=10则播放十遍。每次重复后可以跳转到指定帧继续播放,这可以通过“返回到”来设定。如该动画序列中有5个动画帧,重复=2,返回到=3,那么测试时播放的动画就为:1-2-3-4-5-3-4-5(其中数字表示帧代号).
循环按钮用于设置动画是否循环播放,循环播放时在没有代码控制的情况下动画不会停止,它同样也受“返回到”按钮控制,用法同上。
③动画方向
每一个动画序列中都有默认的4个动画方向,当动画方向中存在动画帧时,该方向用实心黑点表示,反之用空心黑点表示。用实心黑点表示的动画方向称为可用方向。用黑色指针指示的方向为当前方向下的所有动画帧。

动画方向的个数是可以自定义的,拖动指针盘下方的一个移动浮标,可以实现8方向、16方向和32方向。






id: 94514035138
35L | 作者:w1194600239 | 发布于 2016-07-23 10:10

【方向的设置和判定】
①设置方向(实用性:7星)
物品的方向的主要应用还是通过具体的条件来切换方向,主要就是三种情况,一是朝向马里奥(典型例子:锤子龟、绿色飞乌龟),二是朝向自身的x速度的方向(典型例子:刺猬、乌龟),三是朝向与某一物品相同的方向。本章我们主要来研究第一种情况,至于后两种将在以后的章节会略带一提。
我们先来看第一种情况:创建一个active,我们用画笔画上“←”和“→”的箭头分别位于“←”方向和“→”方向这两个可用方向。

要使它朝向马里奥,需要用到两者x坐标的比较:



*“活动对象”的x坐标≥x“马里奥位置”——设置“活动对象”的方向为“←”
*“活动对象”的x坐标<x“马里奥位置”——设置“活动对象”的方向为“→”

其中两条代码是分情况讨论的,所以其不等号的临界位置(即该不该加等于号)可以任意改变。大家可以自行测试其效果。
——实例研究——
我们打开锤子龟的方向判定代码:在锤子龟的行为栏中的“锤子龟运动”中,找到“方向”这一注释,下面两条就是锤子龟判定朝向的代码。



id: 94514227264
36L | 作者:w1194600239 | 发布于 2016-07-23 10:13

②方向判定(实用性:3星)
方向的判定代码不常用,我们主要讲一些新人看到了方向判定代码后把原先的代码复杂化的误区。方向判定代码即用朝向xx方向作为条件判定一个事件的执行,而物品的方向往往也是需要通过条件来设置的,所以这样可以简化。
用刚才做过的朝向马里奥的active作进一步深化,让它朝着所在的方向运动,那么就应该增加两条代码:


原代码:*“活动对象”的x坐标≥x“马里奥位置”——设置“活动对象”的方向为“←”
*“活动对象”的x坐标<x“马里奥位置”——设置“活动对象”的方向为“→”
新增代码:*“活动对象”朝向方向“←”,设置“活动对象”的x坐标为x“活动对象”-1
*“活动对象”朝向方向“→”,设置活动对象的x坐标为x“活动对象”+1

事实上我们再仔细观察这个代码,不难发现这4条代码过于繁琐,我们可作简化,省去方向判定代码:
*“活动对象”的x坐标≥x“马里奥位置”——设置“活动对象”的方向为“←”;设置“活动对象”的x坐标为x“活动对象”-1
*“活动对象”的x坐标<x“马里奥位置”——设置“活动对象”的方向为“→”;设置“活动对象”的x坐标为x“活动对象”+1

所以该方向判定代码并没有太大的实际意义,这个反例也是非常典型的。

但是有些情况就不得不用方向判定代码了,但这种情况非常少数(如跟踪炮弹的跟踪代码、抛物线运动的运动方向等),这些都不属于入门级教程范围内,需要根据实际情况判断。



id: 94514519004
37L | 作者:w1194600239 | 发布于 2016-07-23 10:18

【动画的调试和判定】(实用性:8星)
动画的调试即改变/还原某个物品的动画序列/动画帧/帧速等,其中改变动画序列和添加背景用的最广泛。
如图
动画的判定即当物品正在播放某一动画序列/动画帧,或当某动画序列停止播放时,执行xx事件。
如图
我们直接从例子看起,在奖励文件夹中拖一个金币放到帧画面中,先双击查看它的动画。


我们看到它左边的动画中停止和行走前面有黑点,其中停止动画序列是一个问号上面一个金币,行走动画序列就是一个问号动画。先别急着关,我们往下看看,发现最后一个动画序列也是有黑点的,它是新增的动画序列,名为“User animation”,动画为用过的问号块。
好了,接下来我们查看它的“顶”的代码,先看第一条:
*“问号(金币)”的动画序列“Stopped”正在播放——更改“问号(金币)”动画序列为“Walking”

我们知道问号块放在关卡里测试的时候,显示的是问号动画(即动画序列“Walking”),而刚才我们知道,如果没有代码控制的情况下,MMF会自动播放动画序列“Stopped”这条代码就是用来切换动画的,不难理解。
我们接着看下一条,由于牵扯到开关等代码,我们直接看某一个执行的行为:“更改动画序列为12”

这个动画序列12是什么呢?这个实际上是使用了MMF中“使用一个算法”的设定,指的就是第12个动画序列(即User animation动画序列)。由于当初lyh在mmf2hwa版本上面编辑RE时有不能显示新加的动画序列的bug,于是这种用法沿用至今。我们把它删除,新增代码:改变“问号(金币)”的动画序列为“User animation”,效果是一样的。
关于动画的复位代码,其内容包括有复位动画序列/复位动画帧/复位动画方向/复位帧速度等,其中“复位”意思就是还原的意思,指还原最初的动画序列/动画帧/动画方向/帧速度,无论你经过多少次替换,记住都还原原始状态就行了。
另一个非常常用的就是“添加背景作为障碍”代码,我们看到水管的添加实心代码:


点击“添加背景”后,弹出这样一个窗口


我们选择“障碍物”再点OK即可,此时该active的表面就被添加了一层背景,这个背景是有实心的,可以进行碰撞检测。
关于动画代码掌握这些东西也就行了,动画代码的字面意思也比较清楚,理解起来很方便。



id: 94520442645
38L | 作者:Lakitu01 | 发布于 2016-07-23 11:49

支持!
对我这样的代码渣渣很有帮助233



id: 94680809026
39L | 作者:w1194600239 | 发布于 2016-07-25 13:13

【【【第六章——物品的开关和分组】】】
在入门代码教程中,开关、分组、数值变量是物品的三个基本代码量,是代码中的难点。本章节讨论其中的开关和分组。
【物品的分组】
①分组的概念及常见的分组
分组是指把一些active整合起来,添加到一个组,这个组的代码对于所有组成员有效,且分组的开关和数值变量适用于所有组成员。
我们把一个板栗仔拖到帧画面中,单击它一下并看到它的行为栏,可以在上面看到它的分组。

点击编辑可以查看大图和编辑分组。

常见的分组有:
组0:运动的龟壳
组1:指在地面上匀速运动的普通敌人
组2:属于组1,两两碰撞时会转向
组3:平台
组6:属于组1,遇到悬崖时自动转向(红乌龟)
组敌人:能被运动的龟壳和无敌星撞死
组一般4:主要负责除马里奥和组1敌人外所有“有重力”物品的落地判定
组奖励:包含隐藏和非隐藏的所有奖励问号
组障碍物:所有组成员的表面均加上实心







注意:分组只能在事件编辑器使用,行为栏和全局事件中不能使用分组。



id: 94680923111
40L | 作者:w1194600239 | 发布于 2016-07-25 13:14

②添加分组的实际应用
添加分组往往可以简化部分或全部的代码。
如果我们需要制作一个遇到悬崖会自动转向的黄乌龟,我们只要把黄乌龟添加组6即可



如果我们需要制作HC式刺猬,除了把刺猬速度改成2之外,还需要删去刺猬的组2

【物品的开关】

①开关的初步了解
每一个物品都有32个开关,他们分别是0号开关~31号开关,开关的状态只有“打开”和“关闭”两种。
当输入的开关数值≥32时,那么实际的开关数值a、输入的开关数值b满足关系:a=b-32n(0≤a≤31)(n为正整数),当b不为正整数时,采用去尾法取整。
如输入开关编号233.3,那么它的实际开关编号为:233.3取整→233→233-32*7=9,故此开关真实编号为9
好了以上都是废话233,当我们在代码中使用了某一个开关a作为条件时,那么我们就说这个active的开关a被占用。
开关的数值不影响其效果,如把一个完整代码的某一active的所有开关0都改为开关10,只要开关10不被占用,都是没有bug的.
注意:在帧开始时,没有代码操控的情况下,所有物品的所有开关均为关闭。
②常见的物品开关
我们需要主要了解一些重要物品开关的作用:
马里奥:开关11表示在空中、开关20打开死亡、开关21打开受伤、开关22打开无敌、开关28打开过关、开关29关闭时马里奥碰敌人受伤/死亡
组1:开关10打开向右,开关10关闭向左
组一般4:开关19打开表示与实心接触
组奖励:开关20打开表示马里奥顶到问号
组敌人:开关23打开时表示被马里奥无敌星状态杀死



id: 94681610478
41L | 作者:w1194600239 | 发布于 2016-07-25 13:25

③打开、关闭、切换开关(实用性:10星)
学习了有关物品的开关还远远不够,我们最重要的是把开关用于实践,学会自主普安段每个开关的意义。我们先来看看开关的条件:

注意MMF汉化版的一个bug:开关条件的打开和关闭开关是相反的,假如我们选择了“开关已关闭?”然后输入开关编号0后,结果发现:如果我们选择了“开关已打开?”同理也是反的。
下面我们来介绍如何制作朝向自身运动方向的代码:
创建一个active并在左右两个方向画上“←”和“→”的箭头,我们要做到每隔1s active的运动方向改变一次,并相应切换方向。在这里我们就要用到开关了,我们随便定义一个开关0为切换运动方向:

*“活动对象”的内部开关0为关闭——设置“活动对象”的x坐标为x“活动对象”-2;设置活动对象的方向为“←”
*“活动对象”的内部开关0为打开——设置“活动对象”的x坐标为x“活动对象”+2;设置活动对象的方向为“→”
*每隔01”-00——切换“活动对象”内部开关0


我们在此补充一个知识点:时间间隔代码,非常好理解,就是每次执行该代码需要一定时间的间隔(时间间隔可以自定),如果该代码由于条件只能执行一次,那么时间间隔代码的意义就是该代码的执行需要一定时间的延迟。


由此代码,那么该active的内部开关0有何意义呢?我们从三个方面去考虑:开关关闭时执行什么事件、开关打开时执行什么事件、什么时候打开/关闭开关。综合以上代码,我们不难得出以下结论:

active的内部开关0的意义是:打开时active向右运动,关闭时active向左运动,每隔1s开关切换一次
——实例研究——
同理我们来研究一下红色解密砖的代码:
首先我们来看红色开关的“顶”的代码,看第一条:
*“红色开关”的内部开关20为打开——播放音效xx(实际上根本就没有音效);切换“红色砖块”的内部开关30;切换“红色砖块隐”的内部开关30;关闭“红色开关”的内部开关20;更改“红色开关”的动画序列为14

我们在红色开关的行为栏中发现他属于组奖励,所以它的内部开关20打开说明马里奥顶到了开关。

那么切换两种砖块的内部开关30是什么意思呢?此时我们无从得知,继续看两种红色砖块的代码:
*“红色砖块”的内部开关30为关闭 【反转】“红色砖块”不与透明实心块重叠——创建“透明实心块”位置在:相对于“红色砖块”的(0,0)
这条代码我们之前讲解过,指的是给实心红色砖块加上实心,这建立在内部开关30为关闭的情况下,我们接着看:
*“红色砖块”的内部开关30为打开;“红色砖块”与实心重叠——创建“红色砖块隐”位置在:相对于“红色砖块”的(0,0);“红色砖块”销毁;“透明实心块”销毁

这明显是实心砖块切换为透明砖块的代码,用创建和销毁组合实现了物品的转换,注意条件是内部开关30为打开。
注意:前面的代码“关闭红色开关的内部开关20”导致切换两种砖块的开关30不再执行,所以新创建的砖块的内部开关30都是默认关闭的。
同理,我们看红色砖块隐的代码:
*“红色砖块隐”的内部开关30为打开——创建“红色砖块”位置在:相对于“红色砖块隐”的(0,0);“红色砖块隐”销毁


注意到这个新创建的红色砖块并没有添加实心,但这个和上面同理,新创建的砖块内部开关30默认关闭,于是又执行了“添加实心”的代码,至此整个红色解密砖形成了一个完整的代码循环。

我们不难由此总结出红色砖块和红色砖块隐的内部开关30的意义:打开时通过创建和销毁组合使自身位置互换,“红色砖块”的内部开关30关闭时添加实心,且利用开关默认关闭的性质做到完美循环,内部开关30通过马里奥顶红色开关来切换。
至此第六章完,恭喜你已经攻破了入门级代码两大难点之一——开关!!!要熟练掌握,建议多多实践,适当找一些物品的开关试着理解它们的含义。


回复
878yfy 于 2016-07-25 13:30:34 id: 94681954079
我几乎没有看
w1194600239 于 2016-07-25 13:37:17 id: 94682395650
回复 878yfy :什么意思???


id: 94712241298
42L | 作者:jijinqi2001 | 发布于 2016-07-25 21:04

帮顶


id: 94912740128
43L | 作者:w1194600239 | 发布于 2016-07-28 14:16

LZ这几天要出门旅游,只能下周再更新了


id: 94918232376
44L | 作者:巃嵸巋巚 | 发布于 2016-07-28 15:44

很赞的教程,只是机翻汉化一下子懵了……这货我用起来不习惯

回复
w1194600239 于 2016-07-28 16:14:55 id: 94920124073
英文版的用起来写代码不方便……
巃嵸巋巚 于 2016-07-28 16:16:49 id: 94920248057
回复 w1194600239 :还好吧,看不下去的原因主要是机器的各种神翻译


id: 94937285467
45L | 作者:Lakitu01 | 发布于 2016-07-28 20:44

感谢w11这么认真的写代码教程,让我学会了不少代码知识,对于代码各种的难点、重点讲的都很详细,对新入门的新手和我这种代码渣渣都有比较大的帮助

回复
w1194600239 于 2016-07-28 22:19:49 id: 94943769003
谢谢


id: 95167619844
46L | 作者:Lakitu01 | 发布于 2016-07-31 21:04

等待更新

回复
w1194600239 于 2016-07-31 21:16:16 id: 95168434800
明天不出意外会更


id: 95203596464
47L | 作者:w1194600239 | 发布于 2016-08-01 10:09

【【【第七章——数值变量入门】】】
本章节研究MMF代码学中的一大难点——数值变量(又称可变值),本章中初步掌握它的基本用法即可。
【数值变量的定义】
①如何理解一个物品的数值变量
每个物品都有26个数值变量,它们分别是数值变量A、数值变量B……数值变量Y、数值变量Z.数值变量可以在物品的属性栏中直接调试并改变名称方便理解。数值变量简单的说,就是一个可变值,它在没有代码控制的情况下初始值为0,正由于它“可变”的性质,它能在代码中灵活的改变从而实现各种各样的代码效果,从本质上来看,数值变量就是一个数,只不过它可以改变而已。

如板栗仔的数值变量,在属性栏中查看,发现只有一个“行走速度”,我们点击新建,可以出现更多的数值变量,但不要轻易改变它们。

②数值变量的分类
一般地,在属性栏中显示的、名称不为字母的数值变量比较好理解,它一般只供玩家更改数值方便,且它的基本意思就是它的名称,在代码中一般不会轻易改变。
另一种是没有在属性栏中显示的,但又在代码中灵活改变的数值变量,它的意义不明,但可能在代码中被占用,需要我们自己去理解(必要时可以通过注释方便理解)。
当然特例也是有的,如马里奥位置的数值变量不能轻易改变。

【数值变量的基本应用】
①模拟时间间隔(实用性:10星)
利用不断递增/递减的数值变量同另一个可以自行定义的数值变量进行比较,可以模拟手动控制的时间间隔。它相对于单纯的时间间隔有一个好处:用数值变量的递增/递减会受帧速影响,这样在强制滚屏瓜就不会因为电脑卡而过不去了。
我们通过一个简单的递增数值例子来理解如何模拟时间间隔:
创建一个active写代码让其匀速向下运动,我们要制作一个手动控制的数值变量来控制它在下落过程中何时销毁。
我们定义数值变量A为可以控制的定值,并将它改名为“销毁间隔”,输入数值100,定义数值变量Z为不断增加的数值。

下面我们就要开始写代码了,我们先来看看数值变量代码的写法:
数值变量作事件内容:
数值变量作条件:
*总是执行——设置“活动对象”的y坐标为y“活动对象”+1;“活动对象”的数值变量Z加上1
*“活动对象”的数值变量Z≥“活动对象”的“销毁间隔”——“活动对象”销毁

此时,我们可以自行控制销毁间隔的多少,假设定为100,由于帧速默认为50,所以实际销毁时间为间隔2s.如果我们改成10,那么实际销毁间隔就为0.2s.
——实例研究——

我们来研究一下RE中喷火器的工作原理,它是典型的递减数值模拟时间间隔。
首先看它已有的数值变量
在查看它的代码,我们主要看前三条:
*“喷火器”的数值变量E>0——“喷火器”的数值变量E减去1
*“喷火器”的数值变量E=0;【反转】喷火器在窗口边缘的0像素内——播放音效volcano3;“喷火器”的数值变量E设置为喷火器的“两次喷火间隔”;“喷火器”的数值变量D设置为“喷火器”的“喷火数目”
*“喷火器”的数值变量D>0;每隔00”-05——“喷火器”的数值变量D减去1;射击“火焰”方向←速度50

我们现在来分析这三条代码的执行结构:首先,补充一个代码中的常用条件:【反转】xx在窗口边缘的a像素内,一般地,a为0或负数(否则会露馅啥的),它指的是该物品在屏幕一定范围内触发该条件,a值越小,触发范围越大。如果去掉【反转】,很显然就变成了xx不在屏幕一定范围内的条件。由此可以得出,当喷火器进入屏幕时,数值变量E初始为0,所以首先执行代码2,把数值变量D设置成了一个正数值,由代码3可知,当数值变量D为正时且经过0.05s的时间间隔,喷射火焰。于是喷火器完成了喷射任务,重新看到代码2的执行事件,还把数值变量E设成了“两次喷火间隔”,然后数值变量E一直减去1,直到为0,又重新喷火焰,这样就形成了一个代码循环。由此不难理解,我们把“两次喷火间隔”设的越大,间隔就越长,原理就在利用了递减数值模拟时间间隔。

——问题研讨——
喷火器的数值变量D有什么意义呢?你如何理解?



id: 95203796212
48L | 作者:w1194600239 | 发布于 2016-08-01 10:12

②模拟多功能开关
我们知道开关有打开和关闭两种状态,而数值变量正因为它的值可是是无限个,所以用具体的值来作为代码的条件就相当于一个多功能开关。
我们直接来看例子:RE的水管连接传送马里奥进行的一系列事件就是利用马里奥的数值变量E(进水管阶段)作为多功能开关的,我们先看RE的注释:
马里奥的可变值E
0=马里奥在水管外
1=马里奥在进入水管
2=马里奥准备传送
3=马里奥传送完毕
4=马里奥在出水管


记住这个注释后,我们就可以研究它的代码了。其实水管连接的整体可以看作三个部分:进水管的绿色箭头、传送的两个菱形、出水管的红色箭头。每个部分的代码都是相同或类似的,我们以向下进入向上出来为例进行研究。
我们先看向下的绿色箭头代码,截图如下:
我们看第二条的条件:水管连接入口下与马里奥位置重叠不多说;马里奥位置的内部开关11为关闭在之前的章节中已经学过,意思是马里奥在地面上;进水管阶段=0我们刚刚知道是马里奥在水管外;最后一个条件一带而过不作过多解释,指的是玩家按住下键。这时马里奥的进水管阶段=1了且水管连接入口下的内部开关0打开,表示马里奥在进入水管。

我们接着看第三条:
*“水管连接入口下”的内部开关0为打开且数值变量A<60——“水管连接入口下”的数值变量A加上1;设置“马里奥位置”的y坐标为y“马里奥位置”+1;设置“马里奥位置”的x坐标为x“水管连接入口下”
从这条代码的部分情况来看,马里奥正在缓缓向下移动,进入水管,注意到水管连接入口下的数值变量A一直在加1,这与我们之前讲过的模拟时间间隔类似,接着看下一条:
*“水管连接入口下”的数值变量A=60——“水管连接入口下”的数值变量A设置为0;关闭“水管连接入口下”内部开关0;“马里奥位置”的进水管阶段设置为2
这就是一个完整的模拟时间间隔的代码了,此时马里奥不再向下运动,但多功能开关的代码还没有结束。
打开事件编辑器中的“水管连接”事件组,看到第447条(不同版本的RE可能条数不同),为了方便区分,我们用“绿菱形”和“红菱形”来代替部分名称。

*“马里奥位置”与“绿菱形”重叠;进水管阶段=2;“红菱形”的数值变量A=“绿菱形”的数值变量A——设置“马里奥位置”位置在:相对于“红菱形”的(0,0);进水管阶段设置为3

这对应了注释里面的内容:进水管阶段=2表示马里奥准备传送,进水管阶段=3表示马里奥传送完毕。

我们接着看水管连接出口上的代码,由于跟之前的水管连接入口下的代码类似,所以讲的粗略一点:

第一条代码明显是在进水管阶段=3的基础上,马里奥传送完毕并设置进水管阶段为4,然后随之而来的第二条就是马里奥在出水管,这与之前讲的代码非常类似,最后传送完毕时,仍然不忘记把马里奥的进水管阶段设置为0
——问题研讨——

我们再来总结一遍上述文字,发现进水管阶段这个数值变量=0、=2、=3时分别作了一个条件,相当于3种状态的开关,而=1、=4却没有派上实际用场,我们能否更改其中的部分代码,使得=1、=4也派上用场呢?又要怎样更改代码内容呢?这个问题留给大家课后思考,有兴趣的吧友可以把自己的答案回复告诉我。



id: 95255014310
49L | 作者:w1194600239 | 发布于 2016-08-01 22:34

下次更新完第八章后短时间内应该不会再更了,我也要专心去赶工MRI2……


id: 95431238183
51L | 作者:旋律END233 | 发布于 2016-08-04 21:06

w11写教程辛苦了~!


id: 95463634486
52L | 作者:w1194600239 | 发布于 2016-08-05 12:37

【【【第八章——探究较复杂的运动代码】】】
前面的章节我们学到了基本匀速直线运动的代码结构、开关和数值变量,我们现在就在这基础上探究更高级的运动代码。
【射击运动】
在MMF中,单独列出了一种特殊的运动代码——射击。


射击有四要素:射击点、射击对象、射击速度、射击方向。
当某一个物品被射击时,那么它就在射击点开始运动,用射击速度的值的冲击力沿着射击方向作抛物线运动,射击速度可以近似的理解为射击一个物品的力度。
对于射击的方向,有定向和不定向之分,定向射击即朝着一个固定的方向射击,不定向射击指的是在一定的范围内任意一个方向进行射击。
①定向射击的应用
关于定向射击,我们最常用的应该就想到敌人的攻击判定了。
打开板栗仔的攻击判定,看到“子弹”下方的代码:
*“板栗仔”与“子弹马里奥”重叠——播放音效kick 2;创建“奖分100”相对于“板栗仔”的(0,0);“板栗仔”射击“板栗仔尸体”方向8、速度25;“板栗仔”销毁;“子弹马里奥”打开内部开关0


如图所示标出了射击的四要素。
这是马里奥发射子弹杀死板栗仔的代码,点击编辑可以查看射击代码的相关内容。
点击这个红点即可查看方向
如图,方向机制和动画方向类似,方向8代表竖直向上。
类似的例子还有很多,如岩浆喷射火球,高火球和低火球之分就是射击的速度不一样。


另外,注意下面这个设置方向的按钮

点击后会出现设置位置类似的窗口,它指的是朝着一个定点射击。
②不定向射击的应用
关于不定向射击,我们在此主要以群火球为例,介绍不定向射击的制作方法。


如图所示,看到了很多方向,其实往很多个方向射击就是随机选取其中一个方向射击。


不定向射击出了方向随机外,其余和定向射击原理相同,就不再赘述了。



id: 95463803056
53L | 作者:w1194600239 | 发布于 2016-08-05 12:41

【基本的变速运动】
①变速运动的认识与简单制作
我们在之前学过匀速直线运动的代码,但变速怎么做呢?其实很简单,定义一个数值变量为速度即可轻松解决,在此我也要给出两个很重要但不难理解的概念,虽然高中才会学到但是我不得不说:
匀加速直线运动:速度是均匀增加的直线运动,即单位时间内速度不断增加的值相同。
匀减速直线运动:速度是均匀减小的直线运动,即单位时间内速度不断减小的值相同。
在此说的速度与方向无关,只表示运动的快慢而已。
在入门级教程中,只讨论改变x速度和y速度中任意一种、且另一种为0的变速运动,关于其他运动,则涉及到曲线运动的相关内容,不列入教程范围内。
我们制作一个active水平向右做匀加速直线运动的代码:
*总是执行——设置“活动对象”的x坐标为x“活动对象”+“活动对象”的数值变量A
*每隔00"-20——“活动对象”的数值变量A加上1

如果要提高速度增加的快慢,自行修改时间间隔即可。
②自由落体运动
在变速运动中,我们主要来讨论自由落体运动。
在MMF中的自由落体运动基本有两种,一种是先匀加速、后匀速的运动(典型例子:马里奥、刺球);另一种是一直匀加速的运动(典型例子:组1敌人),而后者就相当于是刚刚学的变速运动,所以现在主要讲前者的制作方法。
我们先来自己制作,创建一个active放到屏幕上沿,由于是先加速、后匀速的运动,我们要把必要的值先用数值变量备好以便调试,一般我们只需定义匀速运动时的速度即可。

至于加速度,一般是每0.15s或0.20s速度+1,可以自行定义,不作过多限定。
*每隔00"-20;“活动对象”的数值变量Z<“活动对象”的“匀速速度”——“活动对象”的数值变量Z加上1

*总是执行——设置“活动对象”的y坐标为y“活动对象”+“活动对象”的数值变量Z

——实例研究——

我们来探究刺球的下落代码
*“刺球红”的内部开关19为关闭——设置“刺球红”的y坐标为y“刺球红”+“刺球红”的数值变量A
*每隔00"-15;“刺球红”的数值变量A<8——“刺球红”的“数值变量A”+1

我们知道刺球红属于组一般4,所以内部开关19为关闭的意思就是刺球红不与实心接触。代码中把匀速的速度设死为了8,要想增大只要改大8即可。
需要注意的问题是,刺球被创建后首先要向上减速一段,那是怎么实现的呢?实际上在快乐云创建刺球的代码中有设置:

这样数值变量A不断+1实现刺球被抛出的运动,就不难理解了。


回复
w1194600239 于 2016-08-05 12:45:40 id: 95464012630
本教程最近一段时间应该不会更新……敬请谅解


id: 96690577951
54L | 作者:w1194600239 | 发布于 2016-08-24 10:16

【【【第九章——基本辅助代码(一)】】】
【选取或计数】
选取或计数一般在代码的条件使用。“选取”是随机的,即任意选取一个物品作为条件;“计数”是比较(范围内)物品的数量大小作为条件。

①同种物品随机选取
我们来通过实例体验一下MMF的随机选取代码。用RE摆个这样的地形:


然后在事件编辑器中写代码:

*每隔01-"00 选取其中一个“板栗仔”——销毁

②同种物品的计数
计数物品主要应用于做消灭敌人的关卡(即消灭完敌人过关),我们利用之前的地形,在事件编辑器中来简易制作一下代码。
*“板栗仔”的数量=0——停止任何音效;在通道#32播放音效1-Music-Complete-Level;停止任意音乐播放;打开“马里奥位置”的开关29;关闭“马里奥位置”的开关1;打开“马里奥位置”的开关28;“马里奥位置”的x速度设置为0

③帧物品的选取与计数
刚刚我们讨论了同种物品的选取与计数,实际上也可以对全帧的物品进行同样操作,代码就在“新对象”中。

其中第一个就是“随机选取一个对象”,这就是在全帧进行随机选取了。还有一个“与对象的总数进行比较”,它指的是一个帧的所有物品的数量的大小比较,因为它决定了关卡的流畅程度,因此可以通过选取与计数结合来对有特效的关卡进行防卡。
——实例研究——
我们以RE mod引擎中的雪花生成器为例,来探究选取与计数在防卡中的应用。
正确调整属性后,我们测试发现雪花特别多,这就导致游戏不流畅了。

所以我们要尝试不断销毁一些雪花,怎么办呢?
我们在代码中这样写:
*对象总数≥300;随机选取一个“雪花”——“雪花”销毁
然后多复制几遍,防卡效果就会更佳


事实上可以把雪花加上淡入淡出特效,效果更好哦~



id: 96690661748
55L | 作者:w1194600239 | 发布于 2016-08-24 10:18

【基本帧控制代码】
在MMF中,帧的控制也比较常用,它起到连接各个关卡的作用。
MMF的“故事面板控制”的条件中,我们已经学过了“帧开始时”,其实还有“帧结束时”等但是并不常用。

帧控制代码主要还在行为中。可以看到常用的有“上一帧”、“下一帧”、“跳转到指定帧”、“重新启动当前帧”,至于帧窗口的位置则不在本教程的研究范围内。

——实例研究——
我们来看看RE中跳帧水管连接的代码,这些代码似曾相识,与我们之前看过的水管连接代码非常相似,但有一个地方不一样:

这里是使用跳帧编号作为一个数值变量来实现跳帧的,这样做在整合关卡时非常容易失误而出错,我们不仿删去它,直接写跳转到指定的帧(由于使用的是单关版引擎所以只有一帧)

注意:RE使用的是红框的“使用一个算法”来实现定义数值变量的。
我们再来看RE中一个非常头疼的问题,没有跳转到下一帧的水管连接,现在我们可以自行制作了。
首先随便使用一个其他的颜色用填充工具涂上方便区分,然后改一下跳帧代码就行了。




id: 96708612832
56L | 作者:Lakitu01 | 发布于 2016-08-24 16:36

终于更新了233