ƒresh★LAKE
发表于 2020-11-2 12:06:31
怎么在得到一个甜菜时,销毁一个开关砖及其实心(目前为止destroy只能销毁贴图,不能销毁obj背景)
dasasdhba
发表于 2020-11-6 18:32:26
wyf01234567 发表于 2020-11-2 12:06
怎么在得到一个甜菜时,销毁一个开关砖及其实心(目前为止destroy只能销毁贴图,不能销毁obj背景) ...
最新版 RE 的 Bonus 组普遍采用的 Add backdrop as obstacle 方法添加实心,对于这类实心你应该这样销毁:
https://s1.ax1x.com/2020/11/06/BhQGTA.png
(图片来自 RE砖块 的行为)
数字1528君
发表于 2020-11-6 19:20:18
雨树·电童 发表于 2020-10-28 16:09
如何利用两个obj即可确定一个滚屏范围(非强制,一般滚屏)
估计他想问那种MW的那种滚屏限制(
ƒresh★LAKE
发表于 2020-11-7 10:44:57
wyf01234567 发表于 2020-10-30 17:01
怎么记录命数(将会改成死亡数)
我说的是存档啊啊啊啊啊啊
ƒresh★LAKE
发表于 2020-11-7 10:55:07
怎么记录命数(将会改成死亡数)(指存档)
ƒresh★LAKE
发表于 2020-11-7 14:29:30
dasasdhba 发表于 2020-11-6 18:32
最新版 RE 的 Bonus 组普遍采用的 Add backdrop as obstacle 方法添加实心,对于这类实心你应该这样销毁 ...
写了这个,没用,可能是另外添加了实心
zyc233
发表于 2020-11-7 20:44:54
本帖最后由 zyc233 于 2020-11-8 10:41 编辑
可否修复跳乌龟卡墙升天的bug
如何制作MFIT8-3的闪电云
如何做出雪地滑溜溜的手感(MFIT w4式)
数字1528君
发表于 2020-11-14 08:45:58
如何做出AUE 3-G如下图的效果?
dasasdhba
发表于 2020-11-14 17:16:35
wyf01234567 发表于 2020-11-7 10:55
怎么记录命数(将会改成死亡数)(指存档)
存档请参考 Week 3 P2,原理大致相同
无视我233
发表于 2020-11-14 19:54:16
问一下,很多作品存在跳乌龟无故转向的问题,和跳乌龟穿墙的原理是否一致,如果不一致有没有比较好的修复方法0.0
ƒresh★LAKE
发表于 2020-11-15 16:40:28
本帖最后由 wyf01234567 于 2020-11-15 21:58 编辑
怎么能够在3个事件中抽一个来运行(条件相同)比如一个炮弹生成器,3种炮弹每次生成抽两个发射
囿里有条小咸鱼
发表于 2020-11-15 22:50:41
麻烦lz一下,可否在下周视频中具体说明一下无彩条判定的作用机理里,以及如何准确、安全、高效地使用无彩条判定(举一个实例即可)
无视我233
发表于 2020-11-16 21:00:25
很多作品有的时候过关爆杆时固定只有200分,请教这是什么原因造成的(
dasasdhba
发表于 2020-11-17 23:01:42
无视我233 发表于 2020-11-14 19:54
问一下,很多作品存在跳乌龟无故转向的问题,和跳乌龟穿墙的原理是否一致,如果不一致有没有比较好的修复方 ...
基本一致,因为……
https://s3.ax1x.com/2020/11/17/Dek7bq.png
这个热点本来应该在正下方的,不知道为什么默认在这个位置
当向下防卡墙执行结束之后,切到这一帧,就会导致转向误判
所以跳乌龟最初是谁搞的(
dasasdhba
发表于 2020-11-17 23:10:06
无视我233 发表于 2020-11-16 21:00
很多作品有的时候过关爆杆时固定只有200分,请教这是什么原因造成的(
这个问题是一个不良习惯导致的((
https://s3.ax1x.com/2020/11/17/DeAOeI.png
通关器本身的显示是通过 Add backdrop 实现的
销毁之后表面上并不能看出来,但会导致判定条件失效:
https://s3.ax1x.com/2020/11/17/DeEPyj.png
所以你们要养成好习惯啊!!!
dasasdhba
发表于 2020-11-20 18:33:40
本帖最后由 dasasdhba 于 2021-7-21 23:00 编辑
wyf01234567 发表于 2020-11-15 16:40
怎么能够在3个事件中抽一个来运行(条件相同)比如一个炮弹生成器,3种炮弹每次生成抽两个发射 ...
用一个变量作为判定条件
利用 Random() 即可
Random(n) 会在当前帧内“随机”返回一个范围在[0,n)的整数
你也可以用 RRandom(a,b),返回值是范围在的整数,事实上就等同于 a+Random(b-a+1)
dasasdhba
发表于 2020-11-20 19:22:11
雨树·电童 发表于 2020-11-15 22:50
麻烦lz一下,可否在下周视频中具体说明一下无彩条判定的作用机理里,以及如何准确、安全、高效地使用无彩条 ...
基础理论
[*]所有的普通事件都是从上到下执行的
[*]每一帧呈现的画面都是所有事件全部执行之后的结果
一、静态碰撞检测
我们来看下面这段事件:
* Always
Active : Set Y position to Y( "Active" ) + 1
* Always
Active : Set Y position to Y( "Active" ) - 1
效果的是 Acitve 看上去没有任何运动
即便如此,我们可以在这两个“运动”事件之间穿插碰撞检测,从而检测物件本不该接触到的对象
这有点类似于 Gamemaker 中的 instance_place(x,y,obj),该函数会返回使用这个函数的 instance 在 (x,y) 处与接触到的 obj id
因此,利用这一点,我们就可以实现不依赖彩条检测其是否在地面上,是否靠墙,是否达到悬崖等等
典例:Rainbow Engine 红乌龟转向
https://s3.ax1x.com/2020/11/20/DQ7usf.png
二、动态碰撞检测
对于非自带 Movement,即事件直接作用于物件坐标的情况
在发生碰撞之后往往需要我们自己去实现坐标补正,防止物件卡在墙里面
而这个过程并不需要彩条来检测,也不需要用到静态检测的手段,因为我们可以拿到 速度的方向
我们做一个简单的分析:
假设我们现在编写了一个运动事件,我们把它记作 move()
这个运动事件里面没有任何碰撞事件,我们在其后编写碰撞事件,记作 collide()
不管这个 move() 有多么复杂,它执行结束之后我们总能想办法获得这个运动最后的方向
那么在 collide() 中,我们只需要根据这个方向,调用 loop 事件反方向进行补正即可
最后的事件结构就是:
* Always
Active : move()
* Always
Active : collide()
由于 2D 平台跳跃游戏中往往分水平和竖直两个方向,我们将这两个方向独立开来即可,即:
* Always
Active : moveX()
* Always
Active : collideX()
* Always
Active : moveY()
* Always
Active : collideY()
事实上就是一种运动的正交分解,互不影响
典例:Super Mario Ultra Engine Group.1 水平碰撞事件
https://s3.ax1x.com/2020/11/20/DQqKL6.png
Ultra Engine 在编写过程中我其实并没有意识到这一点,而这一点在 Ultra Edition Legacy 的体现非常之多
但 UEL 的底层过于抽象,阅读难度较大,而且碰撞检测事件全部集中于底层,不是很建议研究,UE 在这方面更容易参考一些。
ƒresh★LAKE
发表于 2020-11-20 21:54:49
本帖最后由 wyf01234567 于 2020-11-20 22:05 编辑
为什么有的时候一个物件的属性显示的XY值跟点这个物件时下面XY值不一样呢
dasasdhba
发表于 2020-11-20 22:32:29
wyf01234567 发表于 2020-11-20 21:54
为什么有的时候一个物件的属性显示的XY值跟点这个物件时下面XY值不一样呢
能不能少问点这种**问题。。。
我说过我不会详细解答非常基础的问题
https://s3.ax1x.com/2020/11/20/DlKT4U.png
数字1528君
发表于 2020-11-20 22:52:18
如何使用UEL引擎制作马里奥的二段跳?
数字1528君
发表于 2020-11-21 10:45:02
如何解决CTF有时输入变量/表达式玄学抽风的问题?甚至已有的变量/表达式都报错((
囿里有条小咸鱼
发表于 2020-11-30 09:10:38
麻烦请教一下lz,可否在本周末的视频中讲解一下多obj的无bug绑定(包括如何让ctf对象筛选器选中我们所希望选中的对象,同时讲解一下如何正确使用foreach进行精确筛选,一个例子即可)
6463喝喝了
发表于 2020-12-5 17:48:05
本帖最后由 6463喝喝了 于 2020-12-6 15:25 编辑
问:如何做打一个完整的打雷事件(我自己琢磨出来了但是方法比较草)
dasasdhba
发表于 2020-12-5 18:09:45
6463喝喝了 发表于 2020-12-5 17:48
问:如何做打一个完整的打雷事件(?
Ultra Edition Legacy Mod 有,你可以先自行参考一下,看不懂再问吧(
6463喝喝了
发表于 2020-12-5 18:11:22
dasasdhba 发表于 2020-12-5 18:09
Ultra Edition Legacy Mod 有,你可以先自行参考一下,看不懂再问吧(
好
dasasdhba
发表于 2020-12-5 20:00:55
雨树·电童 发表于 2020-11-30 09:10
麻烦请教一下lz,可否在本周末的视频中讲解一下多obj的无bug绑定(包括如何让ctf对象筛选器选中我们所希望 ...
我思索良久,感觉这个问题不太适合以视频的方式呈现
我还是以文字的形式呈献给大家。
一、名词介绍
CTF 这个软件体验最差的地方就在实例的选择上,Foreach 是解决这个问题的一个“妥协”手段
由于这个问题叙述起来不太方便,我先引入几个名词概念:
[*]实例:Frame 中存在的物件,每一个实例可以有不同的坐标,变量值等。
[*]对象:Frame 中某一类实例的集合,你可以定义其运动,变量的名称和初始值,以及编写行为事件。
[*]分组:Frame 中某一类对象的集合,大部分情况下与对象无异,而实践表明,在一些选择事件中分组要明显“弱于”对象。
可以看到,Frame 中一个对象可以有多个实例,一个分组也可以有多个对象。
分清这几个名词概念之后,我们再来谈谈对象选择的问题。
二、实例选择的本质
何为实例选择?
由于我们编写事件的最小单位是“对象”,因此我们很多时候都要考虑实例的“选择”问题,我们举一个简单的例子:
* X position of 锤子龟 > X( "马里奥位置" )
锤子龟 : Set direction to "Left"
* X position of 锤子龟 < X( "马里奥位置" )
锤子龟 : Set direction to "Right"
以上事件是“锤子龟”对象的行为事件。
一个事件由条件和动作构成,当条件满足,相应的动作就会被执行。
于是问题来了,这些事件是“锤子龟”对象的行为事件,而不是“锤子龟”实例的行为事件,
默认情况下,“锤子龟”对象的行为事件会以一种非常“模糊”的方式作用于全体“锤子龟”实例。
而这段事件我们的本意应该是,满足了我们所编写的条件的实例,才执行我们指定的动作,这里就出现了实例的选择。
然而,实例选择存在着“黑箱”,没有经验的制作者可能完全不知道如何编写条件才能达到“选择”的目的。
这便是 CTF 最坑爹的地方,我们再举一个例子,我们将上述事件改为:
* X position of 马里奥位置 < X( "锤子龟" )
锤子龟 : Set direction to "Left"
* X position of 马里奥位置 > X( "锤子龟" )
锤子龟 : Set direction to "Right"
看起来我只是把不等式换了个方向写?
抱歉,这样写是不具有实例选择作用的,所以最后全体“锤子龟”实例一定会朝向同一个方向。
所以如何才能保证实例选择的结果是我们想要的?抱歉,没有定论。
于是 Foreach 出现了。
当你对一个对象发起 Foreach 动作之后,对全部拥有该 Foreach 条件的事件,将会逐个作用于该对象的全部实例。
于是实例选择的问题就解决了,因为只有一个了,没得选了。
真的解决了吗?
试想,如果一个对象拥有的实例过多,或者 Foreach 事件过于复杂,那将会导致非常严重的卡顿。
这就是为什么我们提倡在“万不得已”的情况下才使用 Foreach,况且这玩意还不稳定。
三、实例选择的经验理论
据此,我分享一些经长期实践总结得出的经验理论给大家,供大家参考。
[*]条件的发起对象有更强的选择作用
[*]表达式中的对象没有选择作用
以上两条经验解释了上面的例子中为什么第一种才是我们希望的结果。
进一步我们可以得出 "Compare two general values" 条件的任何一方都没有选择作用。
[*]在 A is Overlapping B 条件中,两个对象中的实例都会受到一定的选择
当 A B 都是 分组 时,本条经验规则不总是适用,请考虑 Foreach。
对于 A 对象而言,这一点没有什么补充内容;
对于 B 对象而言,如果你需要进一步进行选择,请务必使 B 对象发起的条件紧贴 Overlapping 条件之下。
例:
* Alterable Value A of Beet Mario < 3
+ Beet Mario is overlapping Group.Block
+ Group.Block: Flag 11 is off
+ Group.Block: Flag 9 is on
Group.Block : Set Flag 9 off
...
(取自 Ultra Engine Legacy)
这里选择了 "Group.Block"
[*]Collision between A and A 是唯一可以直接进行同类实例碰撞检测的手段
A is Overlapping A 不行。
这个方案往往还需要配合 Foreach 进行进一步的判断。
[*] Negate(反转)条件不具有选择作用
例:
* × Group.Gravity is overlapping Group.Water
Group.Gravity : ...
然后你会发现根本不是没有接触 Group.Water 的 Group.Gravity 实例执行了动作。
[*]Child Event 中,Break 一定会作用于全体实例
所以没事别用 Break,要用就加 Foreach。
[*]无选择作用的条件,不受对象所支配的实例存在与否的限制
这解释了为什么 x7 早期引擎的弹簧老是跳不起来,
即有多个弹簧对象同时在消耗“踩弹簧时间”。
[*]多个实例同时执行 Create 动作会使被 Create 实例的附加动作失效
这里解释一下,在编写动作的时候,如果你 Create 一个 A 实例,
那么紧跟这条动作之后的 A 对象发起的动作将会指向你刚刚创建的 A 实例。(这里也发生了选择作用)
这些动作我们称为被 Create 实例的附加动作。
而当多个实例同时执行 Create 动作时,就会出现问题,这个时候往往只能 Foreach。
或者采用一些极端手段,比如再用一个 Overlapping 条件来承载附加动作的执行。
以上都是经验理论,不一定正确,但可以参考。
四、实例绑定原理
如何将不同的实例进行一个绑定?
我们往往有三种方案:
[*] Spread 法:
当你对一个对象的某一个变量 A 执行 Spread 动作时,
这将会作用于全部属于该对象的实例,并且每一个实例得到的值都是不一样的。
这个值与你输入的初始参数,和实例编号(即这个实例是全体实例中的第几个)有关。
目前除 W10E 以外的所有水管链接均使用此种原理进行的绑定。
你只需要依照上面的经验理论,通过比较两个对象的变量 A 是否相等进而达到选择的目的。
(或者 Foreach 也行)
[*] Fixed 值法:
每一个实例都有独特的 Fixed 值。
假设你希望实例 A 创建一个实例 B,并将实例 B “绑定” 到实例 A,
你可以给实例 B 的某一个变量 K 赋值为实例 A 的 Fixed 值
那么你仍然可以按照上面的经验理论,通过比较实例 B 的变量 K 是否与实例 A 的 Fixed 值相等来达到选择的目的。
(或者 Foreach 还是行)
[*] Loop + Fixed 值法:
在发起 Loop/Foreach 动作时,你可以在循环名后加上 str$(fixed value),
进而达到一个更强力的选择效果。
事实上,我们只要牢记经验理论中的1 2两点,配合 Foreach 进一步强化选择,
“绑定”的效果还是勉强能达到的,但实践中仍然会碰到不少问题,需要我们多尝试,多总结。。。
(或者跟我一起骂辣鸡CTF(不是
绿色的糖果
发表于 2021-2-4 21:41:09
Q:如何制作文件所示的探照灯?
dasasdhba
发表于 2021-2-11 20:45:32
绿色的糖果 发表于 2021-2-4 21:41
Q:如何制作文件所示的探照灯?
抱歉我这段时间非常忙
不过能用正常点的方式描述问题吗(
囿里有条小咸鱼
发表于 2021-3-11 17:32:07
本帖最后由 电童·Isamo 于 2021-3-11 18:27 编辑
反复看了一下Week2的有关平台补正的视频。
但是听到“运动前检测”之后,我就开始想:如果把马里奥的所有事件挪到马里奥这个detector的行为里,那么又该如何决定“先检测再运动最后补正”,(前提是平台的运动和马里奥并不在同一个obj或behaviour里)
望lz能够解答,谢谢
dasasdhba
发表于 2021-3-16 23:43:22
电童·Isamo 发表于 2021-3-11 17:32
反复看了一下Week2的有关平台补正的视频。
但是听到“运动前检测”之后,我就开始想:如果把马里奥的所有事 ...
参考UEL即可