cocos2d-x的内部运行机制:由事件驱动的处理机制,所谓事件驱动,就是指只有当事件发生了,才会执行的对应的操作;例如,屏幕上有一个按钮,只有当玩家点击按钮时,才会调用对应的函数,否则,该处理机制的响应函数只处于等待调用的状态.在cocos2d-x当中,用户操作经过接收数据
,分发事件
和处理响应
3个步骤.
1.数据接收(Touch
)
cocos2d-x所接收的数据都要作为统一的数据格式备操作和传递,cocos2d-x中的触摸类Touch
就用来专门存储用户操作.每个Touch
类的对象都包含了一个用户操作数据信息,保存了id
标示,x
坐标和y
坐标.
重点代码如下:
//返回当前在openGL触摸位置坐标
Vec2 getLocation() const;
//返回之前在openGL触摸位置坐标
Vec2 getPreviousLocation() const;
//返回在openGL开始触摸位置坐标
Vec2 getStartLocation() const;
//返回当前触摸在屏幕坐标位置
Vec2 getLocationInView() const;
//返回之前触摸在屏幕坐标位置
Vec2 getPreviousLocationInView() const;
//返回开始触摸在屏幕坐标位置
Vec2 getStartLocationInView() const;
//设置用户操作数据(id标示,x坐标,y坐标)
void setTouchInfo(int id, float x, float y)
{
_id = id;
_prevPoint = _point;
_point.x = x;
_point.y = y;
_curForce = 0.0f;
_maxForce = 0.0f;
if (!_startPointCaptured)
{
_startPoint = _point;
_startPointCaptured = true;
_prevPoint = _point;
}
}
2.分发事件(EventDispatcher
)
来自设备平台的的信息数据经过转化成为了Touch
对象,cocos2d获得有效的用户操作数据之后,进入到分发事件步骤.EventDispatcher
类表示一个事件分发器,作用是管理事件监听器以及事件分发,当一个事件触发时,它会向所有需要响应的对象发送用户操作信息.
常用函数如下:
//添加场景优先事件监听器,第一个参数是事件监听器对象,第二个参数是监听的节点对象
void addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node);
//添加固定优先值的事件监听器
void addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority);
//删除一个指定的事件监听器
void removeEventListener(EventListener* listener);
//删除某一类事件监听器
void removeEventListenersForType(EventListener::Type listenerType);
//删除所有监听器
void removeAllEventListeners();
//设置指定的事件监听器的优先级值
void setPriority(EventListener* listener, int fixedPriority);
//设置事件分发器是否可用
void setEnabled(bool isEnabled);
//检查是否启用了事件分发器
bool isEnabled() const;
3.处理响应(EventListener
)
在明白分发信息机制后,我们肯定会想这些用户信息要分发到哪里去呢,分发器是怎么知道谁是需要响应的对象呢?接下来就来了解一下监听器类EventListener
,从这个类的名字就可以看出,它就是一个需要接收用户操作信息的事件监听对象.那么事件分发器是如何将用户的操作信息分发到具体的监听器类的呢?咱们现在载回过头来看一下事件分发器的函数void addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)
第一个参数就是EventListener
的一个实例对象,开发者通过调用事件分发器EventDispatcher
的这个函数将监听的器添加到事件分发器的集合列表中,而第二个参数Node
就是具体的监听对象了.
需要注意的是:所有需要用户操作的监听对象必须在被添加到分发器结合列表之后,才可以接收到响应事件,简单点说就是必须通过函数addEventListenerWithSceneGraphPriority
把监听事件添加到事件分发器的队列中才可以.
EventListener
类是事件监听器的基类,主要使用的是他的6个子类
//单点触摸事件监听器
EventListenerTouchOneByOne
//多点触摸监听器
EventListenerTouchAllAtOnce
//加速度级事件监听器
EventListenerAcceleration
//按键事件监听器
EventListenerKeyboard
//鼠标事件监听器
EventListenerMouse
//自定义事件监听器
EventListenerCustom
接下来的文章将会着重介绍一下加速度计监听事件和触摸监听事件.