传值回调

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

效果图


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,回调函数内如何传值回调函数可以通过以下两种方法实现: 方法一:使用函数参数递值。在回调函数的参数列表中添加需要递的值,并在调用回调函数时入相应的参数。例如: ```c++ typedef void (*CallbackFunc)(int value); // 定义回调函数类型 void callback(int value) // 回调函数 { // 在回调函数内部使用入的value值 // ... } void doSomething(CallbackFunc cb) // 接受回调函数作为参数的函数 { int value = 10; // 需要递的值 cb(value); // 调用回调函数并入值 } int main() { doSomething(callback); // 回调函数 return 0; } ``` 方法二:使用类的成员变量来递值。在定义回调函数时,将回调函数设置为类的静态成员函数,并在类内部设置一个静态成员变量,用于存储需要递的值。在回调函数中,可以通过访问该静态成员变量来获取递的值。例如: ```c++ class MyClass { static int value; // 静态成员变量用于递值 static void callback(); public: static void setValue(int val) { value = val; // 设置需要递的值 } static void doSomething() { callback(); // 调用回调函数 } }; int MyClass::value = 0; // 初始化静态成员变量 void MyClass::callback() { // 在回调函数内部使用静态成员变量value // ... } int main() { MyClass::setValue(10); // 设置递的值 MyClass::doSomething(); // 执行回调函数 return 0; } ``` 通过上述方法,可以在C++中实现回调函数内的值递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值