掌握Cocos2d-x-Html5,轻松玩转动作系统
2023-09-06 06:01:29
技术导读
嗨,大家好,我是思航。
今天,我们通过一个简单的例子,来研究一下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类添加到一个精灵中。