2013年6月19日水曜日

【cocos2d-x】アプリがバックグラウンドから復帰した時にSceneのメソッドを呼ぶ。

アプリがバックグラウンドから復帰した時などに現在のシーンにアクセスする方法です。 時間をとって画面を変化させたいときなどに使えます。
viewDidAppearとかviewWillAppearみたいなのが無さそうなので。(あったら教えて下さい)
HelloWorldSceneのhogeメソッドを読んでいます。

AppDelegate.cpp
void AppDelegate::applicationWillEnterForeground()
{
    CCDirector::sharedDirector()->startAnimation();
    SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
    SimpleAudioEngine::sharedEngine()->resumeAllEffects();

     // getRunningSceneでCCSceneをとってその上のレイヤーにアクセスする。
    CCLayer *sceneLayer = (CCLayer*)CCDirector::sharedDirector()->getRunningScene()->getChildren()->lastObject();
    if (typeid(*sceneLayer) == typeid(HelloWorld)) {
        HelloWorld *helloWold = (HelloWorld*)sceneLayer;
        helloWold->hoge();
    }
} 
getRunningSceneでそのままアクセスできると思ってしばらくハマってました。
sceneメソッド見て納得。

2013年6月5日水曜日

【cocos2d-x】前回の時間から"日付上"1日以上経過してるかチェックする。

0時更新のログインボーナスなどで使う感じ。 なんか便利な関数とかあるかも。

bool HogeScene::init() {
    if (!CCLayer::init()) {
        return false;
    }
    // 前回の時間をとる
    time_t previousTime = (time_t)CCUserDefault::sharedUserDefault()->getIntegerForKey("previousTime", 0);
    
    if (isOneDayCourse(previousTime)) {
        // 一日経過してたなら現在時刻をセット(初回時も)
        CCUserDefault::sharedUserDefault()->setIntegerForKey("previousTime", (int)time(NULL));
    }
    
    return true;
}
bool HogeScene::isOneDayCourse(time_t time)
{
    // 現在の日付
    struct tm *nowDate;
    time_t now;
    time(&now);
    nowDate = localtime(&now);
    int nowDay = nowDate->tm_mday;
    int nowMon = nowDate->tm_mon;
    int nowYear = nowDate->tm_year;
    // 前回の日付
    struct tm *previousDate;
    time_t previousTime = time;
    previousDate = localtime(&previousTime);
    int previousDay = previousDate->tm_mday;
    int previousMon = previousDate->tm_mon;
    int previousYear = previousDate->tm_year;
    // 差分
    int diffDay = nowDay - previousDay;
    int diffMon = nowMon - previousMon;
    int diffYear = nowYear - previousYear;
    
    // 日付上一日以上経過でtrue
    if (diffDay || diffMon || diffYear) {
        return true;
    }
    return false;
}