首页 > 代码库 > 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);


好了,这一讲的内容就到这了,接下来两天公司出游,所以明天就不会更新学习笔记了,下周见~