- /*
- 圆弧动作类
- */
- class CCArcBy : public cocos2d::CCActionInterval
- {
- public:
- //初始化圆弧动作类
- //duration: 动作类的持续时间
- //ptCenter: 圆弧的中心点
- //deltaAngle: 弧度的变化量,用正负来表示逆时针或顺时针方向
- bool initWithDuration(float duration, const cocos2d::CCPoint& ptCenter, float deltaAngle);
- virtual CCObject* copyWithZone(cocos2d::CCZone* pZone);
- virtual void startWithTarget(cocos2d::CCNode *pTarget);
- virtual CCActionInterval* reverse(void);
- virtual void update(float time);
- public:
- static CCArcBy* create(float duration, const cocos2d::CCPoint& ptCenter, float deltaAngle);
- protected:
- cocos2d::CCPoint m_startPosition;
- cocos2d::CCPoint m_previousPosition;
- cocos2d::CCPoint m_ptCenter;
- float m_fAngleDelta;
- };
/*
圆弧动作类
*/
class CCArcBy : public cocos2d::CCActionInterval
{
public:
//初始化圆弧动作类
//duration: 动作类的持续时间
//ptCenter: 圆弧的中心点
//deltaAngle: 弧度的变化量,用正负来表示逆时针或顺时针方向
bool initWithDuration(float duration, const cocos2d::CCPoint& ptCenter, float deltaAngle);
virtual CCObject* copyWithZone(cocos2d::CCZone* pZone);
virtual void startWithTarget(cocos2d::CCNode *pTarget);
virtual CCActionInterval* reverse(void);
virtual void update(float time);
public:
static CCArcBy* create(float duration, const cocos2d::CCPoint& ptCenter, float deltaAngle);
protected:
cocos2d::CCPoint m_startPosition;
cocos2d::CCPoint m_previousPosition;
cocos2d::CCPoint m_ptCenter;
float m_fAngleDelta;
};
实现文件:
- CCArcBy* CCArcBy::create(float duration, const CCPoint& ptCenter, float deltaAngle)
- {
- CCArcBy* pRet= new CCArcBy();
- pRet->initWithDuration(duration, ptCenter, deltaAngle);
- pRet->autorelease();
- return pRet;
- }
- bool CCArcBy::initWithDuration(float duration, const CCPoint& ptCenter, float deltaAngle)
- {
- if(CCActionInterval::initWithDuration(duration))
- {
- m_ptCenter= ptCenter;
- m_fAngleDelta= deltaAngle;
- return true;
- }
- return false;
- }
- CCObject* CCArcBy::copyWithZone(CCZone* pZone)
- {
- CCZone* pNewZone = NULL;
- CCArcBy* pCopy = NULL;
- if(pZone && pZone->m_pCopyObject)
- {
- //in case of being called at sub class
- pCopy = (CCArcBy*)(pZone->m_pCopyObject);
- }
- else
- {
- pCopy = new CCArcBy();
- pZone = pNewZone = new CCZone(pCopy);
- }
- CCActionInterval::copyWithZone(pZone);
- pCopy->initWithDuration(m_fDuration, m_ptCenter, m_fAngleDelta);
- CC_SAFE_DELETE(pNewZone);
- return pCopy;
- }
- void CCArcBy::startWithTarget(CCNode *pTarget)
- {
- CCActionInterval::startWithTarget(pTarget);
- m_previousPosition = m_startPosition = pTarget->getPosition();
- }
- CCActionInterval* CCArcBy::reverse()
- {
- return CCArcBy::create(m_fDuration, m_ptCenter, -m_fAngleDelta);
- }
- void CCArcBy::update(float time)
- {
- CCLog("%f", time);
- if(m_pTarget)
- {
- #if CC_ENABLE_STACKABLE_ACTIONS
- CCPoint currentPos = m_pTarget->getPosition();
- CCPoint diff = ccpSub(currentPos, m_previousPosition);
- m_startPosition = ccpAdd( m_startPosition, diff);
- CCPoint newPos = m_ptCenter + ccpRotateByAngle(m_startPosition-m_ptCenter, CCPointZero, m_fAngleDelta*time);
- m_pTarget->setPosition(newPos);
- m_pTarget->setRotation(-CC_RADIANS_TO_DEGREES(m_fAngleDelta*time));
- m_previousPosition = newPos;
- #else
- m_pTarget->setPosition(m_ptCenter + ccpRotateByAngle(m_startPosition-m_ptCenter, CCPointZero, m_fAngleDelta*time));
- #endif // CC_ENABLE_STACKABLE_ACTIONS
- }
- }