之前,因为项目需求,需要重写一下贝塞尔曲线,因为贝塞尔曲线在执行时,没有把考虑执行体的角度增加进去,所以为了实现这一需求,现在要将贝塞尔重写一下。通过查看源码,发现BezierTo继承BezierBy,而执行体的位置发生变化,就是发生在BezierBy中update中。
Vec2 currentPos = _target->getPosition();
Vec2 diff = currentPos - _prevIoUsPosition;
_startPosition = _startPosition + diff;
Vec2 newPos = _startPosition + Vec2(x,y);
_target->setPosition(newPos);
_prevIoUsPosition = newPos;
从这段代码看出,currentPos和_prevIoUsPosition是一样的,所以diff是0,_startPosition是执行者最初的位置,(x,y)是相对于初始值的变化,所以针对两帧来说,位置差就是
float dix = newPos.x – currentPos.x;
float diy = newPos.y – currentPos.y;
float fDegree = 0.0f;
float fRadian = atanf(x/y);
fDegree = CC_RADIANS_TO_DEGREES(fRadian);
_target->setRotation(fDegree);
(具体的讲解参见http://www.jb51.cc/article/p-tpgxzhax-bea.html)
当这段代码写完之后,把它放在引擎中的BezierBy中的update方法,当我们在项目中使用贝塞尔曲线的时候,会发现执行者的角度也随之发生改变。然后这并不是我们想要的。所以这里,我就新建了两个文件BezierRBy和BezierRTo。写法上跟原来的一模一样,只不过BezierRBy的update中添加了设置角度的代码,经过编译,用C++代码执行贝塞尔曲线没有问题。然后开始把它绑定到Lua中去,因为我的项目是用Lua代码开发的。现在我是把刚才那两个类写在了< CCActionInterval.h>文件中BezierTo的下边。然后按照教程上说的,在tools/tolua/中打开cocos2dx.ini文件,寻找关于Bezier的内容,
分别写上BezierR.*(仿照写就行),然后执行genbindings.py,它会将涉及到的引擎中的基础代码都执行一遍,执行完之后,会在cocos/scripting/lua-bindings/auto/下生成参见绑定的文件。
然后我们在自己的lua文件中执行我们想要的贝塞尔曲线,会发现报错,原因说是create找不到,后来发现,在cocos/scripting/lua-bindings/manual/cocos2d/ lua_cocos2dx_manual.cpp下,还需要手动写上create方法:
然后在cocos/deprecated/ CCDeprecated.cpp文件中找到关于Bezier中的地方,写入:
之后,再编译我们的项目,就可以看到执行者按照贝塞尔曲线运动,并且角度与切线方向一致。
关于如何自定义类绑定到lua中,以后再进行说明。
原文链接:https://www.f2er.com/cocos2dx/339402.html