首页 > 代码库 > Cocos2d-x学习笔记(五)CCLayer分析及输入事件处理(触摸、重力传感器、按键)
Cocos2d-x学习笔记(五)CCLayer分析及输入事件处理(触摸、重力传感器、按键)
原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38733415
简介
上一讲我们简单的介绍了CCScene,这一讲我们继续来看另一个核心组件CCLayer,他和CCScene有些类似,都是用来收纳其他节点,但是按照层次来说的话,CCLayer应该包含在CCScene之中。老规矩,我们从代码看起。
源码分析
class CC_DLL CCLayer : public CCNode, public CCTouchDelegate, public CCAccelerometerDelegate, public CCKeypadDelegate { public: CCLayer(); virtual ~CCLayer(); virtual bool init(); static CCLayer *create(void); virtual void onEnter(); virtual void onExit(); // 调用onEnter方法后调用此方法 virtual void onEnterTransitionDidFinish(); // 单点触摸事件响应函数,分别是按下、移动、抬起、取消(比如突然来电话了) virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); // 多点触摸事件响应函数 virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); // 重力传感器响应函数 virtual void didAccelerate(CCAcceleration* pAccelerationValue); // 注册/取消注册重力传感器脚本处理 void registerScriptAccelerateHandler(int nHandler); void unregisterScriptAccelerateHandler(void); // 注册触摸事件分发 virtual void registerWithTouchDispatcher(void); // 注册/取消注册触摸脚本处理 virtual void registerScriptTouchHandler(int nHandler, bool bIsMultiTouches = false, int nPriority = INT_MIN, bool bSwallowsTouches = false); virtual void unregisterScriptTouchHandler(void); // 获取/设置触摸事件监听是否可用 virtual bool isTouchEnabled(); virtual void setTouchEnabled(bool value); // 设置/获取触摸模式 virtual void setTouchMode(ccTouchesMode mode); virtual int getTouchMode(); // 设置/获取触摸时间优先级,默认为0 virtual void setTouchPriority(int priority); virtual int getTouchPriority(); // 获取/设置重力传感器事件监听是否可用 virtual bool isAccelerometerEnabled(); virtual void setAccelerometerEnabled(bool value); // 设置加速器灵敏度 virtual void setAccelerometerInterval(double interval); // 获取/设置键盘事件监听是否可用 virtual bool isKeypadEnabled(); virtual void setKeypadEnabled(bool value); // 注册/取消注册键盘脚本处理 void registerScriptKeypadHandler(int nHandler); void unregisterScriptKeypadHandler(void); // 点击返回按钮响应函数 virtual void keyBackClicked(void); // 点击菜单按钮响应函数 virtual void keyMenuClicked(void); // 获取脚本处理实体 inline CCTouchScriptHandlerEntry* getScriptTouchHandlerEntry() { return m_pScriptTouchHandlerEntry; }; inline CCScriptHandlerEntry* getScriptKeypadHandlerEntry() { return m_pScriptKeypadHandlerEntry; }; inline CCScriptHandlerEntry* getScriptAccelerateHandlerEntry() { return m_pScriptAccelerateHandlerEntry; }; protected: bool m_bTouchEnabled; bool m_bAccelerometerEnabled; bool m_bKeypadEnabled; private: CCTouchScriptHandlerEntry* m_pScriptTouchHandlerEntry; CCScriptHandlerEntry* m_pScriptKeypadHandlerEntry; CCScriptHandlerEntry* m_pScriptAccelerateHandlerEntry; int m_nTouchPriority; ccTouchesMode m_eTouchMode; int excuteScriptTouchHandler(int nEventType, CCTouch *pTouch); int excuteScriptTouchHandler(int nEventType, CCSet *pTouches); };
从CCLayer的源码可以看出,CCLayer其实就是图层的概念,本身几乎没有什么功能,对比CCNode,CCLayer可用于接收触摸、加速计和按键输入。其实Cocos2dx对图层要求没有那么严格,如果你的图层不需要接收触摸、加速计和按键输入,完全可以使用CCNode,这样还可以节省因为接收输入造成的不必要开销。
处理用户触摸
// 1)在图层init阶段将属性设置为可触摸 setTouchEnabled(true); //2)重载virtual void registerWithTouchDispatcher(void); void CCLayer::registerWithTouchDispatcher() { CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0,true); } //3)重载触摸响应函数 virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); //4)通过pTouch得到用户的触摸点 CCPoint point = pTouch->getLocation(); //5)处理多点触摸仅是重载的函数不同
重力传感器交互
// 1)在图层init阶段将属性设置为开 setAccelerometerEnabled(true); //2)重载virtual void didAccelerate(CCAcceleration* pAccelerationValue); //3)通过pAccelerationValue得到重力传感器的数值 pAccelerationValue.x; pAccelerationValue.y; pAccelerationValue.z;
按键交互
// 1)在图层init阶段将属性设置为开 setKeypadEnabled(true); //2)重载按键响应函数 virtual void keyBackClicked(void); virtual void keyMenuClicked(void);
CCLayerColor
有时候,我们想给整个图层设置一种背景颜色,那么就需要用到CCLayerColor了,CCLayerColor是CCLayer的子类。
ccColor4B color = ccc4(255, 0, 0, 255); CCLayerColor *layerColor = CCLayerColor::create(color); addChild(layerColor);
CCLayerGradient是CCLayerColor的子类,用于设置渐变色图层。创建方法和CCLayerColor创建相似。
ccColor4B red = ccc4(255, 0, 0, 255); ccColor4B blue = ccc4(0, 0, 255, 255); CCLayerColor *layerColor = CCLayerColor::create(red, blue); addChild(layerColor);
好了,这一讲的内容就到这了,接下来两天公司出游,所以明天就不会更新学习笔记了,下周见~
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。