首页 > 学院 > 开发设计 > 正文

cocos2dx 函数作为参数进行传递和调用(std::function跟CC_CALLBACK_1的使用)

2019-11-09 17:36:11
字体:
来源:转载
供稿:网友

本文主要实现的功能为:  把函数当做形参进行传递,并且调用。

步骤如下:

1:首先声明一个函数指针   函数原型为   void 函数名(string str) 无返回值,一个string参数

typedef std::function<void(string str)> httPRequest_SuccessOrFail_callback;

2:声明2个回调函数

httpRequest_SuccessOrFail_callback m_success_callback = nullptr;httpRequest_SuccessOrFail_callback m_fail_callback = nullptr;

3:在符合条件的时候调用回调函数

this->m_success_callback("test success");

this->m_fail_callback("test error"); 

4:把实参(实参为函数)传递给形参

(1)形参声明:

void connectServer(const char* address, const char* postData, bool isSetHeader,const httpRequest_SuccessOrFail_callback &successCallback, const httpRequest_SuccessOrFail_callback &failCallback);

(2)实参传递给形参

callback1->connectServer(url.c_str(), "", false,CC_CALLBACK_1(HelloWorld::successCallBack, this), CC_CALLBACK_1(HelloWorld::failCallBack, this));

参考链接:

http://www.gimoo.net/t/1504/55278beacb9af.html

http://blog.csdn.net/dawn_moon/article/details/8546607

----------------------------------------------------------------------------------------------------------------------------------------------------------

下面附上完整的demo,一共两个类(结合cocos的httpclient进行的测试,在联网成功或者失败后,调用不同的回调函数)

1:形参类的头文件

#pragma once#ifndef _TESTSTDBIND_H_#define _TESTSTDBIND_H_#include <functional>using namespace std;#include "cocos2d.h"#include "network/HttpClient.h"#include "network/HttpResponse.h"#include "string"USING_NS_CC;using namespace network;/*	date:2017.02.07*/////定义成员函数指针  //typedef void (cocos2d::Ref::*SELF_CallBack)();//#define m_callFunc_selector(_SELECTOR) (SELF_CallBack)(&_SELECTOR)  //把m_call(方法的全名为---类名:函数名)   括号中的取地址,然后强转//typedef std::function<void(HttpClient* client, HttpResponse* response)> ccHttpRequestCallback;//typedef void (cocos2d::Ref::*SEL_HttpResponse)(HttpClient* client, HttpResponse* response);//#define httpresponse_selector(_SELECTOR) (cocos2d::network::SEL_HttpResponse)(&_SELECTOR) //(cocos2d::network::)为强制转换typedef std::function<void(string str)> httpRequest_SuccessOrFail_callback;class TestStdBind : public Layer{public:	TestStdBind();	~TestStdBind();	CREATE_FUNC(TestStdBind);	virtual bool init() override;public:	//void connectServer(const char* address, const char* postData, bool isSetHeader, 	//	std::function<void()> successCallback, std::function<void()> failCallback);	////void connectServer(const char* address, const char* postData, bool isSetHeader,	////	SELF_CallBack successCallback, SELF_CallBack failCallback);	void connectServer(const char* address, const char* postData, bool isSetHeader,		const httpRequest_SuccessOrFail_callback &successCallback, const httpRequest_SuccessOrFail_callback &failCallback);	//Http Response Callback	void onHttpRequestCompleted(HttpClient *sender, HttpResponse *response1);	//server端返回来的数据	string httpServerData = "error";private:	//std::function<void()> m_success_callback;	//std::function<void()> m_fail_callback;	////SELF_CallBack m_success_callback;	////SELF_CallBack m_fail_callback;	httpRequest_SuccessOrFail_callback m_success_callback = nullptr;	httpRequest_SuccessOrFail_callback m_fail_callback = nullptr;};#endif

2:形参类的实现文件

#include "TestStdBind.h"#include "json/forwards.h"#include "json/value.h"#include "json/writer.h"#include "network/HttpClient.h"#include "network/HttpResponse.h"#include "json/reader.h"#include "CommonDefine.h"#include "Utils/JsonUtils.h"#pragma execution_character_set("utf-8")using namespace network;TestStdBind::TestStdBind(){}TestStdBind::~TestStdBind(){	HttpClient::destroyInstance();}bool TestStdBind::init(){	if (!Layer::init())	{		return false;	}	return true;}void TestStdBind::connectServer(const char* address, const char* postData, bool isSetHeader,	const httpRequest_SuccessOrFail_callback &successCallback,const httpRequest_SuccessOrFail_callback &failCallback){	this->m_success_callback = successCallback;	this->m_fail_callback = failCallback;	HttpRequest* request = new (std::nothrow) HttpRequest();	request->setUrl(address);	request->setRequestType(HttpRequest::Type::POST);	request->setResponseCallback(this, httpresponse_selector(TestStdBind::onHttpRequestCompleted));	if (isSetHeader)	{		std::vector<std::string> headers;		headers.push_back("Content-Type: application/json; charset=utf-8");		request->setHeaders(headers);	}	request->setRequestData(postData, strlen(postData));	//log("requestURL %s    postStr  %s", request->getUrl(), postData);	request->setTag("Post_My_Data");	cocos2d::network::HttpClient::getInstance()->setTimeoutForConnect(JsonUtils::getFloatFromJson("httpConnectTimeOut"));	cocos2d::network::HttpClient::getInstance()->setTimeoutForRead(JsonUtils::getFloatFromJson("httpReadTimeOut"));	HttpClient::getInstance()->send(request);	request->release();}void TestStdBind::onHttpRequestCompleted(HttpClient *sender, HttpResponse *response1){	HttpResponse *response = response1;	if (!response || !response->isSucceed())	{		log("error buffer:%s", response->getErrorBuffer());		this->m_fail_callback("test fail");		return;	}	vector<char> *buffer = response->getResponseData();	string result(buffer->begin(), buffer->end());	log("MyHttpPost::onHttpRequestCompleted  服务器返回的数据: %s", result.c_str());	//接收服务端返回来的数据	this->httpServerData = result;	//(this->*m_success_callback)();//"success"		//实际调用	this->m_success_callback("test success");}

3:实参类的头文件

#pragma once#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#include "Scene/httpInterface/MyHttpPost.h"#include "TestStdBind.h"/*	@date : 2016.10.12*/class HelloWorld : public cocos2d::Layer{public:    // there's no 'id' in cpp, so we recommend returning the class instance pointer    static cocos2d::Scene* createScene();    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone    virtual bool init();    // implement the "static create()" method manually    CREATE_FUNC(HelloWorld);private:	void testCallBack();	void successCallBack(string str);	void failCallBack(string str);private:	TestStdBind* callback1 = nullptr;};#endif // __HELLOWORLD_SCENE_H__

4:实参类的实现文件

#include "HelloWorldScene.h"#include "Scene/httpInterface/MyHttpPost.h"#include "update/HttpClientDownLoadAPK.h"#include "CommonDefine.h"#include "Scene/LogoScene.h"#include "update/AssetsManagerResource.h"#include "TestStdBind.h"#include "Utils/JsonUtils.h"#include "Data/GameManager.h"USING_NS_CC;#pragma execution_character_set("utf-8")Scene* HelloWorld::createScene(){    auto scene = Scene::create();    auto layer = HelloWorld::create();    scene->addChild(layer);    return scene;}bool HelloWorld::init(){    if ( !Layer::init() )    {        return false;    }    	this->testCallBack();	return true;}void HelloWorld::testAES(){}void HelloWorld::testCallBack(){	callback1 = TestStdBind::create();	std::string url = StringUtils::format("%s/gm-web/app/ask/update/%s/%s",		JsonUtils::getStringFromJson("serverURL").c_str(),		GameManager::getInstance()->getAppName().c_str(),		UserDefault::getInstance()->getStringForKey(ResourcesVersion,"1.0.0").c_str());	this->addChild(callback1);	 	//callback1->connectServer(url.c_str(), "", false, [=](){	//	//log("返回成功111 %s ==", callback1->httpServerData.c_str());	//}, [=](){	//	log("返回失败111 %s ==", callback1->httpServerData.c_str());	//});	callback1->connectServer(url.c_str(), "", false,		CC_CALLBACK_1(HelloWorld::successCallBack, this), CC_CALLBACK_1(HelloWorld::failCallBack, this));}void HelloWorld::successCallBack(string str){	log("%s",str.c_str());	log("返回成功222 %s ==", callback1->httpServerData.c_str());}void HelloWorld::failCallBack(string str){	log("%s", str.c_str());	log("返回失败222 %s ==", callback1->httpServerData.c_str());}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表