312 lines
8.1 KiB
C++
312 lines
8.1 KiB
C++
// Copyright (c) 2020-2021 Kiwano - Nomango
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to deal
|
|
// in the Software without restriction, including without limitation the rights
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
// THE SOFTWARE.
|
|
|
|
#pragma once
|
|
#include <kiwano/2d/animation/Animation.h>
|
|
#include <kiwano/2d/animation/TweenAnimation.h>
|
|
#include <kiwano/2d/animation/PathAnimation.h>
|
|
#include <kiwano/2d/animation/DelayAnimation.h>
|
|
#include <kiwano/2d/animation/FrameAnimation.h>
|
|
#include <kiwano/2d/animation/CustomAnimation.h>
|
|
#include <kiwano/2d/animation/AnimationGroup.h>
|
|
|
|
namespace kiwano
|
|
{
|
|
|
|
/// \~chinese
|
|
/// @brief 动画包装器
|
|
class KGE_API AnimationWrapper
|
|
{
|
|
public:
|
|
AnimationWrapper() = default;
|
|
|
|
inline AnimationWrapper(AnimationPtr ptr)
|
|
: ptr(ptr)
|
|
{
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 设置循环次数
|
|
inline AnimationWrapper& Loops(int loops)
|
|
{
|
|
if (ptr)
|
|
ptr->SetLoops(loops);
|
|
return (*this);
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 设置动画延迟
|
|
inline AnimationWrapper& Delay(Duration delay)
|
|
{
|
|
if (ptr)
|
|
ptr->SetDelay(delay);
|
|
return (*this);
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 设置动画结束回调函数
|
|
inline AnimationWrapper& Handler(AnimationEventHandlerPtr handler)
|
|
{
|
|
if (ptr)
|
|
ptr->SetHandler(handler);
|
|
return (*this);
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 动画结束时移除目标角色
|
|
inline AnimationWrapper& RemoveTargetWhenDone()
|
|
{
|
|
if (ptr)
|
|
ptr->RemoveTargetWhenDone();
|
|
return (*this);
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 设置名称
|
|
inline AnimationWrapper& Name(const String& name)
|
|
{
|
|
if (ptr)
|
|
ptr->SetName(name);
|
|
return (*this);
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 设置缓动函数
|
|
inline AnimationWrapper& Ease(const EaseFunc& ease)
|
|
{
|
|
auto tween = dynamic_cast<TweenAnimation*>(ptr.Get());
|
|
if (tween)
|
|
{
|
|
tween->SetEaseFunc(ease);
|
|
}
|
|
return (*this);
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 克隆动画
|
|
inline AnimationWrapper Clone() const
|
|
{
|
|
if (ptr)
|
|
return AnimationWrapper(ptr->Clone());
|
|
return AnimationWrapper();
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 获取反向动画
|
|
inline AnimationWrapper Reverse() const
|
|
{
|
|
if (ptr)
|
|
return AnimationWrapper(ptr->Reverse());
|
|
return AnimationWrapper();
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 获取指针
|
|
inline Animation* Get() const
|
|
{
|
|
return const_cast<Animation*>(ptr.Get());
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 设置动画
|
|
inline void SetEntity(AnimationPtr ptr)
|
|
{
|
|
this->ptr = ptr;
|
|
}
|
|
|
|
inline Animation* operator->() const
|
|
{
|
|
return Get();
|
|
}
|
|
|
|
inline operator Animation*() const
|
|
{
|
|
return Get();
|
|
}
|
|
|
|
inline operator AnimationPtr() const
|
|
{
|
|
return ptr;
|
|
}
|
|
|
|
inline operator bool() const
|
|
{
|
|
return ptr != nullptr;
|
|
}
|
|
|
|
protected:
|
|
AnimationPtr ptr;
|
|
};
|
|
|
|
namespace animation
|
|
{
|
|
|
|
/// \~chinese
|
|
/// @brief 创建相对位移动画
|
|
/// @param duration 动画时长
|
|
/// @param displacement 位移向量
|
|
inline AnimationWrapper MoveBy(kiwano::Duration duration, const Vec2& displacement)
|
|
{
|
|
return AnimationWrapper(new MoveByAnimation(duration, displacement));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建位移动画
|
|
/// @param duration 动画时长
|
|
/// @param distination 目的坐标
|
|
inline AnimationWrapper MoveTo(kiwano::Duration duration, const Point& distination)
|
|
{
|
|
return AnimationWrapper(new MoveToAnimation(duration, distination));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建相对跳跃动画
|
|
/// @param duration 动画时长
|
|
/// @param displacement 跳跃位移向量
|
|
/// @param height 跳跃高度
|
|
/// @param count 跳跃次数
|
|
inline AnimationWrapper JumpBy(kiwano::Duration duration, const Vec2& displacement, float height, int count = 1)
|
|
{
|
|
return AnimationWrapper(new JumpByAnimation(duration, displacement, height, count));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建跳跃动画
|
|
/// @param duration 动画时长
|
|
/// @param distination 目的坐标
|
|
/// @param height 跳跃高度
|
|
/// @param count 跳跃次数
|
|
inline AnimationWrapper JumpTo(kiwano::Duration duration, const Point& distination, float height, int count = 1)
|
|
{
|
|
return AnimationWrapper(new JumpToAnimation(duration, distination, height, count));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建相对缩放动画
|
|
/// @param duration 动画时长
|
|
/// @param scale 缩放相对变化值
|
|
inline AnimationWrapper ScaleBy(kiwano::Duration duration, Vec2 scale)
|
|
{
|
|
return AnimationWrapper(new ScaleByAnimation(duration, scale));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建缩放动画
|
|
/// @param duration 动画时长
|
|
/// @param scale 缩放目标值
|
|
inline AnimationWrapper ScaleTo(kiwano::Duration duration, Vec2 scale)
|
|
{
|
|
return AnimationWrapper(new ScaleToAnimation(duration, scale));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建透明度渐变动画
|
|
/// @param duration 动画时长
|
|
/// @param opacity 目标透明度
|
|
inline AnimationWrapper FadeTo(kiwano::Duration duration, float opacity)
|
|
{
|
|
return AnimationWrapper(new FadeToAnimation(duration, opacity));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建淡入动画
|
|
/// @param duration 动画时长
|
|
inline AnimationWrapper FadeIn(kiwano::Duration duration)
|
|
{
|
|
return AnimationWrapper(new FadeToAnimation(duration, 1.0f));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建淡出动画
|
|
/// @param duration 动画时长
|
|
inline AnimationWrapper FadeOut(kiwano::Duration duration)
|
|
{
|
|
return AnimationWrapper(new FadeToAnimation(duration, 0.0f));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建相对旋转动画
|
|
/// @param duration 动画时长
|
|
/// @param rotation 角度相对变化值
|
|
inline AnimationWrapper RotateBy(kiwano::Duration duration, float rotation)
|
|
{
|
|
return AnimationWrapper(new RotateByAnimation(duration, rotation));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建旋转动画
|
|
/// @param duration 动画时长
|
|
/// @param rotation 目标角度
|
|
inline AnimationWrapper RotateTo(kiwano::Duration duration, float rotation)
|
|
{
|
|
return AnimationWrapper(new RotateToAnimation(duration, rotation));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建自定义动画
|
|
/// @param duration 动画时长
|
|
/// @param tween_func 动画回调函数
|
|
inline AnimationWrapper Custom(kiwano::Duration duration, TweenFunc tween_func)
|
|
{
|
|
return AnimationWrapper(new CustomAnimation(duration, tween_func));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建路径行走动画
|
|
/// @param duration 持续时长
|
|
/// @param path 路径形状
|
|
/// @param rotating 是否沿路径切线方向旋转
|
|
/// @param start 路径起点(百分比)
|
|
/// @param end 路径终点(百分比)
|
|
inline AnimationWrapper Path(kiwano::Duration duration, ShapePtr path, bool rotating = false, float start = 0.f,
|
|
float end = 1.f)
|
|
{
|
|
return AnimationWrapper(new PathAnimation(duration, path, rotating, start, end));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建延时动画
|
|
/// @param delay 延时时长
|
|
inline AnimationWrapper Delay(kiwano::Duration delay)
|
|
{
|
|
return AnimationWrapper(new DelayAnimation(delay));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建帧动画
|
|
/// @param duration 动画时长
|
|
/// @param frame_seq 序列帧
|
|
inline AnimationWrapper Frames(kiwano::Duration duration, FrameSequencePtr frame_seq)
|
|
{
|
|
return AnimationWrapper(new FrameAnimation(duration, frame_seq));
|
|
}
|
|
|
|
/// \~chinese
|
|
/// @brief 创建动画组合
|
|
/// @param actions 动画集合
|
|
/// @param parallel 同步执行
|
|
inline AnimationWrapper Group(const Vector<AnimationPtr>& animations, bool parallel = false)
|
|
{
|
|
return AnimationWrapper(new AnimationGroup(animations, parallel));
|
|
}
|
|
|
|
} // namespace animation
|
|
} // namespace kiwano
|