这个运动简单地实现了一下,可以凑合用,但是并没有实现动作的clone与reverse,先留一个坑,免得忘记了,以后抽时间完善。。。。。。。
.h文件。。。
class CircleMoveAction : public cocos2d::ActionInterval
{
public:
bool initWithDuration(float duration, const cocos2d::Point& center,float radius, float angle, float moveTimes);
//
// Overrides
//
virtual CircleMoveAction* clone() const override;
virtual CircleMoveAction* reverse() const override;
virtual void startWithTarget(cocos2d::Node *target) override;
virtual void update(float dt) override;
public:
static CircleMoveAction* create(float duration, const cocos2d::Point& center,float radius, float angle, float moveTimes);
public:
// CircleMoveAction();
// ~CircleMoveAction();
// void updateCircleCenter(Ref *pSender);
// void unUpdateCircleCenter(Ref *pSender);
private:
// CC_SYNTHESIZE(bool, onTouch, OnTouch);
protected:
cocos2d::Point m_circleCenter; //圆心
float m_circleRadius; //半径
float m_radian; //弧度
float m_angle; //旋转角度
int m_moveTimes; //刷新次数
float m_duration; //运动时间
};
.cpp文件。。。
<pre name="code" class="cpp">//CircleMoveAction::CircleMoveAction()
//{
// __NotificationCenter::getInstance()->addObserver(this, callfuncO_selector(CircleMoveAction::updateCircleCenter), "updateEnemy", NULL);
// __NotificationCenter::getInstance()->addObserver(this, callfuncO_selector(CircleMoveAction::unUpdateCircleCenter), "unUpdateEnemy", NULL);
//}
//
//CircleMoveAction::~CircleMoveAction()
//{
// __NotificationCenter::getInstance()->removeObserver(this, "updateEnemy");
// __NotificationCenter::getInstance()->removeObserver(this, "unUpdateEnemy");
//}
//
//void CircleMoveAction::updateCircleCenter(cocos2d::Ref *pSender)
//{
// setOnTouch(true);
//}
//
//void CircleMoveAction::unUpdateCircleCenter(cocos2d::Ref *pSender)
//{
// setOnTouch(false);
//}
CircleMoveAction* CircleMoveAction::create(float duration, const cocos2d::Point& center,float radius, float angle, float moveTimes)
{
CircleMoveAction *pRet = new CircleMoveAction();
if (pRet && pRet->initWithDuration(duration, center, radius, angle, moveTimes))
{
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return nullptr;
}
bool CircleMoveAction::initWithDuration(float duration, const cocos2d::Point& center,float radius, float angle, float moveTimes)
{
// log(">>>>>>>>%f", duration);
if (CCActionInterval::initWithDuration(duration*2))
{
this->m_circleCenter = center;
this->m_circleRadius = radius;
this->m_duration = duration;
this->m_angle = angle;
this->m_moveTimes = moveTimes;
/************************************************************************/
/* 计算每次update调用时需要转动的弧度 */
/************************************************************************/
this->m_radian = angle / duration * Director::getInstance()->getAnimationInterval() / (180 / M_PI);
// log(">>>>>>>%f", 1.0f/Director::getInstance()->getAnimationInterval());
return true;
}
return false;
}
void CircleMoveAction::startWithTarget(cocos2d::Node *target)
{
CCActionInterval::startWithTarget(target);
// m_initPos = _target->getPosition();
}
CircleMoveAction* CircleMoveAction::clone() const
{
// no copy constructor
// auto circleAct = new CircleMoveAction();
// circleAct->initWithDuration(m_duration, m_circleCenter, m_circleRadius, m_angle);
// circleAct->autorelease();
// return circleAct;
}
CircleMoveAction* CircleMoveAction::reverse() const
{
// return CircleMoveAction::create(m_duration, m_circleCenter, m_circleRadius, -m_angle);
}
void CircleMoveAction::update(float dt)
{
float radian = m_radian*m_moveTimes;
float x = m_circleRadius*sin(radian);
float y = m_circleRadius*cos(radian);
Point newPoint = Point(m_circleCenter.x+x, m_circleCenter.y+y);
_target->setPosition(newPoint);
m_moveTimes++;
}