场景展现:游戏中,比如说点击设置按钮,然后就会弹出一列菜单的效果,每个子项菜单是一个一个展现的效果,并且带一个背景。不是那种简单的点击按钮,然后一排菜单同时展现的那种效果。
个人思路:首先背景的展现,在这里,我的想法就是做一个小背景图,然后把背景图沿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);
}
}
}