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());}
- cocos2dx 函数作为参数进行传递和调用(std::function跟CC_CALLBACK_1的使用)
- c++ std::function作为参数传入函数
- std::list/vector 作为函数参数的传递方式
- 一维数组和二位数组作为函数参数进行传递的方式
- 数组作为函数参数进行传递
- 数据结构中链表作为函数参数进行传递
- std::function和std::bind的使用?
- 函数作为参数的传递
- JS 将函数作为参数传递调用
- lua中的handler和function()作为函数参数的不同
- 函数的调用和参数的传递
- 一次python对dll的调用,传递string类型的参数作为调用函数的参数
- .和:调用函数参数的传递
- Matlab的函数调用和参数传递
- Thread函数的参数传递和线程所有权转移(2.2)--std::move()
- 使用std::function和std::bind实现局部函数做回调
- 使用委托作为参数进行动态调用
- JAVA中函数调用参数传递的理解(值传递和引用传递的理解)
- C++根据频率生成wav音频文件
- 网络请求框架对比
- Android端和服务端Tomcat的https添加记录
- java基础学习之函数 三
- oracle特有分析函数
- cocos2dx 函数作为参数进行传递和调用(std::function跟CC_CALLBACK_1的使用)
- PowerDesigner:导入SQL脚本
- python将日志导入数据库代码案例 3
- C++指针的引用
- 其实你不知道MultiDex到底有多坑
- 进程间通信的几种方式:管道、信号、消息队列、共享内存
- 在Linux里设置环境变量的方法(export PATH)
- 设置eclipse编码方式
- js中数组的创建和删除