mirror of https://github.com/axmolengine/axmol.git
Merge pull request #7558 from newnon/v3_actions_by_tag_improvements
stopAllActionsByTag && removeAllActionsByTag
This commit is contained in:
commit
681c3c06f1
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue