传值回调

来源:互联网 发布:网络变压器厂招人吗 编辑:程序博客网 时间:2024/05/19 18:17

利用传值回调实现 自定义 修改背景图

效果图


C.h

#ifndef __C_H__#define __C_H__#include "cocos2d.h"#include "D.h"class C : public cocos2d::Layer{public:static cocos2d::Scene* createScene();//创建场景virtual bool init();  //初始化CREATE_FUNC(C);//创建层std::vector<std::string>v;//保存所有的自定义图片void changBg(std::string fileName);//变换背景cocos2d::Sprite *bg;//背景精灵void show(Ref* pSender);//点击按钮后显示 自定义个数的 子菜单};#endif

C.cpp

#include "C.h"USING_NS_CC;using namespace std;Scene* C::createScene()//创建场景{    auto scene = Scene::create();    auto layer = C::create();    scene->addChild(layer);    return scene;}bool C::init(){//初始化    if (!Layer::init() ){return false;}//背景精灵bg = Sprite::create("HelloWorld.png");bg->setNormalizedPosition(Vec2(0.5,0.5));this->addChild(bg);//将自己定义的图片加进去 ,目前只 添加3个v.push_back("HelloWorld.png");v.push_back("CloseSelected2.png");v.push_back("item1.jpg");//点击这个按钮后出现上面的3个MenuItemFont *item = MenuItemFont::create("Show",CC_CALLBACK_1(C::show,this));Menu *menu = Menu::create(item,NULL);menu->setPosition(Point(900,600));//添加进当前层(C)中this->addChild(menu);    return true;}//这个函数实现 创建 D层,显示 自定义个数的按钮void C::show(Ref* pSender){D *ml = D::create(v,std::bind(&C::changBg,this,std::placeholders::_1));this->addChild(ml);}//改变背景的函数 回调的这个函数void C::changBg(std::string fileName){//通过图片名字更改背景bg->setTexture(fileName);}

D.h

#ifndef __D_H_#define __D_H_#include "cocos2d.h"using namespace  cocos2d;class D:public Layer{public://初始化virtual bool init(std::vector<std::string> v,std::function<void (std::string)>m);//重写D的create方法,实现自定义创建static D *create(std::vector<std::string> v,std::function<void (std::string)>m);std::function<void (std::string)> back;//接收C传过来的 函数的地址void call(Ref *obj);//};#endif

D.cpp


#include "D.h"bool D::init(std::vector<std::string> v,std::function<void (std::string)>m){if(!Layer::init()){return false;}int i = 0;Menu *menu = Menu::create(NULL);//遍历穿过来的 vector集合,然后建立子菜单for (auto it = v.begin();it!=v.end();it++){std::string strName = *it;MenuItemFont *mif =MenuItemFont::create(strName,CC_CALLBACK_1(D::call,this));mif->setPosition(Point(100,100*i +50));mif->setName(strName);menu->addChild(mif);i++;}this->addChild(menu);return true;}//存放 图片名称的集合 std::string 类型     没有返回值的函数 形参是std::string 类型D * D::create(std::vector<std::string> v,std::function<void (std::string)>m){D *d = new D();if (d && d->init(v,m)){d->back = m;d->autorelease();return d;}CC_SAFE_DELETE(d);return NULL;}// 点击 任意一个 子菜单 回调这个方法 ,根据名字判断点击了哪个。void D::call(Ref *obj){MenuItemFont *mif= dynamic_cast<MenuItemFont *>(obj);std::string strName = mif->getName();back(strName.c_str());//c_str()输出格式}


0 0