纪录下自己写的东西!
头文件:
/*
圆弧动作类
*/
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
}
}