cocos2dx关于“每日签到”界面以及功能实现

现在很多手游都会有一个签到界面,每日签到给玩家奖励来保持玩家活跃度,具体是怎么实现呢?就经验来说,个人认为逻辑很简单,就是获取打开游戏的当前日期,然后判断当前时间是今天还是昨天或是明天,判断是否已经领取过奖励,领取过就把领取设为不可点击或者不可见,然后当下一次打开游戏,判断到不是领取过的日子再显示领取或设置领取为可点击,表达的可能不是很清晰,大概就是要获取当前的日期,明天日期,签到次数等。这些内容都是需要做数据存储的,保证每天获取的道具跟签到天数一一对应。看代码看代码——
1.先做数据存储的管理器;
2.在AppDelegate.cpp中获取当天日期;
3.在签到界面中根据签到日期给道具


//  RUserData.h


#ifndef __RUserData__
#define __RUserData__




#include
#include "cocos2d.h"




#define RSet RUserData::setData
#define RGet RUserData::getData
#define RFlush RUserData::flush(true)
#define MC_USER UserDefault::getInstance()




using namespace cocos2d;




class RUserData {
    /** 用户数据保存处理 **/
    
public:
    
    /** 储存数据 **/
    static void setData(std::string key,const char* data);
    static void setData(std::string key,int data);
    static void setData(std::string key,float data);
    static void setData(std::string key,bool data);
    
    static std::string getData(std::string key,const char* data);
    static int getData(std::string key,int data);
    static float getData(std::string key,float data);
    static bool getData(std::string key,bool data);
    
    /** 确认储存 **/
    static void flush(bool pBool = false);
};




#endif 




//  RUserData.cpp


#include "RUserData.h"
#include "Utils.h"


/** 写入 **/


void RUserData::setData(std::string key, const char* data)
{
    CCLOG("SetString %s %s",key.c_str(), data);

    MC_USER->setStringForKey(key.c_str(), data);
}

void RUserData::setData(std::string key, int data)
{
    CCLOG("SetInt %s %i",key.c_str(), data);
    MC_USER->setIntegerForKey(key.c_str(), data);
}


void RUserData::setData(std::string key, float data)
{

    MC_USER->setFloatForKey(key.c_str(), data);

}


void RUserData::setData(std::string key, bool data)
{

    MC_USER->setBoolForKey(key.c_str(), data);

}


/** 读取 **/


std::string RUserData::getData(std::string key, const char* data)
{
    CCLOG("GetString %s %s",key.c_str(), data);

    return MC_USER->getStringForKey(key.c_str(), data);
}


int RUserData::getData(std::string key, int data)
{

    return MC_USER->getIntegerForKey(key.c_str(), data);

}


float RUserData::getData(std::string key, float data)
{

    return MC_USER->getFloatForKey(key.c_str(), data);

}


bool RUserData::getData(std::string key, bool data)
{


    return MC_USER->getBoolForKey(key.c_str(), data);

}




void RUserData::flush(bool pBool)
{

    MC_USER->flush();
    
}





//  GameData.h




#ifndef __GameData__
#define __GameData__




#include
#include "cocos2d.h"
#include "RUserData.h"




USING_NS_CC;




struct Tomorrow{
    int year;
    int month;
    int day;
};




class GameData {
public:
   
    
    /** getFirstOpenGame
     * 是否第一次打开游戏
     * 无
     */
    static bool getFirstOpenGame();
    

    
    
    /** setFirstOpenGame
     * 设置第一次打开游戏
     * 本地储存名:_have
     * true/false
     */
    static void setFirstOpenGame(std::string _have, bool ishave);
    
    
  
    
    /** getCurHaveGameDay
     * 取得拥有游戏第几天,每七天一个循环【1-7】
     */
    static int getCurHaveGameDay();
    
    /** setCurHaveGameDay
     * 设置拥有游戏第几天,每七天一个循环【1-7】
     */
    static void setCurHaveGameDay(int m_haveGameDay);
    
    /** getTomorrow
     * 取得明天的日期年月日
     */
    static Tomorrow getTomorrow();
    
    /** setTomorrow
     * 设置明天的日期年月日
     */
    static void setTomorrow();
    
    
    /** getCurDate
     * 取得当前的日期年月日
     */
    static Tomorrow getCurDate();
    
    /** getIsTodayLogin
     * 取得今天是否登陆游戏
     */
    static bool getIsTodayLogin();
    
    
    /** setIsTodayLogin
     * 设置今天是否登陆游戏
     */
    static void setIsTodayLogin(bool m_IsTodayLogin);
    
    /** getIsTodayFirstLogin
     * 取得今天是否第一次登陆游戏
     */
    static bool getIsTodayFirstLogin();
    
    /** setIsTodayFirstLogin
     * 设置今天是否第一次登陆游戏
     */
    static void setIsTodayFirstLogin(bool m_IsTodayFirstLogin);
    
    /** getTodayPlayGameDate
     * 取得今天第一次玩游戏的时间
     */
    static Tomorrow getTodayPlayGameDate();
    
    /** setTodayPlayGameDate
     * 设置今天第一次玩游戏的时间
     */
    static void setTodayPlayGameDate(Tomorrow m_TodayPlayGameDate);
    
    /** getHaveReceivedNum
     * 取得已领取了多少次签到礼物
     */
    static int getHaveReceivedNum();
    
    /** setHaveReceivedNum
     * 设置已领取了多少次签到礼物
     */
    static void setHaveReceivedNum(int m_HaveReceived);
    
};
#endif






//  GameData.cpp




#include "GameData.h"
#include "Utils/PlatformHandler.h"
#include "RMusic.h"
static Tomorrow m_Tomorrow;
static Tomorrow m_curDate;




bool GameData::getFirstOpenGame(){//获取是否第一次运行游戏   直接给false
    
    return  RGet("_have",false);
}


//设置是否第一次运行游戏
void GameData::setFirstOpenGame(std::string _have, bool ishave){
    RSet(_have.c_str(),ishave);
     RFlush;
}




//取得拥有游戏第几天,每七天一个循环【1-7】
int GameData::getCurHaveGameDay(){
    return RGet("_haveGameDay",0);
}


//设置拥有游戏第几天,每七天一个循环【1-7】
void GameData::setCurHaveGameDay(int m_haveGameDay){
    RSet("_haveGameDay",m_haveGameDay);
     RFlush;
}


//取得明天的日期年月日
Tomorrow GameData::getTomorrow(){
    int year=RGet("year",0);
    int month=RGet("month",0);
    int day=RGet("day",0);
    m_Tomorrow.year=year;
    m_Tomorrow.month=month;
    m_Tomorrow.day=day;
    return m_Tomorrow;
}


//设置明天的日期年月日
void GameData::setTomorrow(){
    struct timeval nowTimeval;
    gettimeofday(&nowTimeval, NULL);
    struct tm * tmm;
    time_t time_sec ;
    time_sec = nowTimeval.tv_sec;
    tmm = localtime(&time_sec);
    
    int year=1900,month=1,day=0;
    
    if (tmm->tm_mon+1==12&&tmm->tm_mday==31) {
        year=tmm->tm_year+1900+1;
        month=1;
        day=1;
        
    }else{
        year=tmm->tm_year+1900;
        
        if (tmm->tm_mon+1==4||tmm->tm_mon+1==6||tmm->tm_mon+1==9||tmm->tm_mon+1==11) {
            if (tmm->tm_mday==30) {
                month=tmm->tm_mon+1+1;
                day=1;
            }else{
                month=tmm->tm_mon+1;
                day=tmm->tm_mday+1;
            }
        }
        else if(tmm->tm_mon+1==2){
            if ((tmm->tm_year+1900)%4==0&&(tmm->tm_year+1900)%400==0) {
                if (tmm->tm_mday==29) {
                    month=tmm->tm_mon+1+1;
                    day=1;
                }else{
                    month=tmm->tm_mon+1;
                    day=tmm->tm_mday;
                }
            }else{
                if (tmm->tm_mday==28) {
                    month=tmm->tm_mon+1+1;
                    day=1;
                }else{
                    month=tmm->tm_mon+1;
                    day=tmm->tm_mday;
                }
            }
        }else{
            if (tmm->tm_mday==31) {
                month=tmm->tm_mon+1+1;
                day=1;
            }else{
                month=tmm->tm_mon+1;
                day=tmm->tm_mday+1;
            }
        }
        
    }
    log("明天是-------》%d年——————》%d月---------->%d日",year,month,day);
    RSet("year",year);
    RSet("month",month);
    RSet("day",day);
    RFlush;
}


//取得当前的日期年月日
Tomorrow GameData::getCurDate(){
    struct timeval nowTimeval;
    gettimeofday(&nowTimeval, NULL);
    struct tm * tmm;
    time_t time_sec ;
    time_sec = nowTimeval.tv_sec;
    tmm = localtime(&time_sec);
    m_curDate.year=tmm->tm_year+1900;
    m_curDate.month=tmm->tm_mon+1;
    m_curDate.day=tmm->tm_mday;
    return m_curDate;
}


//取得今天是否登陆游戏
bool GameData::getIsTodayLogin(){
    return RGet("_IsTodayLogin",false);
}


//设置今天是否登陆游戏
void GameData::setIsTodayLogin(bool m_IsTodayLogin){
    RSet("_IsTodayLogin",m_IsTodayLogin);
    RFlush;
}


//取得今天是否第一次登陆游戏
bool GameData::getIsTodayFirstLogin(){
    return RGet("_IsTodayFirstLogin",false);
}


//设置今天是否第一次登陆游戏
void GameData::setIsTodayFirstLogin(bool m_IsTodayFirstLogin){
    RSet("_IsTodayFirstLogin",m_IsTodayFirstLogin);
    RFlush;
}
//取得今天第一次玩游戏的时间
Tomorrow GameData::getTodayPlayGameDate(){
    Tomorrow T;
    T.year=RGet("_TodayYear",0);
    T.month=RGet("_TodayMonth",0);
    T.day=RGet("_TodayDay",0);
    return T;
}
//设置今天第一次玩游戏的时间
void GameData::setTodayPlayGameDate(Tomorrow m_TodayPlayGameDate){
    RSet("_TodayYear",m_TodayPlayGameDate.year);
    RSet("_TodayMonth",m_TodayPlayGameDate.month);
    RSet("_TodayDay",m_TodayPlayGameDate.day);
    RFlush;
}
//设置已领取了多少次签到礼物
void GameData::setHaveReceivedNum(int m_HaveReceived){
    RSet("_HaveReceived",m_HaveReceived);
    RFlush;
}
//取得已领取了多少次签到礼物
int GameData::getHaveReceivedNum(){
    return RGet("_HaveReceived",0);
}


//在AppDelegate中做日期判断

if (GameData::getFirstOpenGame()) {
        //设置明天的时间
        GameData::setTomorrow();
        
        //设置今天的游戏日期
        Tomorrow T;
        T.year=GameData::getCurDate().year;
        T.month=GameData::getCurDate().month;
        T.day=GameData::getCurDate().day;
        GameData::setTodayPlayGameDate(T);
        
        GameData::setIsTodayLogin(false);
    }
    
    //判断游戏的日期是否和今天的日期吻合
    if (GameData::getCurDate().year==GameData::getTodayPlayGameDate().year&&
        GameData::getCurDate().month==GameData::getTodayPlayGameDate().month&&
        GameData::getCurDate().day==GameData::getTodayPlayGameDate().day&&
        GameData::getIsTodayLogin()) {
        GameData::setIsTodayFirstLogin(false);
        
    }else{
        
        GameData::setIsTodayFirstLogin(true);
    }
    
    
    //判断今天是否第一次打开游戏
    if (GameData::getIsTodayFirstLogin()) {
        if ((GameData::getCurDate().year==GameData::getTomorrow().year&&
             GameData::getCurDate().month==GameData::getTomorrow().month&&
             GameData::getCurDate().day==GameData::getTomorrow().day)||!GameData::getIsTodayLogin()) {
            GameData::setTomorrow();
            GameData::setIsTodayLogin(true);
//            log("我今天登陆了");
//            if (GameData::getCurHaveGameDay()>=8) {
//                GameData::setCurHaveGameDay(1);
//                GameData::setHaveReceivedNum(0);
//            }else{
//                GameData::setCurHaveGameDay(GameData::getCurHaveGameDay()+1);
//            }
            log("连续签到第:------->%d",GameData::getCurHaveGameDay());
        }else{
//            GameData::setTomorrow();
//            GameData::setIsTodayLogin(true);
//            log("我昨天忘了登陆");
//            log("把签到设为第一天");
//            GameData::setCurHaveGameDay(1);
//            GameData::setHaveReceivedNum(0);
        }
        
        GameData::setCurHaveGameDay(GameData::getCurHaveGameDay()+1);
        
        Tomorrow T;
        T.year=GameData::getCurDate().year;
        T.month=GameData::getCurDate().month;
        T.day=GameData::getCurDate().day;
        GameData::setTodayPlayGameDate(T);
    }
    


//DailyAttendanceLayer.cpp 中调用,声明方法,下面是回调,点击签到,对应天数给对应的道具
//先在DailyAttendanceLayer.h中声明sign(Ref* ref);方法 然后在签到按钮的点击事件中使用

void DailyAttendanceLayer::sign(Ref* ref)
{
    this->runAction(Sequence::create(DelayTime::create(0.3), CallFunc::create([&](){
        Utils::click();
        GameData::setHaveReceivedNum(GameData::getCurHaveGameDay());
        this->getChildByTag(1000)->getChildByTag(1000+GameData::getHaveReceivedNum())->getChildByTag(2000+GameData::getHaveReceivedNum())->setVisible(true);
        sign_btn->setEnabled(false);




        log("领取第:%d天",GameData::getCurHaveGameDay());
        switch (GameData::getCurHaveGameDay()) {
            case 1:
                GameData::setExtraButtleNum(GameData::getExtraButtleNum()+10);
                break;
            case 2:
//GameData::setExtraButtleNum(GameData::getExtraButtleNum() + 12);
                break;
            case 3:
//GameData::setExtraButtleNum(GameData::getExtraButtleNum() + 12);
                break;
            case 4:
//GameData::setExtraButtleNum(GameData::getExtraButtleNum() + 12);
                break;
            case 5:
//GameData::setExtraButtleNum(GameData::getExtraButtleNum() + 12);
                break;
            case 6:
//GameData::setExtraButtleNum(GameData::getExtraButtleNum() + 12);
                break;
            case 7:
                //GameData::setIsBuyJujiHero(true);
                break;
            default:
                break;
        }
        //点击签到,延时一秒关闭签到界面
        this->runAction(Sequence::create(DelayTime::create(1),CallFuncN::create([&](Ref*obj){
            ModalLayer::outplay(this);
        }), NULL));
    }), NULL));

}


总结一下,主要是要做当前日期年月日和明天日期年月日的判断处理,其他的都是在这个判断后做的操作。

   









你可能感兴趣的:(每日签到)