-
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
#include "CResource.h"
#include "cocos-ext.h"
class HelloWorld : public cocos2d::CCLayer
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::CCScene* scene();
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);
RcMainScene m_rc;
//将menuItem添加到menu
void addItemToMenu(cocos2d::CCMenu *menu, Stc_Node *node, cocos2d::SEL_MenuHandler handle = NULL);
//点击menuItem回调函数
void call_select(CCObject *pSender);
//测试异步请求网络数据
void testAsyNet();
void call_asyNet(cocos2d::extension::CCHttpClient *sender, cocos2d::extension::CCHttpResponse *response);
};
#endif // __HELLOWORLD_SCENE_H__
#include "HelloWorldScene.h"
#include "CMessage.h"
#include "CCloud.h"
USING_NS_CC;
USING_NS_CC_EXT;
CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
//添加背景
CCSprite *sprite = CCSprite::create(m_rc.m_bg.filename.c_str());
sprite->setPosition(m_rc.m_bg.pos);
this->addChild(sprite);
//添加菜单
CCMenu *cityMenu = CCMenu::create();
cityMenu->setPosition(m_rc.m_cityMenu.pos);
this->addChild(cityMenu);
//添加按钮
addItemToMenu(cityMenu, &m_rc.m_mine, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_shop, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_workShop, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_bar, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_chooseGen, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_train, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_trade, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_inherit, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_genMap, menu_selector(HelloWorld::call_select));
addItemToMenu(cityMenu, &m_rc.m_shrine, menu_selector(HelloWorld::call_select));
CCloud::create(this);
return true;
}
//将menuItem添加到menu
void HelloWorld::addItemToMenu(CCMenu *menu, Stc_Node *node, SEL_MenuHandler handler)
{
CCMenuItemImage *item = CCMenuItemImage::create(node->filename.c_str(), node->filename.c_str());
item->setTag(node->tag);
item->setPosition(node->pos);
if(handler)
{
item->setTarget(this, handler);
}
menu->addChild(item);
}
//点击menuItem回调函数
void HelloWorld::call_select(CCObject *pSender)
{
CCMenuItemImage *item = dynamic_cast<CCMenuItemImage *>(pSender);
CCAssert(item, "item不能为空, call_select");
const char *cityName[10] = {"矿区", "商店", "玉石作坊", "酒馆", "点将台", "校场", "贸易中心", "传承塔", "名将图鉴", "战神殿"};
int index = item->getTag() - 101;
CCString *msg = CCString::createWithFormat("没有开启【%s】,尽请期待!", cityName[index]);
//CMessage::alert(this, msg->getCString());
testAsyNet();
}
//测试请求网络数据
void HelloWorld::testAsyNet()
{
CCHttpRequest *request = new CCHttpRequest();
request->setUrl("http://www.phebe.cn/gallery/6/b2.jpg");
request->setRequestType(CCHttpRequest::kHttpGet);
request->setResponseCallback(this, (SEL_HttpResponse)(&HelloWorld::call_asyNet));
request->setTag("PigGet");
CCHttpClient::getInstance()->setTimeoutForConnect(30);
CCHttpClient::getInstance()->send(request);
request->release();
request = NULL;
}
void HelloWorld::call_asyNet(cocos2d::extension::CCHttpClient *sender, cocos2d::extension::CCHttpResponse *response)
{
// 判断是否响应成功
if (!response->isSucceed())
{
CCString *str = CCString::createWithFormat("请求失败, %s\n",response->getErrorBuffer());
CMessage::alert(this, str->getCString());
return ;
}
const char* tag = response->getHttpRequest()->getTag();
if (0 != strcmp("PigGet",tag))
{
return;
}
std::vector<char> *v = response->getResponseData();
std::vector<char>::iterator itr = v->begin();
//将vector<char>转化为string
std::string str;
while (v->end() != itr) {
str.append(1, *itr);
++itr;
}
CCString *strMsg = CCString::createWithFormat("成功从%s请求图片\n", tag);
CMessage::alert(this, strMsg->getCString());
std::string picName = std::string(tag) + ".png";
std::string path = CCFileUtils::sharedFileUtils()->getWritablePath() + picName;
std::string buff(v->begin(),v->end());
//保存到本地文件
FILE *fp = fopen(path.c_str(), "wb+");
fwrite(buff.c_str(), 1, v->size(), fp);
fclose(fp);
}
-
-
-
- void TestLayer::btncallback( CCObject* pSender )
- {
- bool requestType_is_get=true;//采用get方式或者post方式
- if (requestType_is_get)
- {
- CCHttpRequest* request = new CCHttpRequest();//创建请求对象
- string str1 = "127.0.0.1:80/index.html?";
- string str2 = p_User_EditBox->getText();//获取username编辑框内容
- string str3 = p_Psw_EditBox->getText();//获取password编辑框内容
- string struser="username=";
- string strpsw="&password=";
- str1=str1+struser+str2+strpsw+str3;
- request->setUrl(str1.c_str());//设置请求的url,username和password已经包含在url中
- request->setRequestType(CCHttpRequest::kHttpGet);//设置为Get模式
- request->setResponseCallback(this, httpresponse_selector(TestLayer::onHttpRequestCompleted));//设置响应的回调
- request->setTag("GET test");
- CCHttpClient::getInstance()->send(request);//发送请求
- request->release();//释放请求
- }
- else
- {
- CCHttpRequest* request = new CCHttpRequest();//创建请求对象
- string str1 = "127.0.0.1:80/index.html";
- string str2 = p_User_EditBox->getText();
- string str3 = p_Psw_EditBox->getText();
- string struser="username=";
- string strpsw="&password=";
- str2=struser+str2+strpsw+str3;
- request->setUrl(str1.c_str());//设置请求的url,只是请求页面的url,并不包含username和password
- request->setRequestType(CCHttpRequest::kHttpPost);//设置为Post模式
- request->setResponseCallback(this, httpresponse_selector(TestLayer::onHttpRequestCompleted));//设置响应的回调
- const char* postData = str2.c_str();
- request->setRequestData(postData, strlen(postData));//设置请求数据,也就是username和password
- request->setTag("POST test");
- CCHttpClient::getInstance()->send(request);//发送请求
- request->release();//释放请求
- }
- }
4.2.响应回调处理
- void TestLayer::onHttpRequestCompleted( CCHttpClient* client, CCHttpResponse* response )
- {
- if (!response->isSucceed())//如果响应失败,输出错误信息
- {
- CCString strError;
- strError.initWithFormat("Receive Error! \n%s\n",response->getErrorBuffer());
- m_labelStatusCode->setString(strError.getCString());
- return ;
- }
- std::vector<char> *buffer = response->getResponseData();//接收响应信息
- string recieveData;
- for (unsigned int i = 0; i < buffer->size(); i++)
- {
- recieveData += (*buffer)[i];
- }
- size_t begin= recieveData.find("<body>")+6;//这里简单处理,获取<body>标签内数据,即是响应内容
- size_t end= recieveData.find("</body>");
- string result(recieveData,begin,end-begin);
- m_labelStatusCode->setString(result.c_str());
- }