跳转到在 Cocos Studio 中创建的节点中的单个帧

Jumping to a single frame in Node created in Cocos Studio

我有一个名为 "Fruit" 的节点,其中每个水果包含 4 个单帧。它还包含一个阴影,所有水果都应该相同。我正在这样创建这个节点:

    auto newFruit = CSLoader::createNode("Fruit.csb");
    auto fruitAction = CSLoader::createTimeline("Fruit.csb");
    newFruit->runAction(fruitAction);

现在,当我创建这个水果时,我想设置一个随机帧:

    fruitAction->gotoFrameAndPause(r + 1);

r 是从 0 到 3。

然而它不起作用。它根本不会改变框架。当我 运行 调试时,我可以看到正确的帧号。

所以我尝试了不同的解决方案。我制作了 4 个单帧动画,分别命名为 "a1"、"a2"、"a3" 和 "a4".

然后:

    fruitAction->play("a" + to_str(r + 1), false);

现在我变得有时好有时不好。连续给出常数 r 会给我不同的结果。

我找到的唯一解决方案是让所有动画长 2 帧(有 1 个偏移量)所以 "a1": 0->1, "a2": 2->3, "a3":4->5, "a4":6->7,但这太复杂了,不值得使用。而且它有时会在第一帧闪烁一帧或几帧(所以那时看起来很糟糕)。

这是一个错误还是我做错了什么?

深入研究cocos2d-x代码后,似乎比看起来更麻烦。

当前实现有3个问题:

1) 当你不播放你的动画时,它会将播放 属性 设置为 false 所以 ActionTimeline::step 甚至不会先通过 if(检查是否播放)它会从不渲染另一帧。

2) 当您使用 gotoFrameAndPause 时,永远不会设置 _endFrame(默认情况下为 0),因此 setCurrentFrame 将始终失败,因为如果: 如果 (frameIndex >= _startFrame && frameIndex <= _endFrame)

3) 当您使用 "play" 时,_startFrame 和 _endFrame 仅设置在这个特定动画之间,您将无法 "jump" 在其外部构建框架。

我做了一些解决方法并将其放入 3 个宏中:

#define CC_INIT_ACTION(__ACTION__) __ACTION__->gotoFrameAndPlay(0, __ACTION__->getDuration() + 1, 0, false); __ACTION__->pause()
#define CC_JUMP_ACTION_TO_FRAME(__ACTION__, __FRAME__) __ACTION__->setCurrentFrame(__FRAME__); __ACTION__->resume(); __ACTION__->step(0.0001f); __ACTION__->pause()
#define CC_JUMP_ACTION_TO_FRAME_BY_NAME(__ACTION__, __NAME__) int __FRAME__ = __ACTION__->getAnimationInfo(__NAME__).startIndex; CC_JUMP_ACTION_TO_FRAME(__ACTION__, __FRAME__)

CC_INIT_ACTION 可以跳转到每一帧。 CC_JUMP_ACTION_TO_FRAME 跳转到特定的帧号。 CC_JUMP_ACTION_TO_FRAME_BY_NAME 跳转到特定动画的第一帧。

另外CC_JUMP_ACTION_TO_FRAME中的step(0.0001f)也是必须的,因为step有时会计算出当前帧错误(可能是四舍五入的问题,不确定)