zoukankan      html  css  js  c++  java
  • Cocos2d-x学习之---点击按钮动态展现出一列菜单的一些想法

    场景展现:游戏中,比如说点击设置按钮,然后就会弹出一列菜单的效果,每个子项菜单是一个一个展现的效果,并且带一个背景。不是那种简单的点击按钮,然后一排菜单同时展现的那种效果。
    
    

    
    

    个人思路:首先背景的展现,在这里,我的想法就是做一个小背景图,然后把背景图沿X轴拉伸就可以了;然后,关于子项菜单的逐项弹出效果,我的想法是在初始化的时候创建好子项菜单,然后加入到一个数组中。在点击按钮的时候,遍历数组,将每个子项展现出来,并且坐标会在遍历的过程中变化,使每个子项菜单的位置是不一样的。这样效果就出来了。

    OK,上代码:

    //拉伸背景的创建
     lashen=CCSprite::create("lashen.png");
            lashen->setPosition(ccp(800,200));
            lashen->setAnchorPoint(ccp(1,0));
            lashen->setVisible(false);
            this->addChild(lashen);

    首先创建拉伸背景,并且背景初始的时候是不可见的。(在创建的时候retain,在点击的时候add,再次点击的时候remove。这样能不能达到节省内存的作用呢?)

     //item,假如这是个设置按钮
            CCMenuItemImage* itemImage=CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png", this, menu_selector(TestLayer::dianjiCallBack));
            itemImage->setAnchorPoint(ccp(1,0));
            itemImage->setPosition(ccp(850,200));
            pMenu = CCMenu::create(itemImage, NULL);
            pMenu->setPosition( CCPointZero );
            this->addChild(pMenu, 1);

    然后我们开始创建菜单子项:

     //这里假设要创建10个子项菜单
    for (int i=0; i<11; i++) {
                CCMenuItemImage* itemImage=CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png", this, menu_selector(TestLayer::dianCallBack));
                itemImage->retain();
                itemImage->setAnchorPoint(ccp(1,0));
                
                array->addObject(itemImage);
            }

    上面代码中的array是一个数组,用来管理子项菜单

    //这里是设置按钮的回调函数
    void TestLayer::dianCallBack(cocos2d
    ::CCObject *sender){
        CCLog("dianji");
    }
    void TestLayer::dianjiCallBack(CCObject *sender){   
        if (!dianji) {
            lashen->setVisible(true);       
            this->schedule(schedule_selector(TestLayer::lashenUpdate));
            skew=0.0f;
            dianji=true;
            return ;
        }
        if (dianji) {
            this->schedule(schedule_selector(TestLayer::suoxiaoUpdate));
            ss=10.0f;        
            dianji=false;
            return ;
        }
    }

    点击一次按钮,我就做一个定时器,这里用定时器,我的想法是实现那种逐步展现的效果。最终运行效果看起来是挺不错的。

    最后是点击设置按钮,然后子项菜单逐项弹出缩回的代码:

    void TestLayer::lashenUpdate(float dt){
        skew++;
        if (skew<=10.0f) {
            CCLog("skew===%d",(int)skew);
            CCMenuItemImage* item=(CCMenuItemImage*)array->objectAtIndex((int)skew);
            item->setPosition(ccp(850-(int)skew*50,200));
            pMenu->addChild(item);
            lashen->setScaleX(skew);
        }
    }
    
    void TestLayer::suoxiaoUpdate(float dt){
        ss--;
        if (ss>=0.0f) {
            CCLog("ss===%d",(int)ss+1);
            lashen->setScaleX(ss);
            CCMenuItemImage* item=(CCMenuItemImage*)array->objectAtIndex(((int)ss+1));
            pMenu->removeChild(item, false);
            
           if (ss==0) {
                lashen->setVisible(false);
            }
        }
    }



    
    
    
  • 相关阅读:
    php apc
    nginx https
    js弹出确认框,挺全
    websocket nodejs
    nodejs express测试
    【C++】Mandelbrot集绘制(生成ppm文件)
    【Scheme】Huffman树
    【Scheme】符号求导
    【Scheme】树结构
    【Scheme】序列的操作
  • 原文地址:https://www.cnblogs.com/zhong-dev/p/4044603.html
Copyright © 2011-2022 走看看