【经验总结】MMF2代码编写过程中几个纠结的问题及其解决方法
mfe吧
全部回复
仅看楼主
level 7
lyh娘 楼主
一楼喂熊
2013年12月22日 10点12分 1
level 7
lyh娘 楼主

个人觉得这几个问题是每个用MMF2制作游戏的人都有必要了解一下的
不知道大家遇没遇到过,有一些情况下,明明我们的代码逻辑上没有(或者看似没有)任何问题,但执行时就是会出奇葩的问题
这些问题一旦遇到,除非事先对此有所了解,否则基本上是累死也找不出解决方法……我就有过被这种问题困扰N久的苦痛经历,在无数次尝试之后,我总结了这些问题及对应的解决方法,供大家参考
2013年12月22日 10点12分 2
level 7
lyh娘 楼主
问题一:通过条件选中多个物品,预期是每个物品都对某个无关物品进行一次操作(最常见的就是操作玩家的得分),但实际上这个操作只进行了一次
产生原因:虽然选中了多个物品,但这条代码还是只执行了一次,自然其中的任何操作都只会进行一次
典型代码1:
奖分100:internalflag 0 is off
-玩家1:Add 100 to score
-奖分100:set internal flag 0 on
出现问题:同一条语句一次执行创建了多个奖分100,只加了100分
问题分析:因为没有办法获取到新创建的100分的数目,就算有也相当复杂得不偿失,只能想别的办法让这条代码执行要加分的次数
解决方法一:可以使用下面的代码
修改后的代码一:
Pickobjects with flag #0 off(此条件为"Create object"物件的条件)
Pick one of奖分100
-玩家1:Add 100 to score
-奖分100:set internal flag 0 on
注:此代码表现为一百一百的加(每帧加一百),如果需要瞬间加完可以将上面的代码放到一个fast loop里
典型代码二:
马里奥头顶 is overlapping 砖块
-玩家1:Add 50 to score
-砖块:Destroy
出现问题:当马里奥同时顶碎两块砖块的时候,只加50分
问题分析:这个问题比较极端了,砖块都没了自然不能像上个例子那样筛选了。其实这个问题的解决方法更简单,collision条件有触发型(红字)和非触发型两种,这个例子用了非触发型条件,代码顺序执行到这行时马里奥顶了俩砖,符合条件,执行一次,只加50分。把这个条件改成触发型后马里奥顶到几块砖就触发几次这行代码,这样就没有问题了
修改后的代码二:
Collision between 马里奥头顶 and 砖块
-玩家1:Add 50 to score
-砖块:Destroy
多说一句:这个问题不怪编辑器,到头来还是代码的逻辑有问题,但当初这个问题的确困扰了我很久,而且一直以为是编辑器的bug,所以把它一并写出来。
而接下来的问题全部是讲如何与MMF2的bug抗争[思考]
2013年12月22日 10点12分 3
level 7
lyh娘 楼主
问题二:一条代码创建了物品,并对创建的物品进行操作,如果这条代码在一次执行中创建了多个物体,那么操作只对其中一个物体起效
产生原因:编辑器bug
典型代码一:
马里奥头顶 is overlapping 砖块
-create 砖碎动画 at 位置 from 砖块
-(更改砖碎动画的可变值)
出现问题:当马里奥同时顶碎两块砖块的时候,第二块砖块的砖碎动画不正常工作
解决方法一:将事件的条件改为触发型(原理和上一个问题的代码二相同,把执行一次创建多个物体拆成执行多次每次创建一个物体)
修改后的代码一:
Collision between 马里奥头顶 and 砖块
-create 砖碎动画 at 位置 from 砖块
-(更改砖碎动画的可变值)
典型代码二:
可变值D of 喷火器>0
-Launch火球 toward 方向 at speed 75
-火球:Move behind object 喷火器
-喷火器:Subtract 1 from 可变值D
出现问题:多个喷火器在同一瞬间喷火,只有一个刚喷出的火会被喷火器盖住
解决方法二:这个事件的条件没有等价的触发型条件与之对应,这时可以考虑把创建物品和对创建物品的操作分开执行。
修改后的代码二:
1、可变值D of 喷火器>0
-Launch 火球 toward 方向 at speed 75
-喷火器:Subtract 1 from 可变值D
2、火球:internal flag 0 is off
-火球:Move behind object 喷火器
-火球:set internal flag 0 on
记住:同一条代码一次执行是可以同时操作多个同种物体的,只有"同一条代码中创建物品-操作刚创建的物品"这种情况是特例
2013年12月22日 10点12分 4
level 7
lyh娘 楼主
问题3:关于"× 物品一 is overlapping a backdrop/物品二"的常见问题
产生原因:我也不敢断言是不是编辑器的bug
典型代码一:
× 砖块 is overlapping 实心块
-Create实心块 at 0,0 from 砖块
出现问题:砖块全部消失后物品数疯涨(不停执行这个create语句)
解决方法1:
Number of 砖块>0
× 砖块 is overlapping 实心块
-Create 实心块 at 0,0 from 砖块
典型代码2:
× 马里奥脚底 is overlapping a backdrop
× 马里奥脚底 is overlapping砖块
(其他条件)
-(马里奥跳跃掉落的相关代码)
出现问题:砖块全部消失后马里奥跳跃出问题(这次相关代码是不工作了)
解决方法2:这种时候只能确保砖块的数目不为零了,在场外接触不到的地方放一个吧
2013年12月22日 10点12分 5
level 7
lyh娘 楼主
问题4是关于组的 也是编辑器bug 而且很严重 但是具体内容我完全忘了 等我想起来再补充
2013年12月22日 10点12分 6
level 11
很好,顶先
2013年12月22日 11点12分 7
我只想问:看着晕不晕……我已经尽最大努力组织语言了
2013年12月22日 11点12分
level 11
基本上有些看懂了。想问一下那个player 4 moved down与keyboard press "Down Arrow"有什么区别?
2013年12月23日 07点12分 8
这个区别很明显 “玩家4向下移动” 玩家的操作按键是可以改的 玩家4的下键不一定是键盘上哪个按键 而后者“按下Down健”就是指定了键盘上的Dowm键,不管哪个玩家的键位设置怎样
2013年12月23日 09点12分
↑错别字好多[狂汗]
2013年12月23日 09点12分
level 7
lyh娘 楼主
其实我有个地方说错了
根据MMF2的帮助文件,我提到的两种条件的标准叫法应该是“立即条件(Immediate Condition)”和“普通条件(Normal Condition)”……[狂汗][狂汗][狂汗][喷]
不过我觉得我用的“触发型条件”和“非触发型条件”的说法也比较恰当,从字面上就能理解执行方法。。。
2013年12月23日 09点12分 9
1