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,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

猜你在找的Cocos2d-x相关文章