Magic_Game/Easy2D/eactions.h

350 lines
6.0 KiB
C++

#pragma once
#include "enodes.h"
#include "etools.h"
namespace e2d
{
class ActionTwo;
class ActionNeverStop;
class ActionSequence;
class EAction :
public EObject
{
friend ENode;
friend EActionManager;
friend ActionTwo;
friend ActionNeverStop;
friend ActionSequence;
public:
EAction();
virtual ~EAction();
// 获取动作运行状态
virtual bool isRunning();
// 获取动作结束状态
virtual bool isEnding();
// 继续动作
virtual void start();
// 继续动作
virtual void resume();
// 暂停动作
virtual void pause();
// 停止动作
virtual void stop();
// 设置动作每一帧时间间隔
virtual void setInterval(LONGLONG milliSeconds);
// 获取一个新的拷贝动作
virtual EAction * copy() const = 0;
// 获取一个新的逆向动作
virtual EAction * reverse() const;
// 获取执行该动作的目标
virtual ENode * getTarget();
protected:
// 初始化动作
virtual void _init();
// 执行动作
virtual void _exec() = 0;
// 重置动作
virtual void _reset();
// 进入等待状态
virtual void wait();
// 唤醒
virtual void notify();
protected:
bool m_bRunning;
bool m_bWaiting;
bool m_bEnding;
bool m_bInit;
ENode * m_pTarget;
EScene * m_pParentScene;
LONGLONG m_nAnimationInterval;
std::chrono::steady_clock::time_point m_nLast;
};
class Animation :
public EAction
{
public:
Animation(float duration);
virtual ~Animation();
protected:
LONGLONG m_nDuration;
LONGLONG m_nTotalDuration;
protected:
bool _isEnd() const;
bool _isDelayEnough();
virtual void _init() override;
virtual void _reset() override;
};
class ActionMoveBy :
public Animation
{
public:
ActionMoveBy(float duration, EVec vector);
virtual ~ActionMoveBy();
virtual ActionMoveBy * copy() const override;
virtual ActionMoveBy * reverse() const override;
protected:
EPoint m_BeginPos;
EVec m_MoveVector;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
class ActionMoveTo :
public ActionMoveBy
{
public:
ActionMoveTo(float duration, EPoint pos);
virtual ~ActionMoveTo();
virtual ActionMoveTo * copy() const override;
protected:
EPoint m_EndPos;
protected:
virtual void _init() override;
virtual void _reset() override;
};
class ActionScaleBy :
public Animation
{
public:
ActionScaleBy(float duration, float scaleX, float scaleY);
virtual ~ActionScaleBy();
virtual ActionScaleBy * copy() const override;
virtual ActionScaleBy * reverse() const override;
protected:
float m_nBeginScaleX;
float m_nBeginScaleY;
float m_nVariationX;
float m_nVariationY;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
class ActionScaleTo :
public ActionScaleBy
{
public:
ActionScaleTo(float duration, float scaleX, float scaleY);
virtual ~ActionScaleTo();
virtual ActionScaleTo * copy() const override;
protected:
float m_nEndScaleX;
float m_nEndScaleY;
protected:
virtual void _init() override;
virtual void _reset() override;
};
class ActionOpacityBy :
public Animation
{
public:
ActionOpacityBy(float duration, float opacity);
virtual ~ActionOpacityBy();
virtual ActionOpacityBy * copy() const override;
virtual ActionOpacityBy * reverse() const override;
protected:
float m_nBeginVal;
float m_nVariation;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
class ActionOpacityTo :
public ActionOpacityBy
{
public:
ActionOpacityTo(float duration, float opacity);
virtual ~ActionOpacityTo();
virtual ActionOpacityTo * copy() const override;
protected:
float m_nEndVal;
protected:
virtual void _init() override;
virtual void _reset() override;
};
class ActionFadeIn :
public ActionOpacityTo
{
public:
ActionFadeIn(float duration) : ActionOpacityTo(duration, 1) {}
};
class ActionFadeOut :
public ActionOpacityTo
{
public:
ActionFadeOut(float duration) : ActionOpacityTo(duration, 0) {}
};
class ActionTwo :
public EAction
{
public:
ActionTwo(EAction * actionFirst, EAction * actionSecond);
virtual ~ActionTwo();
virtual ActionTwo * copy() const override;
virtual ActionTwo * reverse(bool actionReverse = true) const;
protected:
EAction * m_FirstAction;
EAction * m_SecondAction;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
class ActionSequence :
public EAction
{
public:
ActionSequence();
ActionSequence(int number, EAction * action1, ...);
virtual ~ActionSequence();
void addAction(EAction * action);
virtual ActionSequence * copy() const override;
virtual ActionSequence * reverse(bool actionReverse = true) const;
protected:
UINT m_nActionIndex;
std::vector<EAction*> m_vActions;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
class ActionDelay :
public EAction
{
public:
ActionDelay(float duration);
virtual ~ActionDelay();
virtual ActionDelay * copy() const override;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
class ActionNeverStop :
public EAction
{
public:
ActionNeverStop(EAction * action);
virtual ~ActionNeverStop();
virtual ActionNeverStop * copy() const override;
protected:
EAction * m_Action;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
class ActionFrames :
public EAction
{
public:
ActionFrames();
ActionFrames(LONGLONG frameDelay);
~ActionFrames();
void addFrame(Image * frame);
virtual ActionFrames * copy() const override;
virtual ActionFrames * reverse() const override;
protected:
UINT m_nFrameIndex;
EVector<Image*> m_vFrames;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
class ActionCallback :
public EAction
{
public:
ActionCallback(const std::function<void()>& callback);
~ActionCallback();
virtual ActionCallback * copy() const override;
protected:
std::function<void()> m_Callback;
protected:
virtual void _init() override;
virtual void _exec() override;
virtual void _reset() override;
};
}