|
|

楼主 |
发表于 2020-11-20 19:22:11
|
显示全部楼层
基础理论
- 所有的普通事件都是从上到下执行的
- 每一帧呈现的画面都是所有事件全部执行之后的结果
一、静态碰撞检测
我们来看下面这段事件:
* 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 红乌龟转向

二、动态碰撞检测
对于非自带 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 水平碰撞事件

Ultra Engine 在编写过程中我其实并没有意识到这一点,而这一点在 Ultra Edition Legacy 的体现非常之多
但 UEL 的底层过于抽象,阅读难度较大,而且碰撞检测事件全部集中于底层,不是很建议研究,UE 在这方面更容易参考一些。 |
|