返回

掌握Cocos2d-x-Html5,轻松玩转动作系统

前端

技术导读

嗨,大家好,我是思航。

今天,我们通过一个简单的例子,来研究一下Cocos2d-x是动作的执行流程,最后再实现自定义一个动作类。

代码剖析

首先,我们需要创建一个Action类。Action类是动作的基类,它定义了动作的基本属性和方法。在Cocos2d-x-Html5中,Action类有两种子类:FiniteTimeAction和InstantAction。

class Action {
public:
    Action();
    virtual ~Action();

    //更新动作, dt是更新时间
    virtual void update(float dt);

    //停止动作
    virtual void stop();

    //暂停动作
    virtual void pause();

    //恢复动作
    virtual void resume();

    //是否是暂停状态
    virtual bool isPaused() const;

    //动作是否已经完成
    virtual bool isDone() const;

    //获取动作的持续时间
    virtual float getDuration() const;

    //设置动作的持续时间
    virtual void setDuration(float duration);

    //动作的运行速度
    virtual float getSpeed() const;

    //设置动作的运行速度
    virtual void setSpeed(float speed);

    //动作的运行次数
    virtual int getRepeatCount() const;

    //设置动作的运行次数
    virtual void setRepeatCount(int count);

    //动作的运行总次数
    virtual int getTotalRepeatCount() const;

    //设置动作的运行总次数
    virtual void setTotalRepeatCount(int count);

    //动作的当前运行次数
    virtual int getCurrentRepeatCount() const;

    //设置动作的当前运行次数
    virtual void setCurrentRepeatCount(int count);

    //动作的Tag
    virtual int getTag() const;

    //设置动作的Tag
    virtual void setTag(int tag);

    //是否正在执行中
    virtual bool isRunning() const;

    //动作的执行方法
    virtual void startWithTarget(Node* target);

    //动作的停止方法
    virtual void stopWithTarget(Node* target);

    //动作的暂停方法
    virtual void pauseWithTarget(Node* target);

    //动作的恢复方法
    virtual void resumeWithTarget(Node* target);

    //动作是否已经更新
    virtual bool isUpdate() const;

    //设置动作是否已经更新
    virtual void setUpdate(bool update);

    //动作是否已经结束
    virtual bool isFinish() const;

    //设置动作是否已经结束
    virtual void setFinish(bool finish);

    //获取动作的运行目标
    virtual Node* getTarget() const;

    //设置动作的运行目标
    virtual void setTarget(Node* target);

    //获取动作的执行状态
    virtual int getState() const;

    //设置动作的执行状态
    virtual void setState(int state);

    //获取动作的执行时间
    virtual float getElapsedTime() const;

    //设置动作的执行时间
    virtual void setElapsedTime(float elapsedTime);

    //获取动作的执行时间比重
    virtual float getProgress() const;

    //设置动作的执行时间比重
    virtual void setProgress(float progress);

    //动作的结束方法
    virtual void finish();

    //动作的释放方法
    virtual void release();
};

在Action类中,我们定义了一些基本属性,如持续时间、运行速度、运行次数、Tag等。我们还定义了一些基本方法,如start、stop、pause、resume等。

接下来,我们需要创建一个FiniteTimeAction类。FiniteTimeAction类是有限时间的动作,它具有持续时间和运行次数等属性。在Cocos2d-x-Html5中,FiniteTimeAction类有许多子类,如MoveBy、RotateBy、ScaleBy等。

class FiniteTimeAction : public Action {
public:
    FiniteTimeAction();
    virtual ~FiniteTimeAction();

    //获取动作的持续时间
    virtual float getDuration() const;

    //设置动作的持续时间
    virtual void setDuration(float duration);

    //动作的运行次数
    virtual int getRepeatCount() const;

    //设置动作的运行次数
    virtual void setRepeatCount(int count);

    //动作的运行总次数
    virtual int getTotalRepeatCount() const;

    //设置动作的运行总次数
    virtual void setTotalRepeatCount(int count);

    //动作的当前运行次数
    virtual int getCurrentRepeatCount() const;

    //设置动作的当前运行次数
    virtual void setCurrentRepeatCount(int count);
};

在FiniteTimeAction类中,我们定义了一些与时间相关的属性,如持续时间、运行次数等。我们还定义了一些与时间相关的基本方法,如setDuration、getDuration等。

最后,我们需要创建一个MoveToAction类。MoveToAction类是有限时间的动作,它可以将目标节点移动到指定的位置。

class MoveToAction : public FiniteTimeAction {
public:
    MoveToAction();
    virtual ~MoveToAction();

    //获取目标位置
    virtual Vec2 getEndPosition() const;

    //设置目标位置
    virtual void setEndPosition(const Vec2& position);

    //获取动作的持续时间
    virtual float getDuration() const;

    //设置动作的持续时间
    virtual void setDuration(float duration);

    //动作的运行次数
    virtual int getRepeatCount() const;

    //设置动作的运行次数
    virtual void setRepeatCount(int count);

    //动作的运行总次数
    virtual int getTotalRepeatCount() const;

    //设置动作的运行总次数
    virtual void setTotalRepeatCount(int count);

    //动作的当前运行次数
    virtual int getCurrentRepeatCount() const;

    //设置动作的当前运行次数
    virtual void setCurrentRepeatCount(int count);
};

在MoveToAction类中,我们定义了一些与目标位置相关的属性,如目标位置等。我们还定义了一些与目标位置相关的基本方法,如setEndPosition、getEndPosition等。

实际案例

现在,我们来看一个实际的例子。我们创建一个场景,然后在场景中创建一个精灵。我们使用MoveToAction类将精灵移动到指定的位置。

//创建场景
auto scene = Scene::create();

//创建精灵
auto sprite = Sprite::create("grossini.png");

//将精灵添加到场景中
scene->addChild(sprite);

//创建MoveToAction类
auto moveToAction = MoveToAction::create(2.0f, Vec2(200, 200));

//将MoveToAction类添加到精灵中
sprite->runAction(moveToAction);

运行这段代码,我们会看到精灵从起始位置移动到指定的位置。

总结

在本文中,我们学习了如何使用Cocos2d-x-Html5中的动作系统。我们还学习了如何创建一个动作类、一个有限时间的动作类和一个MoveToAction类。我们还学习了如何将一个MoveToAction类添加到一个精灵中。