• [Cocos2d-x For WP8]Layer 层


        层(CCLayer) 从概念上说,层就是场景里的背景。 CCLayer同样是CCNode的子类,通常用addChild方法添加子节点。CCLayer对象定义了可描绘的区域,定义了描绘的规则。CCLayer可以实现半透明的效果,层的事件相应机制 : 最外层最先接受到事件(屏幕触碰),最后是底层,如果在某层处理了该事件,则后面的层不会在接受到事件信号。

        CCLayer类的作用主要有三个。

    (1)其他子节点的容器和组织者

    例如对一个层使用动作,那么所有在这个层上的物体都会受到影响。这意味着同一层的所有物体可以一起移动、旋转和缩放。如果这些物体都是同一个层的子节点,就可以通过改变层的属性或者在层上执行动作,从而影响层上所有子节点。

    (2)接收触摸事件

    设置isTouchEnabled为YES,可以让层接收触摸事件。一旦启用isTouchEnabled属性,将会开始调用许多与接收触摸输入相关的方法。这些事件包括:当新的触摸事件开始时,当手指在触摸屏上移动时,以及当用户手指离开屏幕以后。

    (3)接收加速计事件

    和触摸输入一样,加速计必须在启用以后才能接收加速计事件。

    头文件:

     #include <CCLayer.h>                       

    继承关系图:

          CCNode   CCTouchDelegate   CCAccelerometerDelegate   CCKeypadDelegate   CCObject   CCCopying   CCLayerColor   CCLayerMultiplex   CCMenu   CCLayerGradient                           

    1.CCLayerColor是一个透明的、可以按照RGB设置填充颜色的层,是实现CCRGBAProtocol协议的CCLayer子类。它继承了CCNode所有属性和方法,同时还可以接收触摸事件和加速计事件。

    2.CCLayerGradient渐变色层,CCLayerColor有一个子类CCLayerGradient,可以在背景上绘制渐变色。CCLayerGradient继承了CCLayerColor的所有特性,增加了渐变方向、插值模式等属性。以下代码初始化带有特定渐变效果的色彩层。

    3.CCMenu是表示菜单栏,用来创建游戏中的各种菜单,包括主菜单、游戏设置等,而实现菜单系统的就是CCMenu类及其子类。

    CCMenu继承自CCLayer,是一个菜单管理选择画面层,该画面以Menu对象为集合类,由MenuItem类实例组成各种按钮。CCMenu类提供的方法主要用来按横向、竖向或者多行列排序展示MenueItem的类实例。同时,CCMenu只支持CCMenuItem节点作为它的子节点。

    注意 CCMenuItem是基础类,不能直接用来创建菜单,它的作用主要是设置按钮状态以及处理回调方法。需要使用CCMenuItem的子类来创建定制菜单项。

    4.CCLayerMultipex,CCLayer的子类CCLayerMultipex,可以容纳多个层,但每次只可激活其中的一个。通常不鼓励使用CCLayerMultipex。

    下面代码示例CCLayerColor的使用:

    class LayerTest1 : public cocos2d::CCLayer
    {
    public:
        LayerTest1();
        ~LayerTest1();
        virtual void onEnter();
        void updateSize(cocos2d::CCPoint &touchLocation);
    
        virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
        virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
        virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
    };
    
    void LayerTest1::onEnter()
    {
        CCLayer::onEnter();
        setTouchEnabled(true);  
        CCSize s = CCDirector::sharedDirector()->getWinSize();
        //创建一个颜色的层,设置宽度和高度
        CCLayerColor* layer = CCLayerColor::create( ccc4(0xFF, 0x00, 0x00, 0x80), 200, 200); 
        //将忽略锚点置为false。由于默认设置是忽略锚点,也就是以左下角为锚点,可以让布景层考虑锚点的影响,这时默认的锚点在中心。
        layer->ignoreAnchorPointForPosition(false);
        layer->setPosition( ccp(s.width/2, s.height/2) );
        addChild(layer, 1, 1);
    }
    //根据触摸点修改颜色层的大小
    void LayerTest1::updateSize(CCPoint &touchLocation)
    {    
        CCSize s = CCDirector::sharedDirector()->getWinSize();
        CCSize newSize = CCSizeMake( fabs(touchLocation.x - s.width/2)*2, fabs(touchLocation.y - s.height/2)*2);
        CCLayerColor* l = (CCLayerColor*) getChildByTag(1);
        l->setContentSize( newSize );
    }
    
    void LayerTest1::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
    {
        ccTouchesMoved(pTouches, pEvent);
    }
    //触摸在屏幕移动的时候将修改颜色层的大小
    void LayerTest1::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
    {
        CCTouch *touch = (CCTouch*)pTouches->anyObject();
        CCPoint touchLocation = touch->getLocation();
    
        updateSize(touchLocation);
    }
    
    void LayerTest1::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
    {
        ccTouchesMoved(pTouches, pEvent);
    }
    CCScene* HelloWorld::scene()
    {
        CCScene * scene = NULL;
        do 
        {   // 'scene'是一个可以自动释放的对象
            scene = CCScene::create();
            //创建失败跳出循环
            CC_BREAK_IF(! scene);
            // 'layer'是一个可以自动释放的对象
            HelloWorld *layer = HelloWorld::create();
            //创建失败跳出循环
            CC_BREAK_IF(! layer);
            // 添加layer到scene上面
            scene->addChild(layer);
    
            LayerTest1 *layer2 = new LayerTest1();
            // 添加layer到scene上面
            scene->addChild(layer2);
        } while (0);
    
        // 返回scene
        return scene;
    }

    运行的效果如下:

  • 相关阅读:
    Linux性能优化之CPU优化(一)
    MongoDB CPU使用较高,如何排查?
    MongoDB 安全配置
    open-falcon v0.2 监控部署记录
    有关redis相关的性能优化及内存说明
    kafka 基础知识梳理
    Java 进程占用 VIRT 虚拟内存超高的问题研究
    【nodejs】文件上传demo实现
    translate和position的比较
    setAttribute()、getAttribute()与ele[attr]与自定义属性
  • 原文地址:https://www.cnblogs.com/linzheng/p/3279926.html
Copyright © 2020-2023  润新知