add Animation sample

This commit is contained in:
Nomango 2019-03-18 15:00:58 +08:00 committed by Nomango
parent 4e3a32ec15
commit 5f31b12ee2
17 changed files with 224 additions and 23 deletions

View File

@ -1150,7 +1150,7 @@ static void ShowDemoWindowWidgets()
ImGui::TreePop();
}
if (ImGui::TreeNode("Data Types"))
if (ImGui::TreeNode("DataUtil Types"))
{
// The DragScalar/InputScalar/SliderScalar functions allow various data types: signed/unsigned int/long long and float/double
// To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum to pass the type,

View File

@ -32,7 +32,7 @@ namespace easy2d
Animation(
Duration duration, /* 动画时长 */
FramesPtr const& frames, /* Ö¡¼¯ºÏ */
FramesPtr const& frames, /* ÐòÁÐÖ¡ */
EaseFunc func = nullptr /* 速度变化 */
);

View File

@ -23,7 +23,7 @@
namespace easy2d
{
// 帧集合
// ÐòÁÐÖ¡
class E2D_API Frames
: public virtual Object
{
@ -31,7 +31,7 @@ namespace easy2d
Frames();
explicit Frames(
Array<ImagePtr> const& frames /* 关键帧数组 */
Array<ImagePtr> const& frames /* ÐòÁÐÖ¡ */
);
virtual ~Frames();

View File

@ -1203,14 +1203,14 @@ namespace std
template<>
struct hash<::easy2d::String>
{
size_t operator()(const easy2d::String& key) const
inline size_t operator()(const easy2d::String& key) const
{
return key.hash();
}
};
template<>
void swap<::easy2d::String>(::easy2d::String& lhs, ::easy2d::String& rhs)
inline void swap<::easy2d::String>(::easy2d::String& lhs, ::easy2d::String& rhs)
{
lhs.swap(rhs);
}

View File

@ -106,7 +106,7 @@
//
#include "utils/Path.h"
#include "utils/Data.h"
#include "utils/DataUtil.h"
#include "utils/File.h"
#include "utils/ResLoader.h"

View File

@ -3,20 +3,21 @@
#pragma once
#include "common.h"
E2D_DECLARE_SMART_PTR(Man);
class Man
// 怪物
E2D_DECLARE_SMART_PTR(Monster);
class Monster
: public Sprite
{
public:
Man()
Monster()
{
// 加载图片
Load(L"res/man.png");
Load(L"res/akushu.png");
// 缩小图片
SetScale(0.5f);
SetScale(0.7f);
}
// 每帧更新时
// 每帧渲染前执行 OnUpdate
void OnUpdate(Duration dt) override
{
// 获取输入设备
@ -41,7 +42,7 @@ public:
this->Move(0, 2);
}
// 按下鼠标左键,顺时针旋转小人
// 按下鼠标左键,顺时针旋转怪物
if (input.IsDown(MouseButton::Left))
{
// 获取当前旋转角度
@ -50,7 +51,7 @@ public:
this->SetRotation(rotation + 2);
}
// 点击鼠标右键,隐藏或显示小人
// 点击鼠标右键,隐藏或显示怪物
if (input.WasPressed(MouseButton::Right))
{
// 获取当前显示状态
@ -72,11 +73,11 @@ public:
Demo2()
{
// 创建
ManPtr man = new Man;
// 创建
MonsterPtr monster = new Monster;
// 在屏幕上居中显示
man->SetAnchor(0.5f, 0.5f);
man->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2);
monster->SetAnchor(0.5f, 0.5f);
monster->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2);
// 创建说明文字
TextPtr text = new Text(L"按上下左右键移动\n按鼠标左键旋转\n点击鼠标右键隐藏");
@ -88,7 +89,7 @@ public:
text->SetAlignment(TextAlign::Center);
// 添加到场景
this->AddChild(man);
this->AddChild(monster);
this->AddChild(text);
}
};

View File

@ -20,7 +20,7 @@ public:
{
// 속潼稜있
music = new Music;
if (!music->Load(L"res/music.wav"))
if (!music->Load(L"res/splash.mp3"))
{
music = nullptr;

192
samples/Samples/Demo4.h Normal file
View File

@ -0,0 +1,192 @@
// Copyright (C) 2019 Nomango
#pragma once
#include "common.h"
// 老虎
E2D_DECLARE_SMART_PTR(Tiger);
class Tiger
: public Sprite
{
FramesPtr run_frames; // 跑步序列帧
FramesPtr stand_frames; // 站立序列帧
bool facing_left; // 面朝左或面朝右
bool running; // 是否正在跑步
Direction running_direction; // 跑步方向
public:
Tiger()
{
// 获取图片原始大小
ImagePtr image = new Image(L"res/tiger.png");
Size source_size = image->GetSize();
// 计算每帧图片大小
Size frame_size = { source_size.x / 5, source_size.y / 3 };
// 加载帧动画
run_frames = new Frames;
for (int i = 0; i < 6; ++i)
{
Point pos = { (i % 5) * frame_size.x, (i / 5) * frame_size.y };
ImagePtr frame = new Image(L"res/tiger.png", Rect{ pos, frame_size });
run_frames->Add(frame);
}
stand_frames = new Frames;
for (int i = 0; i < 6; ++i)
{
Point pos = { ((i + 1) % 5) * frame_size.x, ((i + 1) / 5 + 1) * frame_size.y };
ImagePtr frame = new Image(L"res/tiger.png", Rect{ pos, frame_size });
stand_frames->Add(frame);
}
// 执行动画
AddAction(
Tween::Animation(stand_frames)
.SetDuration(1000)
.SetLoops(-1)
);
// 添加按键监听
AddListener(Event::KeyDown, Closure(this, &Tiger::OnKeyDown));
AddListener(Event::KeyUp, Closure(this, &Tiger::OnKeyUp));
// 默认方向为 Left
facing_left = true;
running = false;
// 设置锚点
SetAnchor(0.5f, 0.5f);
}
void OnKeyDown(Event const& e)
{
if (e.key.code == KeyCode::Left)
Run(Direction::Left);
else if (e.key.code == KeyCode::Right)
Run(Direction::Right);
else if (e.key.code == KeyCode::Up)
Run(Direction::Up);
else if (e.key.code == KeyCode::Down)
Run(Direction::Down);
}
void OnKeyUp(Event const& e)
{
switch (e.key.code)
{
case KeyCode::Left:
case KeyCode::Right:
case KeyCode::Up:
case KeyCode::Down:
StopRun();
break;
}
}
void Run(Direction d)
{
if (!running)
{
running = true;
StopAllActions();
// 执行跑步动画
AddAction(
Tween::Animation(run_frames)
.SetDuration(500)
.SetLoops(-1)
);
}
running_direction = d;
if (running_direction == Direction::Left)
{
facing_left = true;
}
else if (running_direction == Direction::Right)
{
facing_left = false;
}
// 缩放可以调整图片显示方向
// 缩放至 -1 图片会反转
SetScaleX(facing_left ? 1.0f : -1.0f);
}
void StopRun()
{
if (running)
{
running = false;
StopAllActions();
// 执行站立动画
AddAction(
Tween::Animation(stand_frames)
.SetDuration(1000)
.SetLoops(-1)
);
}
}
void OnUpdate(Duration dt)
{
if (running)
{
// 计算移动距离
// OnUpdate 并不是一个稳定间隔执行的函数, 如果想实现稳定
// 每秒移动 150 像素, 应根据 dt 参数计算移动距离
const float moving_per_sec = 150;
const float distance = moving_per_sec * dt.Seconds();
switch (running_direction)
{
case Direction::Up:
Move(0, -distance);
break;
case Direction::Down:
Move(0, distance);
break;
case Direction::Left:
Move(-distance, 0);
break;
case Direction::Right:
Move(distance, 0);
break;
}
}
}
};
class Demo4
: public Scene
{
public:
static ScenePtr Create()
{
return new Demo4;
}
Demo4()
{
// 创建老虎
TigerPtr tiger = new Tiger;
// 在屏幕上居中显示
tiger->SetAnchor(0.5f, 0.5f);
tiger->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2);
// 创建说明文字
TextPtr text = new Text(L"按上下左右键移动");
// 设置节点大小为文字布局大小
text->SetSize(text->GetLayoutSize());
// 设置文字位置
text->SetAnchor(0.5f, 0.5f);
text->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT - 80);
text->SetAlignment(TextAlign::Center);
// 添加到场景
this->AddChild(tiger);
this->AddChild(text);
}
};

View File

@ -140,6 +140,7 @@
<ClInclude Include="Demo1.h" />
<ClInclude Include="Demo2.h" />
<ClInclude Include="Demo3.h" />
<ClInclude Include="Demo4.h" />
<ClInclude Include="include-forwards.h" />
</ItemGroup>
<ItemGroup>

View File

@ -9,5 +9,6 @@
<ClInclude Include="common.h" />
<ClInclude Include="Demo2.h" />
<ClInclude Include="Demo3.h" />
<ClInclude Include="Demo4.h" />
</ItemGroup>
</Project>

View File

@ -5,3 +5,4 @@
#include "Demo1.h"
#include "Demo2.h"
#include "Demo3.h"
#include "Demo4.h"

View File

@ -14,6 +14,7 @@ namespace
{ L"动画示例", Demo1::Create },
{ L"输入示例", Demo2::Create },
{ L"音频播放示例", Demo3::Create },
{ L"帧动画示例", Demo4::Create },
};
int s_DemoIndex = 0;
int s_DemoNum = sizeof(s_Demos) / sizeof(Demo);
@ -25,6 +26,7 @@ class DemoApp
public:
DemoApp()
{
ShowConsole();
// 使用 Audio 组件
Use(&Audio::Instance());
@ -39,7 +41,8 @@ public:
void ChangeDemoScene()
{
GetWindow()->SetTitle(s_Demos[s_DemoIndex].title);
String title = s_Demos[s_DemoIndex].title;
GetWindow()->SetTitle(title);
ScenePtr scene = s_Demos[s_DemoIndex].Create();
EnterScene(scene);
@ -48,8 +51,10 @@ public:
scene->AddListener(Event::KeyUp, Closure(this, &DemoApp::KeyPressed));
// 显示提示文字
TextPtr intro = new Text(L"Key 1~3 to select demo");
String intro_str = format_wstring(L"按键 1~%d 可切换示例\n", s_DemoNum);
TextPtr intro = new Text(intro_str + title);
intro->SetFontSize(16.f);
intro->SetPosition(10, 10);
scene->AddChild(intro);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB