Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26911
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 72
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-22 14:28
文章分类
文章存档

2013年(5)

我的朋友

分类: C/C++

2013-05-28 12:08:59

本人系原创,欢迎转载,转载时请附带原创地址.谢谢!

通过研究cocos2d-x的源代码是学习cocos2d-x的最好方式.下面我们来研究下ClickAndMoveTest这个实例。


这个实例一眼看上去没有什么用,可能很多人忽略而过。
但是代码里面却有一个不容忽视的地方。就是如果正确的旋转精灵

点击(此处)折叠或打开

  1. void MainLayer::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
  2. {
  3.     CCSetIterator it = pTouches->begin();
  4.     CCTouch* touch = (CCTouch*)(*it);
  5.     
  6.     CCPoint location = touch->getLocation();

  7.     CCNode* s = getChildByTag(kTagSprite);
  8.     s->stopAllActions();
  9.     s->runAction( CCMoveTo::create(1, ccp(location.x, location.y) ) );
  10.     float o = location.x - s->getPosition().x;
  11.     float a = location.y - s->getPosition().y;
  12.    float at = (float) CC_RADIANS_TO_DEGREES( atanf( a/o) );
  13.   // float at = (float) CC_RADIANS_TO_DEGREES(atan2f(a,o));
  14.     if( a < 0 )
  15.     {
  16.         if( o < 0 )
  17.             at = 180 + fabs(at);
  18.         else
  19.             at = 180 - fabs(at);
  20.     }
  21.     
  22.     s->runAction( CCRotateTo::create(1, at) );
  23. }
这个实例中其他代码都没有什么好研究的。主要是在 ccTouchesEnded中。这里源代码作者中向我们展示了如何正确的旋转精灵。
核心代码在下面:

点击(此处)折叠或打开

  1. float at = (float) CC_RADIANS_TO_DEGREES( atanf( a/o) );
  2.   // 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) |
0

上一篇:没有了

下一篇:cocos2d-x 中添加键盘相应

给主人留下些什么吧!~~