在 Cocos2DX 中移动动画精灵和路径

moving animated sprite along with a path in cocos2dx

本文关键字:精灵 路径 动画 移动 Cocos2DX      更新时间:2023-10-16

我想移动一个动画精灵和一个路径(我的意思是std::vector <cocos2d::P> 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。停止动画如下

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