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

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

步骤如下:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值