[RealSense]4适用于Cocos2dx引擎的监听系统

如果对Cocos2dx引擎没有兴趣的话完全可以跳过这部分。不过这也是文章的最后一个部分了。

Cocos2dx的事件监听就不介绍了。事件系统在很多地方都有涉及,为了更方便的把SDK用在游戏之中,我又专门封装了一层。


事件监听器EventListenerCam

EventListenerCam是事件监听的基本单元,它有三个基本属性:布尔值m_bisEnable,这个监听器是否生效,可以理解为事件的开关,为false时监听器不会监听任何事件;浮点数m_fPriority代表优先级,优先级越高的世界越先被触发;布尔值m_bSwallow代表这个监听器的吞没属性,因为监听器具有优先级,如果高优先级的监听器具有吞没的属性,那么比这个监听器优先级低的监听器将不会被触发。每个监听器包含六个可调用对象std::function,他们分别是onHandMove,onFistBegan,onFistEnde,onControlLost,thumbAction,onSwiftShift。

std::function类似于函数指针,是C++标准库是对C++中现有的可调用实体的一种类型安全的包裹。这六个对象分别对应手掌移动、握拳动作开始,握拳动作结束、手离开控制、拇指弯曲手势、手掌滑动的动作,对应动作被识别到后,相应的事件就会触发,然后就会调用对应的可调用对象,从而执行指定的代码段完成特定的功能。


事件监听组件RSListenerComponent

RSListenerComponent继承自Node,本身不包含功能,仅作为EventListenerCam的容器使用,负责管理其内部包含的EventListenerCam的生命周期。一般在使用时直接把RSListenerComponent添加到需要监听输入事件的节点之上,然后设置EventListenerCam的可调用对象,将它们指向你想要调用的函数,并调用addListener()函数来注册监听器。

事件中心RealSenseEventCenter

RealSenseEventCenter负责管理所有的事件监听器。RealSenseEventCenter同样也是个单例类,但是它被封装到了RSListenerComponent内部,因为在实际使用过程中,我并不希望有人直接去使用这个类。这个类包含了一个列表listenerList,里面包括了所有的EventListenerCam的实体,并且包含了六个函数,这六个函数对应了前面提到的六种动作。

事件从产生到驱动目标函数的流程如图所示。对摄像头的输入处理与手势识别不在游戏主线程,出于安全的角度考虑,不能直接在识别到手势之后就在输入处理线程内驱动事件,所以在RealSenseCam中还有一个用于读取事件状态并驱动事件的函数update()。Update使用Cocos2d-x中的定时器系统,没一帧都会被调用一次。每个手势都对应一个或者多个布尔值变量,用于表示这个手势是否被识别到了,在手势识别的线程中,当手势被识别到时,就会把对应的布尔值设置为true,在update中查询这些值,如果为true就执行RealSenseEventCenter中对应的函数,并将值重新置为false。

以握拳事件为例,当握拳的手势开始被识别到时,握拳事件对应的布尔值m_bIsFistBegan被置为true,在update中,RealSenseEventCenter的fistBegan函数被调用。在RealSenseEventCenter的fistBegan中,按照优先级从高到低的顺序遍历所有的EventListenerCam,如果监听器是开启的且onFistBegan为true,则会调用监听器的onFistBegan()函数。如果这个监听器具有吞没的属性,且它对应的函数被调用了,那么接下来的监听器将不起作用。

小结与示例

这部分的代码比较简单,只有不到200行所以也不介绍。 
在RealSenseTest中有关于这部分的使用实例,如果需要使用可以参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值