加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d-x 3.2 椭圆运动

发布时间:2020-12-14 19:14:48 所属栏目:百科 来源:网络整理
导读:直接上代码: //// 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; b


直接上代码:

//
//  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)));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读