cocos2dx之抽奖界面与获奖概率的设计(一)(3)
接着再来看看从父类继承来的三个函数:startWithTarget、clone、reverse
startWithTarget是用来设置是谁要执行动作,在动作开始前调用;后面两个,一个是动作的拷贝,一个是动作的逆序,因为在父类中是纯虚函数,所以要继承实现。
再来看看函数getPosWithEllipse,这个是利用椭圆的参数方程,获得当前目标所处椭圆上的位置。因为要不停的调用,所以声明为内联函数。
最后看看cpp文件的部分实现代码:
EllipseBy * EllipseBy::clone() const { auto pAction = new EllipseBy(); pAction->initWithDuration(_duration, m_config); pAction->autorelease(); return pAction; } EllipseBy * EllipseBy::reverse() const { EllipseConfig resConfig = m_config; resConfig.isAntiClockwise = !m_config.isAntiClockwise; return EllipseBy::create(_duration, m_config); } void EllipseBy::startWithTarget(Node *target) { ActionInterval::startWithTarget(target); } void EllipseBy::update(float time) { if (_target) { Vec2 curPos = this->getPosWithEllipse(time); float tmpAngle = m_config.selfAngle / 180 * PI; float newX = curPos.x * cos(tmpAngle) + curPos.y * sin(tmpAngle); float newY = curPos.y * cos(tmpAngle) - curPos.x * sin(tmpAngle); _target->setPosition(m_config.cenPos + Vec2(newX,newY)); } }
其中最重要的部分就是update函数啦,getPosWithEllipse获得的坐标curPos是selfAngle为0时的坐标,如果我们设置了椭圆自身的角度,就要调整下curPos的坐标。有以下公式:
如果椭圆自身旋转了β,即selfAngle = β 那么之后的坐标是:newX = xcosβ + ysinβ,newY = ycosβ - xsinβ
这里给大家简单的分析一下公式,先看图:
这里黑色的椭圆是没有设置selfAngle时的样子,当设置selfAngle为β后,就变成蓝色的椭圆。由于两个椭圆的中心都是圆心,所以椭圆上同一位置上的点到圆心的距离以一样,也就是上图中红线和绿线的长度相等,那么利用勾股定理,就是下面:
a^2 + b^2 = x^2 + y^2 = x^2 * 1 + y^2 * 1
因为cos& * cos& + sin& * sin& = 1,所以:
上面公式 = x^2 * (cos(β)^2 + sin(β)^2) + y^2 * (cos(β)^2 + sin(β)^2)
然后分解合并,就可以得到下面的公式啦:
a^2 + b^2 = (xcosβ + ysinβ)^2 + (ycosβ - xsinβ)^2
所以:a = xcosβ + ysinβ,b = ycosβ - xsinβ
最后,我们只需要如下调用,就可以像使用引擎的动作一样:
//椭圆旋转 EllipseConfig config; config.ellipseA = 100; config.ellipseB = 50; config.cenPos = m_turnBg->getPosition(); config.isAntiClockwise = true; config.startAngle = 0; config.selfAngle = 45; m_pElliRtt_1->runAction(RepeatForever::create( EllipseBy::create(2.5,config)));
相关新闻>>
- 发表评论
-
- 最新评论 更多>>
您可能感兴趣的文章
- symbian UI开发小结(一)
- UIViewController的retainCount(Object C)
- 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之
- quick-cocos2d-x教程12:实现文本和密码输入界面
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编
- cocos2d-x在mac下配置安卓开发环境
- 五 手游开发神器 cocos2d-x editor 之贴图(TexturePacker)
- cocos2dx V3.2 mac os Xcode6.1 环境配置
- cocos2d-x-3.0 alpha1与C++11练习三:飞镖忍者,如何移动精灵及
- Cocos2d-x3.0 文件处理