贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。
在cocos中,要实现贝塞尔曲线十分简单,因为引擎已经帮我门封装好了。下面就用贝塞尔曲线来做出精灵在固定范围类来回曲线运动的效果
void raise()
{
if (m_status == FLY_RIGHT)
m_status = FLY_LEFT;
else
m_status = FLY_RIGHT;
updateItem();
//运动曲线
//定义贝塞尔曲线
//给贝塞尔曲线所需要的峰值设立随机坐标值
cfg.controlPoint_1 = ccp(CCRANDOM_0_1() * m_offsetH,
CCRANDOM_0_1() * m_offsetV);
cfg.controlPoint_2 = ccp(CCRANDOM_0_1() * m_offsetH,
CCRANDOM_0_1() * m_offsetV);
cfg.endPosition = ccp(m_offsetH, m_offsetV);
//创建贝塞尔曲线运动
BezierBy *raise = BezierBy::create(m_duration, cfg);
//创建回掉函数,可以看作一个运动,当贝塞尔曲线运动执行完毕之后调用
auto callBackFunc = [&]()
{
//调用贝塞尔曲线返回的的函数
fall();
};
auto action2 = CallFunc::create(callBackFunc);
runAction(Sequence::createWithTwoActions(raise, action2));
}
void fall()
{
if (m_status == FLY_RIGHT)
m_status = FLY_LEFT;
else
m_status = FLY_RIGHT;
updateItem();
//运动曲线
ccBezierConfig cfg;
cfg.controlPoint_1 = ccp(-CCRANDOM_0_1() * m_offsetH,
-CCRANDOM_0_1() * m_offsetV);
cfg.controlPoint_2 = ccp(-CCRANDOM_0_1() * m_offsetH,
-CCRANDOM_0_1() * m_offsetV);
cfg.endPosition = ccp(-m_offsetH, -m_offsetV);
BezierBy *fall = BezierBy::create(m_duration, cfg);
auto callBackFunc = [&]()
{
//调用贝塞尔曲线运动的函数
raise();
};
auto action2 = CallFunc::create(callBackFunc);
runAction(Sequence::createWithTwoActions(fall, action2));
}
这样就简单实现了一个精灵在一个固定的范围内做贝塞尔曲线运动了