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)));
相关新闻>>
- Cocos2dx3.2编写常用UI组件(一)新手指导框GuideLayer
- cocos2dx之彩色编辑输入框的设计
- Cocos2dx3.2编写常用UI组件(三)收集器效果Collector
- cocos2dx 3.2 裁剪节点 ClippingNode
- cocos2dx背景透明处理
- cocos2dx 3.x判断node点击区域是否透明
- cocos2dx的runAction: 重复执行,多个动作连接执行,多个动作同时
- 关于cocos2dx lua中的clone函数的源码解读
- cocos2dx V3.2 mac os Xcode6.1 环境配置
- cocos2dx获取网络时间(二):浅析CCHttpClient
- 发表评论
-
- 最新评论 进入详细评论页>>