[iuud8]基于cocos2dx3.2自定义圆周运动

这个运动简单地实现了一下,可以凑合用,但是并没有实现动作的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++;
}


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值