本人系原创,欢迎转载,转载时请附带原创地址.谢谢!
通过研究cocos2d-x的源代码是学习cocos2d-x的最好方式.下面我们来研究下ClickAndMoveTest这个实例。
这个实例一眼看上去没有什么用,可能很多人忽略而过。
但是代码里面却有一个不容忽视的地方。就是如果正确的旋转精灵
-
void MainLayer::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
-
{
-
CCSetIterator it = pTouches->begin();
-
CCTouch* touch = (CCTouch*)(*it);
-
-
CCPoint location = touch->getLocation();
-
-
CCNode* s = getChildByTag(kTagSprite);
-
s->stopAllActions();
-
s->runAction( CCMoveTo::create(1, ccp(location.x, location.y) ) );
-
float o = location.x - s->getPosition().x;
-
float a = location.y - s->getPosition().y;
-
float at = (float) CC_RADIANS_TO_DEGREES( atanf( a/o) );
-
// float at = (float) CC_RADIANS_TO_DEGREES(atan2f(a,o));
-
if( a < 0 )
-
{
-
if( o < 0 )
-
at = 180 + fabs(at);
-
else
-
at = 180 - fabs(at);
-
}
-
-
s->runAction( CCRotateTo::create(1, at) );
-
}
这个实例中其他代码都没有什么好研究的。主要是在 ccTouchesEnded中。这里源代码作者中向我们展示了如何正确的旋转精灵。
核心代码在下面:
-
float at = (float) CC_RADIANS_TO_DEGREES( atanf( a/o) );
-
// float at = (float) CC_RADIANS_TO_DEGREES(atan2f(a,o))
先解释下a 和 o这两个参数, 这个实例刚打开的时候一个跳动的精灵出现在屏幕的左边中心位置A。当你点击窗口的右上角位置B。那么这个a=B.y-A.y o=B.x-A.x; 假设还存在一个点C(B.x, A.y),那么ABC刚好就是一个直角三角形.
atanf()函数以一个斜率为参数,求得斜率对应的弧度值.可能大家都忘记了斜率怎么求了。好吧,我解释下:斜率是一条直线的和X正半轴的夹角的正切值(tan).也就是(对边BC)/(领边AC) , 而BC==a ,AC=o,
所以实例代码中用atanf(a/o)求得了前一个点 到 当前点 所形成的一条直线的斜率对应的弧度。然后通过宏CC_RADIANS_TO_DEGREES把弧度转成了精灵需要旋转的角度。
然后直接s
->runAction
( CCRotateTo
::create
(1
, at
) );就OK啦。
关于通过两点求弧度 ,继而求角度的解释见URL:http://baixiaozhe.iteye.com/blog/914154
阅读(2829) | 评论(0) | 转发(0) |