继承ActionInterval来实现圆周运动

来源:互联网 发布:野猪骑士升级数据 编辑:程序博客网 时间:2024/06/12 01:06

<1>JNCircleBy.h

////  CircleBy.h//  JNTest////  Created by jianan on 15/6/3.////#ifndef __JNTest__CircleBy__#define __JNTest__CircleBy__#include "cocos2d.h"USING_NS_CC;class JNCircleBy : public ActionInterval{public:    static JNCircleBy* create(float duration, Vec2 center, float angleBy = 360.0f, float radius = -1);    virtual void startWithTarget(Node* target) override;    virtual void update(float dt) override;    virtual JNCircleBy* reverse() const;    virtual JNCircleBy* clone() const;CC_CONSTRUCTOR_ACCESS:    JNCircleBy() {};    virtual ~JNCircleBy() {}private:    Vec2 getPosInCircleByAngle(float angle);                  //根据旋转角度得到点在圆上的位置    CC_SYNTHESIZE(float, _fRadius, Radius);                   //半径    CC_SYNTHESIZE(Vec2, _ptCenter, Center);                   //圆心    CC_SYNTHESIZE(float, _fStartAngle, StartAngle);           //初始角度    CC_SYNTHESIZE(float, _fAngleBy, AngleBy);                 //要旋转的角度private:    CC_DISALLOW_COPY_AND_ASSIGN(JNCircleBy);    };#endif /* defined(__JNTest__CircleBy__) */

<2>JNCircleBy.cpp

////  CircleBy.cpp//  JNTest////  Created by jianan on 15/6/3.////#include "CircleBy.h"JNCircleBy* JNCircleBy::create(float duration, Vec2 center, float angleBy, float radius){    JNCircleBy* circle = new JNCircleBy();    if(!circle){        return NULL;    }    circle->initWithDuration(duration);    circle->_fStartAngle = 0.0f,    circle->_fAngleBy = 0.0f;    circle->_ptCenter = center;    circle->_fRadius = radius;    circle->_fAngleBy = angleBy;    circle->autorelease();    return circle;}void JNCircleBy::startWithTarget(Node* target){    ActionInterval::startWithTarget(target);    if(_fRadius == -1){        _fRadius = (target->getPosition() - _ptCenter).length();    }    _fStartAngle = CC_RADIANS_TO_DEGREES( -((target->getPosition() - _ptCenter).getAngle() - M_PI / 2.0) );    target->setPosition(getPosInCircleByAngle(_fStartAngle));}void JNCircleBy::update(float dt){    Node* target = getTarget();    if(!target){        return;    }    target->setPosition(_ptCenter + getPosInCircleByAngle(_fStartAngle + dt * _fAngleBy));}JNCircleBy* JNCircleBy::reverse() const{    return JNCircleBy::create(getDuration(), _ptCenter, -_fAngleBy, _fRadius);}JNCircleBy* JNCircleBy::clone() const{    return JNCircleBy::create(getDuration(), _ptCenter, _fAngleBy, _fRadius);}Vec2 JNCircleBy::getPosInCircleByAngle(float angle){    float rad = CC_DEGREES_TO_RADIANS(angle);    return Vec2(_fRadius * sin(rad), _fRadius * cos(rad));}
<3>使用

void HelloWorld::Main(float dt){        //    Sprite* sp = Sprite::create("CloseNormal.png");    sp->setPosition(Vec2(winSize.width/3, winSize.height/3));    this->addChild(sp);        //以屏幕中心为原点做圆周运动    JNCircleBy* circle = JNCircleBy::create(2.0f, Vec2(winSize.width/2, winSize.height/2), -360.0f);    sp->runAction(RepeatForever::create(circle));    }




0 0