展会信息港展会大全

cocos2d-x实现node圆弧运动 (附源代码)
来源:互联网   发布日期:2015-09-27 15:29:35   浏览:3014次  

导读: 纪录下自己写的东西! 头文件: /* 圆弧动作类 */ class CCArcBy : public cocos2d::CCActionInterval { public: //...

纪录下自己写的东西!

头文件:

/*

圆弧动作类

*/

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;

floatm_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

}

}

赞助本站

人工智能实验室
相关内容
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港