Nape的回调系统 nape.callbacks
在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只触发一次.
Nape的回调系统 nape.callbacks的更多相关文章
- jQuery 2.0.3 源码分析 回调对象 - Callbacks
源码API:http://api.jquery.com/jQuery.Callbacks/ jQuery.Callbacks()是在版本1.7中新加入的.它是一个多用途的回调函数列表对象,提供了一种强 ...
- Nape "不动"刚体的碰撞交互
"不动"刚体,这里指的是以下两类刚体: 1.刚体的allowMovement和allowRotation都设false的刚体 2.KINEMATIC类型的刚体 如下代码,测试发现输 ...
- Nape 获取碰撞点加特效
package { import nape.phys.Body; import nape.shape.Shape; import nape.shape.Circle; import flash.dis ...
- Nape实现坐标旋转角度回弹
乒乓球以一个向量运动,碰到障碍后反弹以一个新的向量运动,如下图: 要实现回弹只需要求出向量v1,把向量v0取反,再旋转(a+b)度就可以得到向量v1. 向量取反: var v:vec2 = new V ...
- jQuery回调、递延对象总结(上篇)—— jQuery.Callbacks
前言: 作为参数传递给另一个函数执行的函数我们称为回调函数,那么该回调又是否是异步的呢,何谓异步,如:作为事件处理器,或作为参数传递给 (setTimeout,setInterval)这样的异步函数, ...
- jQuery回调、递延对象总结(一)jQuery.Callbacks详解
前言: 作为参数传递给另一个函数执行的函数我们称为回调函数,那么该回调又是否是异步的呢,何谓异步,如:作为事件处理器,或作为参数传递给 (setTimeout,setInterval)这样的异步函数, ...
- jquery源码分析(四)——回调对象 Callbacks
借用百度百科来说明下回调函数: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...
- jQuery 源码解析(八) 异步队列模块 Callbacks 回调函数详解
异步队列用于实现异步任务和回调函数的解耦,为ajax模块.队列模块.ready事件提供基础功能,包含三个部分:Query.Callbacks(flags).jQuery.Deferred(funct) ...
- CNN基础四:监测并控制训练过程的法宝——Keras回调函数和TensorBoard
训练模型时,很多事情一开始都无法预测.比如之前我们为了找出迭代多少轮才能得到最佳验证损失,可能会先迭代100次,迭代完成后画出运行结果,发现在中间就开始过拟合了,于是又重新开始训练. 类似的情况很多, ...
随机推荐
- 【HDOJ】1648 Keywords
PE的注意,如果没有满足条件的不输出空格.简单模拟,暴力解. /* */ #include <iostream> #include <sstream> #include < ...
- JVM内存回收机制
1. JVM内存回收机制简述 http://www.cnblogs.com/lzrabbit/p/3826738.html
- Java面试题-线程安全
1. 什么叫线程安全?servlet是线程安全吗? 答:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他 ...
- [Mac][$PATH]如何修改$PATH变量
从 stackoverflow 找到的方法 http://stackoverflow.com/questions/7703041/editing-path-variable-on-mac 首先打开终端 ...
- service name和SID的区别
数据库名(DB_NAME).实例名(Instance_name).以及操作系统环境变量(ORACLE_SID) 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instan ...
- DB2创建序列
一.创建序列 序列是按照一定的规则生产的数值,序列的作用非常的大,比如银行交易中的流水号,就是记录每笔交易的关键字段. 通过create sequence语句创建序列,具体语法如下: >> ...
- 【转】C/C++中可变参数函数的实现
转自:http://www.cnblogs.com/cylee025/archive/2011/05/23/2054792.html 在C语言的stdarg.h头文件中提供了三个函数va_start, ...
- javascript 的 split用法
var array = "200,400,300".split(","); var nums = [ ]; for (var i=0 ; i< array ...
- 018如何建立自动化框架 how to bulid the framwork
本讲包括: 一. objective 二. How to bulid 三. Keyview of frawork (关键视图) 四. conclusion automation framwork:自动 ...
- unity3d实现序列帧动画
首先准备一个序列帧图片如下的AngryBird: 场景中随便创建一个物体,这里以Cube为例 将图片拖放到Cube上,这样会在Cube的6各面都有3个bird,为了美观显示一个鸟,我们调整材质的Til ...