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

来源:互联网 发布:淘宝买港版ipad 编辑:程序博客网 时间:2024/05/17 18:25

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

步骤如下:

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 Callbackvoid 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 0
原创粉丝点击