new actions ResizeBy and ResizeTo (#16275)

* new actions ResizeBy and ResizeTo

* FDP-5580-ResizeBy and ResizeTo fix and Test cpp : added a scale exemple in the test cpp to compare with our new resize + fix

* FDP-5580: actions ResizeBy and ResizeTo : changed some functions visibility
This commit is contained in:
charlesstlaurent 2016-08-16 04:55:31 -04:00 committed by minggo
parent dcea1b65ae
commit b1a64ae730
4 changed files with 284 additions and 0 deletions

View File

@ -1460,6 +1460,129 @@ SkewBy* SkewBy::reverse() const
return SkewBy::create(_duration, -_skewX, -_skewY);
}
ResizeTo* ResizeTo::create(float duration, const cocos2d::Size& final_size)
{
ResizeTo *ret = new (std::nothrow) ResizeTo();
if (ret)
{
if (ret->initWithDuration(duration, final_size))
{
ret->autorelease();
}
else
{
delete ret;
ret = nullptr;
}
}
return ret;
}
ResizeTo* ResizeTo::clone(void) const
{
// no copy constructor
ResizeTo* a = new (std::nothrow) ResizeTo();
a->initWithDuration(_duration, _finalSize);
a->autorelease();
return a;
}
void ResizeTo::startWithTarget(cocos2d::Node* target)
{
ActionInterval::startWithTarget(target);
_initialSize = target->getContentSize();
_sizeDelta = _finalSize - _initialSize;
}
void ResizeTo::update(float time)
{
if (_target)
{
auto new_size = _initialSize + (_sizeDelta * time);
_target->setContentSize(new_size);
}
}
bool ResizeTo::initWithDuration(float duration, const cocos2d::Size& final_size)
{
if (cocos2d::ActionInterval::initWithDuration(duration))
{
_finalSize = final_size;
return true;
}
return false;
}
//
// ResizeBy
//
ResizeBy* ResizeBy::create(float duration, const cocos2d::Size& deltaSize)
{
ResizeBy *ret = new (std::nothrow) ResizeBy();
if (ret)
{
if (ret->initWithDuration(duration, deltaSize))
{
ret->autorelease();
}
else
{
delete ret;
ret = nullptr;
}
}
return ret;
}
ResizeBy* ResizeBy::clone() const
{
// no copy constructor
auto a = new (std::nothrow) ResizeBy();
a->initWithDuration(_duration, _sizeDelta);
a->autorelease();
return a;
}
void ResizeBy::startWithTarget(Node *target)
{
ActionInterval::startWithTarget(target);
_previousSize = _startSize = target->getContentSize();
}
ResizeBy* ResizeBy::reverse() const
{
cocos2d::Size newSize(-_sizeDelta.width, -_sizeDelta.height);
return ResizeBy::create(_duration, newSize);
}
void ResizeBy::update(float t)
{
if (_target)
{
_target->setContentSize(_startSize + (_sizeDelta * t));
}
}
bool ResizeBy::initWithDuration(float duration, const cocos2d::Size& deltaSize)
{
bool ret = false;
if (ActionInterval::initWithDuration(duration))
{
_sizeDelta = deltaSize;
ret = true;
}
return ret;
}
//
// JumpBy
//

View File

@ -768,6 +768,92 @@ private:
CC_DISALLOW_COPY_AND_ASSIGN(SkewBy);
};
/** @class ResizeTo
* @brief Resize a Node object to the final size by modifying it's Size attribute.
*/
class CC_DLL ResizeTo : public ActionInterval
{
public:
/**
* Creates the action.
* @brief Resize a Node object to the final size by modifying it's Size attribute. Works on all nodes where setContentSize is effective. But it's mostly useful for nodes where 9-slice is enabled
* @param duration Duration time, in seconds.
* @param final_size The target size to reach
* @return An autoreleased RotateTo object.
*/
static ResizeTo* create(float duration, const cocos2d::Size& final_size);
//
// Overrides
//
virtual ResizeTo* clone() const override;
void startWithTarget(cocos2d::Node* target) override;
void update(float time) override;
CC_CONSTRUCTOR_ACCESS:
ResizeTo() {}
virtual ~ResizeTo() {}
/**
* initializes the action
* @param duration in seconds
* @param final_size in Size type
*/
bool initWithDuration(float duration, const cocos2d::Size& final_size);
protected:
cocos2d::Size _initialSize;
cocos2d::Size _finalSize;
cocos2d::Size _sizeDelta;
private:
CC_DISALLOW_COPY_AND_ASSIGN(ResizeTo);
};
/** @class ResizeBy
* @brief Resize a Node object by a Size. Works on all nodes where setContentSize is effective. But it's mostly useful for nodes where 9-slice is enabled
*/
class CC_DLL ResizeBy : public ActionInterval
{
public:
/**
* Creates the action.
*
* @param duration Duration time, in seconds.
* @param deltaSize The delta size.
* @return An autoreleased ResizeBy object.
*/
static ResizeBy* create(float duration, const cocos2d::Size& deltaSize);
//
// Overrides
//
virtual ResizeBy* clone() const override;
virtual ResizeBy* reverse(void) const override;
virtual void startWithTarget(Node *target) override;
/**
* @param time in seconds
*/
virtual void update(float time) override;
CC_CONSTRUCTOR_ACCESS:
ResizeBy() {}
virtual ~ResizeBy() {}
/** initializes the action */
bool initWithDuration(float duration, const cocos2d::Size& deltaSize);
protected:
cocos2d::Size _sizeDelta;
cocos2d::Size _startSize;
cocos2d::Size _previousSize;
private:
CC_DISALLOW_COPY_AND_ASSIGN(ResizeBy);
};
/** @class JumpBy
* @brief Moves a Node object simulating a parabolic jump movement by modifying it's position attribute.
*/

View File

@ -26,12 +26,14 @@
#include "ActionsTest.h"
#include "../testResource.h"
#include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "renderer/CCRenderer.h"
#include "renderer/CCCustomCommand.h"
#include "renderer/CCGroupCommand.h"
USING_NS_CC;
using namespace cocos2d::ui;
ActionsTests::ActionsTests()
{
@ -79,6 +81,7 @@ ActionsTests::ActionsTests()
ADD_TEST_CASE(ActionCardinalSplineStacked);
ADD_TEST_CASE(ActionCatmullRomStacked);
ADD_TEST_CASE(PauseResumeActions);
ADD_TEST_CASE(ActionResize);
ADD_TEST_CASE(Issue1305);
ADD_TEST_CASE(Issue1305_2);
ADD_TEST_CASE(Issue1288);
@ -2201,6 +2204,69 @@ std::string PauseResumeActions::subtitle() const
return "All actions pause at 3s and resume at 5s";
}
//------------------------------------------------------------------
//
// ActionResize
// Works on all nodes where setContentSize is effective.
// But it's mostly useful for nodes where 9-slice is enabled
//
//------------------------------------------------------------------
void ActionResize::onEnter()
{
ActionsDemo::onEnter();
_grossini->setVisible(false);
_tamara->setVisible(false);
_kathia->setVisible(false);
Size widgetSize = getContentSize();
Text* alert = Text::create("ImageView Content ResizeTo ResizeBy action. \nTop: ResizeTo/ResizeBy on a 9-slice ImageView \nBottom: ScaleTo/ScaleBy on a 9-slice ImageView (for comparison)", "fonts/Marker Felt.ttf", 14);
alert->setColor(Color3B(159, 168, 176));
alert->setPosition(Vec2(widgetSize.width / 2.0f,
widgetSize.height / 2.0f - alert->getContentSize().height * 1.125f));
addChild(alert);
// Create the imageview
Vec2 offset(0.0f, 50.0f);
ImageView* imageViewResize = ImageView::create("cocosui/buttonHighlighted.png");
imageViewResize->setScale9Enabled(true);
imageViewResize->setContentSize(Size(50, 40));
imageViewResize->setPosition(Vec2((widgetSize.width / 2.0f) + offset.x,
(widgetSize.height / 2.0f) + offset.y));
auto resizeDown = cocos2d::ResizeTo::create(2.8f, Size(50, 40));
auto resizeUp = cocos2d::ResizeTo::create(2.8f, Size(300, 40));
auto resizeByDown = cocos2d::ResizeBy::create(1.8f, Size(0, -30));
auto resizeByUp = cocos2d::ResizeBy::create(1.8f, Size(0, 30));
addChild(imageViewResize);
auto rep = RepeatForever::create(Sequence::create(resizeUp, resizeDown, resizeByDown, resizeByUp, nullptr));
imageViewResize->runAction(rep);
// Create another imageview that scale to see the difference
ImageView* imageViewScale = ImageView::create("cocosui/buttonHighlighted.png");
imageViewScale->setScale9Enabled(true);
imageViewScale->setContentSize(Size(50, 40));
imageViewScale->setPosition(Vec2(widgetSize.width / 2.0f,
widgetSize.height / 2.0f));
auto scaleDownScale = cocos2d::ScaleTo::create(2.8f, 1.0f);
auto scaleUpScale = cocos2d::ScaleTo::create(2.8f, 6.0f, 1.0f);
auto scaleByDownScale = cocos2d::ScaleBy::create(1.8f, 1.0f, 0.25f);
auto scaleByUpScale = cocos2d::ScaleBy::create(1.8f, 1.0f, 4.0f);
addChild(imageViewScale);
auto rep2 = RepeatForever::create(Sequence::create(scaleUpScale, scaleDownScale, scaleByDownScale, scaleByUpScale, nullptr));
imageViewScale->runAction(rep2);
}
std::string ActionResize::subtitle() const
{
return "ResizeTo / ResizeBy";
}
//------------------------------------------------------------------
//
// ActionRemoveSelf

View File

@ -578,6 +578,15 @@ private:
cocos2d::Vector<Node*> _pausedTargets;
};
class ActionResize : public ActionsDemo
{
public:
CREATE_FUNC(ActionResize);
virtual void onEnter() override;
virtual std::string subtitle() const override;
};
class ActionFloatTest : public ActionsDemo
{
public: