cocos2d-x 3.2 椭圆运动

来源:互联网 发布:linux网络编程开源项目 编辑:程序博客网 时间:2024/04/30 01:51


直接上代码:

////  OvalAction.h//  LSWGameIOS////  Created by lsw on 14-10-27.////#ifndef __LSWGameIOS__OvalAction__#define __LSWGameIOS__OvalAction__#include "cocos2d.h"typedef struct OvalConfig {    cocos2d::Vec2 centerPos;    float a;    float b;    bool moveClockDir;    std::pair<int, int> zOrder;}LOvalConfig;class MoveOvalBy : public cocos2d::ActionInterval {public:    MoveOvalBy();    ~MoveOvalBy();        bool initWithDuration(float dt, const OvalConfig& c);    virtual MoveOvalBy* clone() const override;    virtual MoveOvalBy* reverse() const override;    virtual void update(float dt);    virtual void startWithTarget(cocos2d::Node *target) override;        static MoveOvalBy* create(float dt, const OvalConfig& c);    protected:    OvalConfig _config;        inline float getPosXAtOval(float dt) {        if (_config.moveClockDir) {            return _config.a * cos(4 * MATH_PIOVER2 * dt);        }        return _config.a * cos(4 * MATH_PIOVER2 * (1 - dt));    }        inline float getPosYAtOval(float dt) {        if (_config.moveClockDir) {            return _config.b * sin(4 * MATH_PIOVER2 * dt);        }        return _config.b * sin(4 * MATH_PIOVER2 * (1 - dt));    }        };#endif /* defined(__LSWGameIOS__OvalAction__) */


cpp文件:

////  OvalAction.cpp//  LSWGameIOS////  Created by lsw on 14-10-27.////#include "OvalAction.h"USING_NS_CC;MoveOvalBy::MoveOvalBy(){    }MoveOvalBy::~MoveOvalBy(){    }MoveOvalBy *MoveOvalBy::create(float dt, const OvalConfig &c){    auto moveOvalBy = new MoveOvalBy();    if (moveOvalBy && moveOvalBy->initWithDuration(dt, c))    {        moveOvalBy->autorelease();        return moveOvalBy;    }        return nullptr;}bool MoveOvalBy::initWithDuration(float dt, const OvalConfig &c){    if (ActionInterval::initWithDuration(dt))    {        _config = c;        return true;    }        return false;}void MoveOvalBy::update(float dt){    if (_target)    {        float x = getPosXAtOval(dt);        float y = getPosYAtOval(dt);        _target->setPosition(_config.centerPos + Vec2(x, y));        if (dt <= 0.5)        {            _target->setZOrder(_config.zOrder.first);        }        else        {            _target->setZOrder(_config.zOrder.second);        }    }}MoveOvalBy *MoveOvalBy::clone() const{    auto moveOvalBy = new MoveOvalBy();    if (moveOvalBy && moveOvalBy->initWithDuration(_duration, _config))    {        moveOvalBy->autorelease();        return moveOvalBy;    }        return nullptr;}MoveOvalBy *MoveOvalBy::reverse() const{    OvalConfig newConfig;    newConfig.a = _config.a;    newConfig.b = _config.b;    newConfig.centerPos = _config.centerPos;    newConfig.moveClockDir = !_config.moveClockDir;    newConfig.zOrder = _config.zOrder;    return MoveOvalBy::create(_duration, newConfig);}void MoveOvalBy::startWithTarget(Node *target){    ActionInterval::startWithTarget(target);}


调用方法:

auto s1 = Sprite::create("CloseSelected.png");    addChild(s1);    s1->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2));    auto s2 = Sprite::create("CloseNormal.png");    addChild(s2);    OvalConfig c;    c.a = 100;    c.b = 10;    c.centerPos = s1->getPosition();    c.moveClockDir = false;    c.zOrder.first = -1;    c.zOrder.second = 1;    s2->runAction(RepeatForever::create(MoveOvalBy::create(1.0f, c)));








0 0
原创粉丝点击