Я хочу переместить анимационный спрайт вместе с путем (я имею в виду std :: vector <cocos2d :: Point> st).
это мой код.
std::vector<cocos2d::Point> st;
Vector< FiniteTimeAction * > fta;
.......
while (!st.empty()) {
auto des = st.back();
auto moveAction = MoveTo::create(des.distance(currentPos) / 34, des);
...
auto aniForever = RepeatForever::create(moveAnimation);
auto seq = Sequence::create(moveAction, CallFunc::create(CC_CALLBACK_0(Barbarian::stopAnimation, this, aniForever)), NULL);
auto spw = Spawn::create(aniForever, seq, NULL);
fta.pushBack(spw);
.....
st.pop_back();
}
auto seq = Sequence::create(fta);
sprite->runAction(seq);
Таким образом, когда moveAction закончен, он вызовет stopAnimation для остановки aniForever. stopAnimation ниже
void CharacterBase::stopAnimation(cocos2d::RepeatForever *ani) {
CCLOG("STOP ANIMATION");
sprite->stopAction(ani); }
но я нашел некоторые проблемы с моим кодом. спрайт движется без анимации.
может кто-нибудь сказать мне, почему и найти решение для меня? Спасибо вам всем
Код не является полным, но кажется, что вы должны отделить действие анимации и действие движения. Они могут работать одновременно. Попробуйте этот псевдокод:
//when you start moving
auto moveAnimation = createMoveAnimation();
sprite->runAction(moveAnimation);//start play move animation now
Vector< FiniteTimeAction * > fta;
while (!st.empty()) {
auto des = st.back();
auto moveAction = MoveTo::create(des.distance(currentPos) / 34, des);
fta.pushBack(moveAction );
st.pop_back();
}
auto endAnimation = CallFunc::create(CC_CALLBACK_0(Barbarian::stopAnimation, this, aniForever)//after movement stop movement animation
fta.pushBack(endAnimation);
//so far, you have created a list of moving actions and a stop animation call at the end
auto seq = Sequence::create(fta);
sprite->runAction(seq);//let the sprite move