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