Andengine 学习笔记- 事件的传递

在Andengine的API中,Andengine负责捕获触摸事件,如果我们需要监听触摸事件,则需要向Scene注册。


mScene.registerTouchArea(touchArea);


通过查阅IToucheArea的源码发现

@Override
public boolean contains(float pX, float pY) {
return true;
}

@Override
public float[] convertSceneToLocalCoordinates(float pX, float pY) {
return new float[] { pX, pY };
}

@Override
public float[] convertLocalToSceneCoordinates(float pX, float pY) {
return new float[] { pX, pY };
}

@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
return false;
}


一个区域里有自己的判断当前触摸的坐标是不是属于自己感兴趣的,如果不是则直接抛弃。

因为Shape类是实现了ITouchArea接口的,所以我们的Sprite等精灵类都可以直接被注册。

在Scene的源码里可以找到相关的代码,于是我们了解了,在Andengine中,监听触摸和ENtity并不是同一个概念,两者是独立的,于是这也解释了,为什么在Scene中detach了一个Entity,在其注册过监听的地方触摸还是会触发和以前一样的效果。

再来关注事件的传递,在源码中我们发现由于事件需要Area本身来判断其是否属于Area,所以在注册的时候并不存在类似Android中的父子关系,传递是根据注册的顺序一个一个进行的,但是相同的是如果一个Area宣布自己处理了时间(返回了true),传递序列就会直接终止,这里和Android中的事件是一样的。

但是这样固定的顺序会有一些问题,其实设计者已经考虑到了这个问题,于是我们在源码中发现了一个标志量:mOnAreaTouchTraversalBackToFront。 这个标志会决定当前事件的传递是正序还是逆序,这样就在一定程度上解决了我们的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值