Merge pull request #7558 from newnon/v3_actions_by_tag_improvements

stopAllActionsByTag && removeAllActionsByTag
This commit is contained in:
minggo 2014-08-28 14:24:37 +08:00
commit 681c3c06f1
6 changed files with 105 additions and 2 deletions

View File

@ -287,6 +287,34 @@ void ActionManager::removeActionByTag(int tag, Node *target)
} }
} }
void ActionManager::removeAllActionsByTag(int tag, Node *target)
{
CCASSERT(tag != Action::INVALID_TAG, "");
CCASSERT(target != nullptr, "");
tHashElement *element = nullptr;
HASH_FIND_PTR(_targets, &target, element);
if (element)
{
auto limit = element->actions->num;
for (int i = 0; i < limit;)
{
Action *action = (Action*)element->actions->arr[i];
if (action->getTag() == (int)tag && action->getOriginalTarget() == target)
{
removeActionAtIndex(i, element);
--limit;
}
else
{
++i;
}
}
}
}
// get // get
// XXX: Passing "const O *" instead of "const O&" because HASH_FIND_IT requries the address of a pointer // XXX: Passing "const O *" instead of "const O&" because HASH_FIND_IT requries the address of a pointer

View File

@ -92,6 +92,9 @@ public:
/** Removes an action given its tag and the target */ /** Removes an action given its tag and the target */
void removeActionByTag(int tag, Node *target); void removeActionByTag(int tag, Node *target);
/** Removes all actions given its tag and the target */
void removeAllActionsByTag(int tag, Node *target);
/** Gets an action given its tag an a target /** Gets an action given its tag an a target
@return the Action the with the given tag @return the Action the with the given tag

View File

@ -1440,6 +1440,12 @@ void Node::stopActionByTag(int tag)
_actionManager->removeActionByTag(tag, this); _actionManager->removeActionByTag(tag, this);
} }
void Node::stopAllActionsByTag(int tag)
{
CCASSERT( tag != Action::INVALID_TAG, "Invalid tag");
_actionManager->removeAllActionsByTag(tag, this);
}
Action * Node::getActionByTag(int tag) Action * Node::getActionByTag(int tag)
{ {
CCASSERT( tag != Action::INVALID_TAG, "Invalid tag"); CCASSERT( tag != Action::INVALID_TAG, "Invalid tag");

View File

@ -1127,6 +1127,13 @@ public:
* @param tag A tag that indicates the action to be removed. * @param tag A tag that indicates the action to be removed.
*/ */
void stopActionByTag(int tag); void stopActionByTag(int tag);
/**
* Removes all actions from the running action list by its tag.
*
* @param tag A tag that indicates the action to be removed.
*/
void stopAllActionsByTag(int tag);
/** /**
* Gets an action from the running action list by its tag. * Gets an action from the running action list by its tag.

View File

@ -15,7 +15,7 @@ Layer* restartActionManagerAction();
static int sceneIdx = -1; static int sceneIdx = -1;
#define MAX_LAYER 5 #define MAX_LAYER 6
Layer* createActionManagerLayer(int nIndex) Layer* createActionManagerLayer(int nIndex)
{ {
@ -25,7 +25,8 @@ Layer* createActionManagerLayer(int nIndex)
case 1: return new LogicTest(); case 1: return new LogicTest();
case 2: return new PauseTest(); case 2: return new PauseTest();
case 3: return new StopActionTest(); case 3: return new StopActionTest();
case 4: return new ResumeTest(); case 4: return new StopAllActionsTest();
case 5: return new ResumeTest();
} }
return nullptr; return nullptr;
@ -267,6 +268,56 @@ std::string StopActionTest::subtitle() const
return "Stop Action Test"; return "Stop Action Test";
} }
//------------------------------------------------------------------
//
// RemoveTest
//
//------------------------------------------------------------------
void StopAllActionsTest::onEnter()
{
ActionManagerTest::onEnter();
auto l = Label::createWithTTF("Should stop scale & move after 4 seconds but keep rotate", "fonts/Thonburi.ttf", 16.0f);
addChild(l);
l->setPosition( Vec2(VisibleRect::center().x, VisibleRect::top().y - 75) );
auto pMove1 = MoveBy::create(2, Vec2(200, 0));
auto pMove2 = MoveBy::create(2, Vec2(-200, 0));
auto pSequenceMove = Sequence::createWithTwoActions(pMove1, pMove2);
auto pRepeatMove = RepeatForever::create(pSequenceMove);
pRepeatMove->setTag(kTagSequence);
auto pScale1 = ScaleBy::create(2, 1.5);
auto pScale2 = ScaleBy::create(2, 1.0/1.5);
auto pSequenceScale = Sequence::createWithTwoActions(pScale1, pScale2);
auto pRepeatScale = RepeatForever::create(pSequenceScale);
pRepeatScale->setTag(kTagSequence);
auto pRotate = RotateBy::create(2, 360);
auto pRepeatRotate = RepeatForever::create(pRotate);
auto pChild = Sprite::create(s_pathGrossini);
pChild->setPosition( VisibleRect::center() );
addChild(pChild, 1, kTagGrossini);
pChild->runAction(pRepeatMove);
pChild->runAction(pRepeatScale);
pChild->runAction(pRepeatRotate);
this->scheduleOnce((SEL_SCHEDULE)&StopAllActionsTest::stopAction, 4);
}
void StopAllActionsTest::stopAction(float time)
{
auto sprite = getChildByTag(kTagGrossini);
sprite->stopAllActionsByTag(kTagSequence);
}
std::string StopAllActionsTest::subtitle() const
{
return "Stop All Action Test";
}
//------------------------------------------------------------------ //------------------------------------------------------------------
// //
// ResumeTest // ResumeTest

View File

@ -54,6 +54,14 @@ public:
void stopAction(); void stopAction();
}; };
class StopAllActionsTest : public ActionManagerTest
{
public:
virtual std::string subtitle() const override;
virtual void onEnter() override;
void stopAction(float time);
};
class ResumeTest : public ActionManagerTest class ResumeTest : public ActionManagerTest
{ {
public: public: