AniMiscUtils.cpp 6.45 KB
//
//  AniMiscUtils.cpp
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 17.05.2017.
//
//

#include <stdio.h>
#include "AniMiscUtils.h"
#include "AniGeometryUtils.h"
#include "AniAlertView.h"

float AniMiscUtils::StandardAnimationTime = 0.2;
const std::string AniMiscUtils::WHICH_LEVEL_UD_KEY = "WHICH_LEVEL_UD_KEY";
const std::string AniMiscUtils::TOS_ACCEPTED_UD_KEY = "TOS_ACCEPTED_UD_KEY";
const std::string AniMiscUtils::BG_MUSIC_PLAYING_UD_KEY = "BG_MUSIC_PLAYING_UD_KEY";


void AniMiscUtils::saveTOSAccepted(){
    cocos2d::UserDefault::getInstance()->setBoolForKey(TOS_ACCEPTED_UD_KEY.c_str(), true);
    cocos2d::UserDefault::getInstance()->flush();
}

bool AniMiscUtils::wasTOSAccepted(){
    return true;
    return cocos2d::UserDefault::getInstance()->getBoolForKey(TOS_ACCEPTED_UD_KEY.c_str(), false);
}

void AniMiscUtils::saveBgMusicPlaying(bool bgMusicPlaying){
    cocos2d::UserDefault::getInstance()->setBoolForKey(BG_MUSIC_PLAYING_UD_KEY.c_str(), bgMusicPlaying);
    cocos2d::UserDefault::getInstance()->flush();
}

bool AniMiscUtils::shouldBgMusicPlay(){
    return cocos2d::UserDefault::getInstance()->getBoolForKey(BG_MUSIC_PLAYING_UD_KEY.c_str(), true);
}

//void AniMiscUtils::saveLastLevel(Level level){
//    cocos2d::UserDefault::getInstance()->setIntegerForKey(WHICH_LEVEL_UD_KEY.c_str(), (int)level);
//}

void AniMiscUtils::saveLastLevel(int level){
    cocos2d::UserDefault::getInstance()->setIntegerForKey(WHICH_LEVEL_UD_KEY.c_str(), level);
    cocos2d::UserDefault::getInstance()->flush();
}

AniMiscUtils::Level AniMiscUtils::lastLevel(){
    return (Level)cocos2d::UserDefault::getInstance()->getIntegerForKey(WHICH_LEVEL_UD_KEY.c_str(), (int)Level::CHILD);
}

int AniMiscUtils::nextLevel(){
    return MIN((int)lastLevel() + 1, (int)Level::ADULT);
}

static int FadeAnimationTag = 88;
void AniMiscUtils::showView(cocos2d::Node* node, bool animated, float toAlpha){
    if(node != nullptr){
        node->stopActionByTag(FadeAnimationTag);
        node->setVisible(true);
        if(animated){
            auto fadeAction = cocos2d::FadeTo::create(StandardAnimationTime, toAlpha);
            fadeAction->setTag(FadeAnimationTag);
            node->runAction(fadeAction);
        } else {
            node->setOpacity(toAlpha);
        }
    }
}

void AniMiscUtils::hideView(cocos2d::Node* node, bool animated){
    if(node != nullptr){
        node->stopActionByTag(FadeAnimationTag);
        if(animated){
            auto fadeAction = cocos2d::Sequence::create(cocos2d::FadeOut::create(StandardAnimationTime),
                                                      cocos2d::CallFunc::create(std::bind([&](cocos2d::Node* n){
                n->setVisible(false);
            },node)),
                                                        nullptr);
            fadeAction->setTag(FadeAnimationTag);
            node->runAction(fadeAction);
        } else {
            node->setVisible(false);
        }
    }
}

void AniMiscUtils::hideAndRemoveView(cocos2d::Node* node, bool animated){
    if(node != nullptr){
        if(animated){
            node->runAction(cocos2d::Sequence::create(cocos2d::FadeOut::create(StandardAnimationTime),
                                                  cocos2d::CallFunc::create(std::bind([&](cocos2d::Node* n){
                                                    n->removeFromParent();
                                                    },node)),
                                                  nullptr));
        } else {
            node->removeFromParent();
        }
    }
}

cocos2d::Rect AniMiscUtils::getExtendedActiveArea(cocos2d::Node* object, float extendPercentValueX, float extendPercentValueY, ExtendDirectionX extendDirX, ExtendDirectionY extendDirY)
{
    auto ignoreTransoframtions = object->getScale() == 1 && object->getRotation() == 0;
    auto objectBoundingBox = AniGeometryUtils::getBoundingBoxToWorld(object, ignoreTransoframtions);
    
    if(extendPercentValueX == 0 && extendPercentValueY == 0){
        return objectBoundingBox;
    }
    
    auto extendValueX = objectBoundingBox.size.width*extendPercentValueX/100.0;
    auto extendValueY = objectBoundingBox.size.height*extendPercentValueY/100.0;
    
    auto x = objectBoundingBox.origin.x;
    auto y = objectBoundingBox.origin.y;
    auto w = objectBoundingBox.size.width;
    auto h = objectBoundingBox.size.height;
    
    switch(extendDirX){
        case ExtendDirectionX::LEFT:
            x -= extendValueX;
            w += extendValueX;
            break;
        case ExtendDirectionX::RIGHT:
            w += extendValueX;
            break;
        case ExtendDirectionX::BOTH:
            x -= extendValueX/2;
            w += extendValueX;
            break;
    }
    
    switch(extendDirY){
        case ExtendDirectionY::DOWN:
            y -= extendValueY;
            h += extendValueY;
            break;
        case ExtendDirectionY::UP:
            h += extendValueY;
            break;
        case ExtendDirectionY::BOTH:
            y -= extendValueY/2;
            h += extendValueY;
            break;
    }
    
    return cocos2d::Rect(x, y, w, h);
}

bool AniMiscUtils::isNodeVisible(cocos2d::Node* node){
    bool ret = true;
    cocos2d::Node* parent = node;
    while (parent != nullptr) {
        if(!parent->isVisible()){
            ret = false;
            break;
        } else {
            parent = parent->getParent();
        }
    }
    return ret;
}

//without moving the position
void AniMiscUtils::changeAnchorPoint(cocos2d::Node* p_node, cocos2d::Point p_newAnchorPoint){
    auto originalAnchorPoint = p_node->getAnchorPoint();
    p_node->setAnchorPoint(p_newAnchorPoint);
    // when we change the anchor point, we also need to adjust the postion so the sprite stays at the same spot
    auto anchorPointChange = p_node->getAnchorPoint() - originalAnchorPoint;
    p_node->setPositionX(p_node->getPositionX() + anchorPointChange.x*p_node->getBoundingBox().size.width);
    p_node->setPositionY(p_node->getPositionY() + anchorPointChange.y*p_node->getBoundingBox().size.height);
}

std::string AniMiscUtils::boolToString(bool value)
{
    if(value){
        return "true";
    } else {
        return "false";
    }
}

std::string AniMiscUtils::clockMinSecTimeString(int seconds){
    auto mins = (int)floor(seconds/60);
    auto secs = seconds%60;
    std::string timeString = std::to_string(mins) + ":";
    if(secs < 10){
        timeString += "0" + std::to_string(secs);
    } else {
        timeString += std::to_string(secs);
    }
    return timeString;
}