ToyClipToAction.cpp 1.99 KB
//
//  ToyClipToAction.cpp
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 24.06.2017.
//
//

#include <stdio.h>
#include "ToyClipToAction.h"

ClipTo* ClipTo::create(float duration, const cocos2d::Rect& newRect)
{
    ClipTo *ret = new (std::nothrow) ClipTo();
    
    if (ret && ret->initWithDuration(duration, newRect))
    {
        ret->autorelease();
        return ret;
    }
    
    delete ret;
    return nullptr;
}

bool ClipTo::initWithDuration(float duration, const cocos2d::Rect& newRect)
{
    bool ret = false;
    
    if (ActionInterval::initWithDuration(duration))
    {
        _toRect = newRect;
        ret = true;
    }
    
    return ret;
}

ClipTo* ClipTo::clone() const
{
    // no copy constructor
    return ClipTo::create(_duration, _toRect);
}

void ClipTo::startWithTarget(cocos2d::Node *target)
{
    ActionInterval::startWithTarget(target);
    auto targetSprite = dynamic_cast<cocos2d::Sprite*>(target);
    if(targetSprite){
        _startRect = targetSprite->getTextureRect();
        _deltaX = _toRect.origin.x - _startRect.origin.x;
        _deltaY = _toRect.origin.y - _startRect.origin.y;
        _deltaW = _toRect.size.width - _startRect.size.width;
        _deltaH = _toRect.size.height - _startRect.size.height;
    }
}

ClipTo* ClipTo::reverse() const
{
    CCASSERT(false, "reverse() not supported in ClipTo");
    return nullptr;
}

void ClipTo::update(float t)
{
    if (_target)
    {
        auto targetSprite = dynamic_cast<cocos2d::Sprite*>(_target);
        if(targetSprite){
            
            auto dx = _deltaX*t;
            auto dy = _deltaY*t;
            auto dw = _deltaW*t;
            auto dh = _deltaH*t;
            cocos2d::Rect newRect = cocos2d::Rect(MAX(_startRect.origin.x + dx,0), MAX(_startRect.origin.y + dy,0), MAX(_startRect.size.width + dw,0), MAX(_startRect.size.height + dh,0));
            targetSprite->setTextureRect(newRect);
            
            targetSprite->setContentSize(newRect.size);
            
        }
    }
}