在Nape中增加一个回调大致分为三步
1:定义一些标签,并根据需求为不同的Interactor打上不同的标签
2:定义一个监听器,这个监听器定义了哪些标签触发了哪种行为之后做何种回调
3:为Space注册对应的监听
Nape定义的四种Listener
一、BodyListener:针对单个刚体状态的监听器
new(event:CbEvent, options:Null<Dynamic>, handler:BodyCallback -> Void, precedence:Int = 0)
某物(options)在某时(event)干什么(handler);
这里的event只接受两种类型(如果用的是dev版本,传入非法event会有人性化的报错)
- CbEvent.SLEEP 目标休眠
- CbEvent.WAKE 目标激活
回调(handler)接受一个BodyCallback类型的参数,返回Void
二、ConstraintListener:针对Nape里面物理约束的状态监听,先略过
new(event:CbEvent, options:Null<Dynamic>, handler:ConstraintCallback -> Void, precedence:Int = 0)
- CbEvent.SLEEP
- CbEvent.WAKE
- CbEvent.BREAK
三、InteractionListener:交互监听,可以用来监听两两刚体的交互状态
new(event:CbEvent, interactionType:InteractionType, options1:Null<Dynamic>, options2:Null<Dynamic>, handler:InteractionCallback -> Void, precedence:Int = 0)
物体1(options1)和物体2(options2)在某时(event)发生某种交互(interactionType)时做什么(handler)
event
- CbEvent.BEGIN 交互开始
- CbEvent.ONGOING 紧接在Begin之后,表示正处于交互中
- CbEvent.END交互结束时
interactionType
-
Nape提供了3中不同的碰撞类型,分别用InteractionType类的常量:COLLISION,FLUID和SENSOR表示(也是InteractionListener构造函数的第2个参数),具体的用法分别说明如下:
- InteractionType.COLLISION:普通刚体之间的碰撞
- InteractionType.FLUID:刚体与浮力刚体的碰撞
- InteractionType.SENSOR:刚体与sensor刚体的碰撞
Nape中每个事件侦听器只能设置一种碰撞类型,作为第2个参数(InteractionType),如果需要对所有的碰撞类型侦听,又觉得创建3个侦听器太麻烦,也可以用InteractionType.ANY表示。
回调(handler)接受一个InteractionCallback类型的参数,返回Void
四、PreListeners这是一种特殊的InteractionListener
new(interactionType:InteractionType, options1:Null<Dynamic>, options2:Null<Dynamic>, handler:PreCallback -> Null<PreFlag>, precedence:Int = 0, pure:Bool = false)
这个监听没有event这个参数,因此默认在注册此监听的情况下,它会在交互的任何时间阶段都触发(具体来说就是nape在检测到两个物体交互发生时但还没做进一步的物理演算时会触发的. 在交互过程中每次触发step函数都会执行这个handler)根据需要在两物体发生交互前改变一些状态(比如之前定义两个物体能发生交互,可以在这个监听里面让他们不交互),之后才触InteractionListener的回调。除了handler之外其他参数和Interlistener功能都类似,老规矩handler接受的参数是PreCallback,但是它的回调除了是Void之外还可以是PreFlag类型,
Nape定义了四个不同的PreFlag常数
PreFlag.ACCEPT
如果返回此Flag,说明交互在这一步和接下来的所有((触发CbEvent.End之前))step函数执行中都是允许交互的.并且这个回调(handler)将在CbEvent.End前只触发这一次.
PreFlag.IGNORE
如果返回此Flag,说明交互在这一步和接下来的所有((触发CbEvent.End之前))step函数执行中都是忽略交互的.并且这个回调(handler)将在CbEvent.End前只触发这一次.
PreFlag.ACCEPT_ONCE
如果返回此Flag,说明交互只在这一步step函数执行中是允许交互的.这个回调在CbEvent.End前的每一次step都会继续执行用来判断Preflag的值
PreFlag.IGNORE_ONCE
如果返回此Flag,说明交互只在这一步step函数执行中是忽略交互的.这个回调在CbEvent.End前的每一次step都会继续执行用来判断Preflag的值
pure参数的作用:
当Body在一定时间内没有速度变化时,它的状态会自动由awake状态变成sleep状态时,即使在两个物体发生交互时也会触发状态变化,当Body状态变成Sleep后任何注册的监听都不会被触发.
PreListener的最后一个参数pure如果是false可以让两个物体不进入休眠状态,这样就能一直得到回调了. 当然这个参数在PreFlag是Accept或者Ignore时是没有多少意义的,因为这两个flag会导致这个handler只触发一次.