首页 > 代码库 > cocos2d-x实现node圆弧运动 (附源代码)
cocos2d-x实现node圆弧运动 (附源代码)
纪录下自己写的东西!
头文件:
/* 圆弧动作类 */ 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 } }
cocos2d-x实现node圆弧运动 (附源代码)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。