利用传值回调实现 自定义 修改背景图
效果图
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()输出格式
}