web-dev-qa-db-fra.com

Pourquoi une animation ne bascule-t-elle pas horizontalement lorsque j'appelle setFlipped (true)?

J'ai quelques sprites, où le personnage du joueur est tourné à droite. Je peux très bien créer une animation à partir de ces sprites. Le problème est, si je veux que les sprites fassent face à la gauche.

Je fais ce qui suit:

Sprite* p = Sprite::createWithSpriteFrameName("Jumping");
p->setPosition(Vec2(_visibleSize.width/2,_visibleSize.height/2));
this->addChild(p);
p->setFlippedX(true);
Vector<AnimationFrame*> animFrames;
float frameRate = 0.32f;
std::vector<std::string> frameNames = {"Running 0","Running 1","Running 2"};

for (int i =0; i<3;i++){
    auto frameName = frameNames.at(i);
    auto spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frameName);
    ValueMap userInfo;
    userInfo["frame_index"] = Value(i);
    auto animFrame = AnimationFrame::create(spriteFrame, frameRate, userInfo);
    animFrames.pushBack(animFrame);
}

auto animation = Animation::create(animFrames, frameRate);
auto animationAction = Animate::create(animation);
p->runAction(RepeatForever::create(animationAction));
p->setFlippedX(true);

L'animation s'exécute, mais l'animation montre toujours le joueur tourné vers la droite. Quel est le problème? Pourquoi setFlippedX ne fonctionne-t-il pas dans ce cas?

J'utilise Cocos2d-x 3.13.1. Je ne trouve aucun bug, donc je suppose que je fais quelque chose de mal.

18
Kaizer Sozay

Cela semble être un bug, et il ne semble pas y avoir de moyen de contourner le problème, à moins d’utiliser deux ensembles de Sprite - un pour tous les sprites sans basculement et l’autre pour le basculement des sprites.

Ce qui aggrave le problème - cela signifie que vous ne pouvez pas utiliser le code d'animation si vous souhaitez effectuer un retournement, mais que vous devez implémenter votre propre logique, utiliser le jeu approprié d'images-objets, d'animations, etc.

EDIT: Il semble être corrigé en 3.16

5
Kaizer Sozay

C'est parce que vous appelez cela deux fois sur votre code,

p->setFlippedX(true);
0
Truth