我正在尝试为 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);
看起来像这样:
所以当然动画看起来不太好。我想做一个完美的循环(以恒定速度),在哪里看不到结束或开始。
如果我继续添加相同的点,它会很好地循环,直到它到达故障所在的末端,您可以在右上角看到它。
我怎样才能做到这一点?
我想到的唯一一件事是点数太多了,动画刚好一半就开始寻找它或创建一个新点。
最佳答案
我终于做到了。我不得不稍微更改 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/