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);
        }
    }
}





posted @ 2013-11-23 19:26  Le Ciel  阅读(510)  评论(0编辑  收藏  举报