c++ - 用基数样条做一个循环

标签 c++ cocos2d-x

我正在尝试为 Sprite 制作动画,它会在路径上运行并且会永远循环。但是 CardinalSpline 并没有像我想的那样关闭。

以下是示例点(它是一个正方形):

pointsRed->addControlPoint(Vec2(350, 350));
pointsRed->addControlPoint(Vec2(350, 150));
pointsRed->addControlPoint(Vec2(150, 150));
pointsRed->addControlPoint(Vec2(150, 350));
pointsRed->addControlPoint(Vec2(350, 350));

动画创作:

auto redSpline = CardinalSplineTo::create(20, pointsRed, 0);

看起来像这样:

enter image description here

所以当然动画看起来不太好。我想做一个完美的循环(以恒定速度),在哪里看不到结束或开始。

如果我继续添加相同的点,它会很好地循环,直到它到达故障所在的末端,您可以在右上角看到它。

我怎样才能做到这一点?

我想到的唯一一件事是点数太多了,动画刚好一半就开始寻找它或创建一个新点。

最佳答案

我终于做到了。我不得不稍微更改 cocos2d-x 代码。

所有需要的改变:

在 startWithTarget 中:

_deltaT = (float) 1 / (_points->count() - 1);

到:

_deltaT = (float) 1 / (_points->count());

重新实现了 getControlPointAtIndex:

来自:

Vec2 PointArray::getControlPointAtIndex(ssize_t index)
{
      index = MIN(static_cast<ssize_t>(_controlPoints->size())-1, MAX(index, 0));  
      return *(_controlPoints->at(index));
}

到:

Vec2 PointArray::getControlPointAtIndex(ssize_t index)
{
    ssize_t tIndex = index;
    ssize_t pSize = static_cast<ssize_t>(_controlPoints->size());
    if(tIndex < 0) tIndex += pSize;
    if(tIndex >= pSize) tIndex -= pSize;    
    return *(_controlPoints->at(tIndex));
}

然后样条插值很好,因为它总是有 4 个不同的点要插值。在第一个和最后一个点被切断之前。

关于c++ - 用基数样条做一个循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33430703/

相关文章:

C++ - 分配一个无符号字符缓冲区,然后用一个字符串填充它

c++ - 如何在 C++ 中使用 libmosquitto 和 SSL/TLS 连接到 mqtt 代理

c++ - union 类型数据成员的初始化

cocos2d-iphone - 旋转接头和轮接头有什么区别

c++ - C/C++ 中 >=、<= 与 <、>、== 操作的复杂性

c++ - 在小部件和主窗口之间连接和传递数据

javascript - 序列结束后切换场景

windows-phone-8 - AdMob Interstitial Cocos2d-x WP8

ios - 静态菜单场景中的 SpriteKit 内存泄漏

audio - cocos2d-x:更改音频播放速率