纪录下自己写的东西!
头文件:
/* 圆弧动作类 */ 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,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,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_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,m_fAngleDelta*time)); #endif // CC_ENABLE_STACKABLE_ACTIONS } }原文链接:https://www.f2er.com/cocos2dx/346671.html