游戏中通常都会有根据时间来恢复体力值的设定,但是如果是本地时间的话,玩家可以通过修改本地时间的作弊行为来达到迅速恢复体力的目的。RT,我们便需要根据网络时间来进行判定。
1、获取本地时
Ps:别忘了添加需要的头文件
void getLocationTime()
{
struct tm *tm;
time_t timep;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
time(&timep);
#else
struct timeval tv;
gettimeofday(&tv,NULL);
timep = tv.tv_sec;
#endif
tm = localtime(&timep);
int year = tm->tm_year + 1900;
int month = tm->tm_mon + 1;
int day = tm->tm_mday;
int hour=tm->tm_hour;
int minute=tm->tm_min;
int second=tm->tm_sec;
std::cout << "当前日期:" << year << "-" << month << "-" << day << std::endl;
std::cout << "当前时间:" << hour << ":" << minute << ":" << second << std::endl;
}
2、获取网络时间
这里是利用百度的时间url来获取网络时间
直接上代码:
NetTime.h
#define __NETTIME_H___
#ifdef __NETTIME_H___
#include "cocos2d.h"
#include "network/HttpClient.h"
USING_NS_CC;
using namespace network;
class NetTime : public Node
{
public:
NetTime();
~NetTime();
CREATE_FUNC(NetTime);
CC_SYNTHESIZE(int, nDay, Day);
CC_SYNTHESIZE(int, nMonth, Month);
CC_SYNTHESIZE(int, nYear, Year);
CC_SYNTHESIZE(int, nHour, Hour);
CC_SYNTHESIZE(int, nMinute, Minute);
CC_SYNTHESIZE(int, nSecond, Second);
CC_SYNTHESIZE(time_t, tTime, Time);
void onRequestTime();
static void splitString(std::vector<std::string> &contentVector, std::string content, std::string pattern);
void onHttpComplete(HttpClient * sender, HttpResponse * response);
void spliteTime(std::string htmlStr);
void initTime(time_t time);
static NetTime* getInstance();
static NetTime* pInstance;
};
#endif
NetTime.cpp
#include "NetTime.h"
NetTime* NetTime::pInstance = NULL;
NetTime::NetTime() : nDay(0), nMonth(0), nYear(0), nHour(0), nMinute(0), nSecond(0)
{
}
NetTime::~NetTime()
{
}
void NetTime::onRequestTime()
{
HttpRequest* request = new HttpRequest();
request->setUrl("http://open.baidu.com/special/time/");//baidu getNetTime api
request->setRequestType(HttpRequest::Type::GET);
request->setTag("getNetTime");
request->setResponseCallback(this, httpresponse_selector(NetTime::onHttpComplete));
HttpClient::getInstance()->send(request);
}
void NetTime::onHttpComplete(HttpClient * sender, HttpResponse * response)
{
if (!response)
return;
if (0 != strlen(response->getHttpRequest()->getTag()))
{
CCLOG("%s completed", response->getHttpRequest()->getTag());
}
int statusCode = response->getResponseCode();
char statusString[64] = {};
sprintf_s(statusString, "HTTP Status : %d, tag = %s", statusCode, response->getHttpRequest()->getTag());
CCLOG("%s", statusString);
if (!response->isSucceed())
{
CCLOG(" response failed !");
CCLOG(" error buffer is :%s", response->getErrorBuffer());
return;
}
std::vector<char> * buffer = response->getResponseData();
std::string str;
for (unsigned i = 0; i < buffer->size(); i++)
{
char a = (*buffer)[i];
str.append(1, a);
}
spliteTime(str);
}
void NetTime::spliteTime(std::string htmlStr)
{
std::vector<std::string> tmp;
splitString(tmp, htmlStr, "baidu_time");
std::string str = tmp.at(2);
std::string tmpTime = str.substr(1, 10);
time_t tt = atoi(tmpTime.c_str());
initTime(tt);
}
void NetTime::initTime(time_t time)
{
time_t t;
struct tm* p;
t = time;
p = localtime(&t);
setSecond(p->tm_sec);
setMinute(p->tm_min);
setHour(p->tm_hour);
setDay(p->tm_mday);
setMonth(p->tm_mon + 1);
setYear(p->tm_year + 1900);
setTime(t);
log("time is : %d-%d-%d %d:%d:%d", getYear(), getMonth(), getDay(), getHour(), getMinute(), getSecond());
}
//切割字符串
void NetTime::splitString(std::vector<std::string> &contentVector, std::string content, std::string pattern){
std::string::size_type pos;
content += pattern;
int size = content.size();
for (int i = 0; i < size; i++)
{
pos = content.find(pattern, i);
if (pos < size)
{
std::string s = content.substr(i, pos - i);
contentVector.push_back(s);
i = pos + pattern.size() - 1;
}
}
}
NetTime* NetTime::getInstance()
{
if (pInstance == NULL)
{
pInstance = new NetTime;
}
return pInstance;
}