add TaskManager and ActionManager, expands time package

This commit is contained in:
Haibo 2018-11-14 16:39:24 +08:00 committed by Nomango
parent ccba1363a0
commit 32ecc0cbe8
35 changed files with 848 additions and 1040 deletions

View File

@ -24,12 +24,14 @@
namespace easy2d
{
class ActionManager;
class Action
: public RefCounter
{
E2D_DISABLE_COPY(Action);
friend class Node;
friend class ActionManager;
friend class Loop;
friend class Sequence;
friend class Spawn;
@ -51,12 +53,6 @@ namespace easy2d
// 停止动作
inline void Stop() { done_ = true; }
// 获取动作名称
inline const String& GetName() const { return name_; }
// 设置动作名称
inline void SetName(const String& name) { name_ = name; }
inline bool IsDone() const { return done_; }
// 获取动作的拷贝
@ -70,7 +66,6 @@ namespace easy2d
{
initialized_ = false;
done_ = false;
started_ = time::Now();
}
protected:
@ -80,13 +75,9 @@ namespace easy2d
this->Reset();
}
virtual void Init(Node* target)
{
initialized_ = true;
started_ = time::Now();
}
virtual void Init(Node* target) {}
virtual void Update(Node* target)
virtual void Update(Node* target, Duration const& dt)
{
if (!initialized_)
{
@ -94,13 +85,9 @@ namespace easy2d
}
}
virtual void ResetTime() {}
protected:
String name_;
bool running_;
bool done_;
bool initialized_;
TimePoint started_;
bool running_;
bool done_;
bool initialized_;
};
}

View File

@ -75,9 +75,9 @@ namespace easy2d
}
}
void Loop::Update(Node* target)
void Loop::Update(Node* target, Duration const& dt)
{
Action::Update(target);
Action::Update(target, dt);
if (times_ == total_times_)
{
@ -87,7 +87,7 @@ namespace easy2d
if (action_)
{
action_->Update(target);
action_->Update(target, dt);
if (action_->IsDone())
{
@ -111,11 +111,6 @@ namespace easy2d
times_ = 0;
}
void Loop::ResetTime()
{
if (action_) action_->ResetTime();
}
//-------------------------------------------------------
// Sequence
@ -142,12 +137,12 @@ namespace easy2d
actions_[0]->Init(target);
}
void Sequence::Update(Node* target)
void Sequence::Update(Node* target, Duration const& dt)
{
Action::Update(target);
Action::Update(target, dt);
auto &action = actions_[action_index_];
action->Update(target);
action->Update(target, dt);
if (action->IsDone())
{
@ -173,14 +168,6 @@ namespace easy2d
action_index_ = 0;
}
void Sequence::ResetTime()
{
for (const auto& action : actions_)
{
action->ResetTime();
}
}
void Sequence::Add(spAction const& action)
{
if (action)
@ -258,9 +245,9 @@ namespace easy2d
}
}
void Spawn::Update(Node* target)
void Spawn::Update(Node* target, Duration const& dt)
{
Action::Update(target);
Action::Update(target, dt);
size_t done_num = 0;
for (const auto& action : actions_)
@ -271,7 +258,7 @@ namespace easy2d
}
else
{
action->Update(target);
action->Update(target, dt);
}
}
@ -290,14 +277,6 @@ namespace easy2d
}
}
void Spawn::ResetTime()
{
for (const auto& action : actions_)
{
action->ResetTime();
}
}
void Spawn::Add(spAction const& action)
{
if (action)

View File

@ -51,10 +51,7 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
// 重置动作时间
virtual void ResetTime() override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
spAction action_;
@ -102,10 +99,7 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
// 重置动作时间
virtual void ResetTime() override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
UINT action_index_;
@ -152,10 +146,7 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
// 重置动作时间
virtual void ResetTime() override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
Actions actions_;

View File

@ -29,16 +29,16 @@ namespace easy2d
// FiniteTimeAction
//-------------------------------------------------------
FiniteTimeAction::FiniteTimeAction(float duration)
: delta_(0)
, duration_(std::max(duration, 0.f))
FiniteTimeAction::FiniteTimeAction(Duration const& duration)
: process_(0)
, duration_(duration)
{
}
void FiniteTimeAction::Reset()
{
Action::Reset();
delta_ = 0;
process_ = 0;
}
void FiniteTimeAction::Init(Node* target)
@ -46,38 +46,33 @@ namespace easy2d
Action::Init(target);
}
void FiniteTimeAction::Update(Node* target)
void FiniteTimeAction::Update(Node* target, Duration const& dt)
{
Action::Update(target);
Action::Update(target, dt);
if (duration_ == 0)
if (duration_.IsZero())
{
delta_ = 1;
process_ = 1.f;
this->Stop();
}
else
{
delta_ = std::min((time::Now() - started_).Seconds() / duration_, 1.f);
process_ += dt / duration_;
process_ = std::min(process_, 1.f);
if (delta_ >= 1)
if (process_ >= 1)
{
this->Stop();
}
}
}
void FiniteTimeAction::ResetTime()
{
Action::ResetTime();
started_ = time::Now() - time::Second * (delta_ * duration_);
}
//-------------------------------------------------------
// Move Action
//-------------------------------------------------------
MoveBy::MoveBy(float duration, Point vector)
MoveBy::MoveBy(Duration const& duration, Point const& vector)
: FiniteTimeAction(duration)
{
delta_pos_ = vector;
@ -93,9 +88,9 @@ namespace easy2d
}
}
void MoveBy::Update(Node* target)
void MoveBy::Update(Node* target, Duration const& dt)
{
FiniteTimeAction::Update(target);
FiniteTimeAction::Update(target, dt);
if (target)
{
@ -103,7 +98,7 @@ namespace easy2d
Point diff = currentPos - prev_pos_;
start_pos_ = start_pos_ + diff;
Point newPos = start_pos_ + (delta_pos_ * delta_);
Point newPos = start_pos_ + (delta_pos_ * process_);
target->SetPosition(newPos);
prev_pos_ = newPos;
@ -120,7 +115,7 @@ namespace easy2d
return new (std::nothrow) MoveBy(duration_, -delta_pos_);
}
MoveTo::MoveTo(float duration, Point pos)
MoveTo::MoveTo(Duration const& duration, Point const& pos)
: MoveBy(duration, Point())
{
end_pos_ = pos;
@ -142,7 +137,7 @@ namespace easy2d
// Jump Action
//-------------------------------------------------------
JumpBy::JumpBy(float duration, const Point & vec, float height, int jumps)
JumpBy::JumpBy(Duration const& duration, Point const& vec, float height, int jumps)
: FiniteTimeAction(duration)
, delta_pos_(vec)
, height_(height)
@ -170,16 +165,16 @@ namespace easy2d
}
}
void JumpBy::Update(Node* target)
void JumpBy::Update(Node* target, Duration const& dt)
{
FiniteTimeAction::Update(target);
FiniteTimeAction::Update(target, dt);
if (target)
{
float frac = fmod(delta_ * jumps_, 1.f);
float x = delta_pos_.x * delta_;
float frac = fmod(process_ * jumps_, 1.f);
float x = delta_pos_.x * process_;
float y = height_ * 4 * frac * (1 - frac);
y += delta_pos_.y * delta_;
y += delta_pos_.y * process_;
Point currentPos = target->GetPosition();
@ -193,7 +188,7 @@ namespace easy2d
}
}
JumpTo::JumpTo(float duration, const Point & pos, float height, int jumps)
JumpTo::JumpTo(Duration const& duration, Point const& pos, float height, int jumps)
: JumpBy(duration, Point(), height, jumps)
, end_pos_(pos)
{
@ -215,14 +210,14 @@ namespace easy2d
// Scale Action
//-------------------------------------------------------
ScaleBy::ScaleBy(float duration, float scale)
ScaleBy::ScaleBy(Duration const& duration, float scale)
: FiniteTimeAction(duration)
{
delta_x_ = scale;
delta_y_ = scale;
}
ScaleBy::ScaleBy(float duration, float scale_x, float scale_y)
ScaleBy::ScaleBy(Duration const& duration, float scale_x, float scale_y)
: FiniteTimeAction(duration)
{
delta_x_ = scale_x;
@ -240,13 +235,13 @@ namespace easy2d
}
}
void ScaleBy::Update(Node* target)
void ScaleBy::Update(Node* target, Duration const& dt)
{
FiniteTimeAction::Update(target);
FiniteTimeAction::Update(target, dt);
if (target)
{
target->SetScale(start_scale_x_ + delta_x_ * delta_, start_scale_y_ + delta_y_ * delta_);
target->SetScale(start_scale_x_ + delta_x_ * process_, start_scale_y_ + delta_y_ * process_);
}
}
@ -260,14 +255,14 @@ namespace easy2d
return new (std::nothrow) ScaleBy(duration_, -delta_x_, -delta_y_);
}
ScaleTo::ScaleTo(float duration, float scale)
ScaleTo::ScaleTo(Duration const& duration, float scale)
: ScaleBy(duration, 0, 0)
{
end_scale_x_ = scale;
end_scale_y_ = scale;
}
ScaleTo::ScaleTo(float duration, float scale_x, float scale_y)
ScaleTo::ScaleTo(Duration const& duration, float scale_x, float scale_y)
: ScaleBy(duration, 0, 0)
{
end_scale_x_ = scale_x;
@ -291,7 +286,7 @@ namespace easy2d
// Opacity Action
//-------------------------------------------------------
OpacityBy::OpacityBy(float duration, float opacity)
OpacityBy::OpacityBy(Duration const& duration, float opacity)
: FiniteTimeAction(duration)
{
delta_val_ = opacity;
@ -307,13 +302,13 @@ namespace easy2d
}
}
void OpacityBy::Update(Node* target)
void OpacityBy::Update(Node* target, Duration const& dt)
{
FiniteTimeAction::Update(target);
FiniteTimeAction::Update(target, dt);
if (target)
{
target->SetOpacity(start_val_ + delta_val_ * delta_);
target->SetOpacity(start_val_ + delta_val_ * process_);
}
}
@ -327,7 +322,7 @@ namespace easy2d
return new (std::nothrow) OpacityBy(duration_, -delta_val_);
}
OpacityTo::OpacityTo(float duration, float opacity)
OpacityTo::OpacityTo(Duration const& duration, float opacity)
: OpacityBy(duration, 0)
{
end_val_ = opacity;
@ -344,12 +339,12 @@ namespace easy2d
delta_val_ = end_val_ - start_val_;
}
FadeIn::FadeIn(float duration)
FadeIn::FadeIn(Duration const& duration)
: OpacityTo(duration, 1)
{
}
FadeOut::FadeOut(float duration)
FadeOut::FadeOut(Duration const& duration)
: OpacityTo(duration, 0)
{
}
@ -359,7 +354,7 @@ namespace easy2d
// Rotate Action
//-------------------------------------------------------
RotateBy::RotateBy(float duration, float rotation)
RotateBy::RotateBy(Duration const& duration, float rotation)
: FiniteTimeAction(duration)
{
delta_val_ = rotation;
@ -375,13 +370,13 @@ namespace easy2d
}
}
void RotateBy::Update(Node* target)
void RotateBy::Update(Node* target, Duration const& dt)
{
FiniteTimeAction::Update(target);
FiniteTimeAction::Update(target, dt);
if (target)
{
target->SetRotation(start_val_ + delta_val_ * delta_);
target->SetRotation(start_val_ + delta_val_ * process_);
}
}
@ -395,7 +390,7 @@ namespace easy2d
return new (std::nothrow) RotateBy(duration_, -delta_val_);
}
RotateTo::RotateTo(float duration, float rotation)
RotateTo::RotateTo(Duration const& duration, float rotation)
: RotateBy(duration, 0)
{
end_val_ = rotation;
@ -417,16 +412,16 @@ namespace easy2d
// Delay
//-------------------------------------------------------
Delay::Delay(float duration)
: delta_(0)
, delay_(std::max(duration, 0.f))
Delay::Delay(Duration const& duration)
: delta_()
, delay_(duration)
{
}
void Delay::Reset()
{
Action::Reset();
delta_ = 0;
delta_ = Duration{};
}
void Delay::Init(Node* target)
@ -434,11 +429,11 @@ namespace easy2d
Action::Init(target);
}
void Delay::Update(Node* target)
void Delay::Update(Node* target, Duration const& dt)
{
Action::Update(target);
Action::Update(target, dt);
delta_ = (time::Now() - started_).Seconds();
delta_ += dt;
if (delta_ >= delay_)
{
@ -446,12 +441,6 @@ namespace easy2d
}
}
void Delay::ResetTime()
{
Action::ResetTime();
started_ = time::Now() - time::Second * delta_;
}
spAction Delay::Clone() const
{
return new (std::nothrow) Delay(delay_);

View File

@ -32,7 +32,7 @@ namespace easy2d
public:
// 创建特定时长的持续动作
explicit FiniteTimeAction(
float duration
Duration const& duration
);
// 重置动作
@ -43,14 +43,11 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
// 重置动作时间
virtual void ResetTime() override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
float duration_;
float delta_;
Duration duration_;
float process_;
};
@ -62,8 +59,8 @@ namespace easy2d
public:
explicit MoveBy(
float duration, /* 持续时长 */
Point vector /* 移动距离 */
Duration const& duration, /* 持续时长 */
Point const& vector /* 移动距离 */
);
// 获取该动作的拷贝对象
@ -77,7 +74,7 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
Point start_pos_;
@ -94,8 +91,8 @@ namespace easy2d
public:
explicit MoveTo(
float duration, /* 持续时长 */
Point pos /* 目的坐标 */
Duration const& duration, /* 持续时长 */
Point const& pos /* 目的坐标 */
);
// 获取该动作的拷贝对象
@ -125,10 +122,10 @@ namespace easy2d
public:
explicit JumpBy(
float duration, /* 持续时长 */
const Point& vec, /* 跳跃距离 */
float height, /* 跳跃高度 */
int jumps = 1 /* 跳跃次数 */
Duration const& duration, /* 持续时长 */
Point const& vec, /* 跳跃距离 */
float height, /* 跳跃高度 */
int jumps = 1 /* 跳跃次数 */
);
// 获取该动作的拷贝对象
@ -142,7 +139,7 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
Point start_pos_;
@ -161,10 +158,10 @@ namespace easy2d
public:
explicit JumpTo(
float duration, /* 持续时长 */
const Point& pos, /* 目的坐标 */
float height, /* 跳跃高度 */
int jumps = 1 /* 跳跃次数 */
Duration const& duration, /* 持续时长 */
Point const& pos, /* 目的坐标 */
float height, /* 跳跃高度 */
int jumps = 1 /* 跳跃次数 */
);
// 获取该动作的拷贝对象
@ -194,14 +191,14 @@ namespace easy2d
public:
explicit ScaleBy(
float duration, /* 持续时长 */
float scale /* 相对变化值 */
Duration const& duration, /* 持续时长 */
float scale /* 相对变化值 */
);
explicit ScaleBy(
float duration, /* 持续时长 */
float scale_x, /* 横向缩放相对变化值 */
float scale_y /* 纵向缩放相对变化值 */
Duration const& duration, /* 持续时长 */
float scale_x, /* 横向缩放相对变化值 */
float scale_y /* 纵向缩放相对变化值 */
);
// 获取该动作的拷贝对象
@ -215,7 +212,7 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
float start_scale_x_;
@ -233,14 +230,14 @@ namespace easy2d
public:
explicit ScaleTo(
float duration, /* 持续时长 */
float scale /* 目标值 */
Duration const& duration, /* 持续时长 */
float scale /* 目标值 */
);
explicit ScaleTo(
float duration, /* 持续时长 */
float scale_x, /* 横向缩放目标值 */
float scale_y /* 纵向缩放目标值 */
Duration const& duration, /* 持续时长 */
float scale_x, /* 横向缩放目标值 */
float scale_y /* 纵向缩放目标值 */
);
// 获取该动作的拷贝对象
@ -271,8 +268,8 @@ namespace easy2d
public:
explicit OpacityBy(
float duration, /* 持续时长 */
float opacity /* 相对变化值 */
Duration const& duration, /* 持续时长 */
float opacity /* 相对变化值 */
);
// 获取该动作的拷贝对象
@ -286,7 +283,7 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
float start_val_;
@ -302,8 +299,8 @@ namespace easy2d
public:
explicit OpacityTo(
float duration, /* 持续时长 */
float opacity /* 目标值 */
Duration const& duration, /* 持续时长 */
float opacity /* 目标值 */
);
// 获取该动作的拷贝对象
@ -334,7 +331,7 @@ namespace easy2d
public:
// 创建淡入动作
explicit FadeIn(
float duration /* 持续时长 */
Duration const& duration /* 持续时长 */
);
};
@ -348,7 +345,7 @@ namespace easy2d
public:
// 创建淡出动作
explicit FadeOut(
float duration /* 持续时长 */
Duration const& duration /* 持续时长 */
);
};
@ -361,8 +358,8 @@ namespace easy2d
public:
explicit RotateBy(
float duration, /* 持续时长 */
float rotation /* 相对变化值 */
Duration const& duration, /* 持续时长 */
float rotation /* 相对变化值 */
);
// 获取该动作的拷贝对象
@ -376,7 +373,7 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
float start_val_;
@ -392,8 +389,8 @@ namespace easy2d
public:
explicit RotateTo(
float duration, /* 持续时长 */
float rotation /* 目标值 */
Duration const& duration, /* 持续时长 */
float rotation /* 目标值 */
);
// 获取该动作的拷贝对象
@ -423,7 +420,7 @@ namespace easy2d
public:
explicit Delay(
float duration /* 延迟时长(秒) */
Duration const& duration /* 延迟时长(秒) */
);
// 获取该动作的拷贝对象
@ -440,13 +437,10 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
// 重置动作时间
virtual void ResetTime() override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
float delay_;
float delta_;
Duration delay_;
Duration delta_;
};
}

109
core/base/ActionManager.cpp Normal file
View File

@ -0,0 +1,109 @@
// Copyright (c) 2016-2018 Easy2D - 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.
#include "ActionManager.h"
namespace easy2d
{
void ActionManager::UpdateActions(Node* target, Duration const& dt)
{
if (actions_.empty())
return;
std::vector<spAction> currActions;
currActions.reserve(actions_.size());
std::copy_if(
actions_.begin(),
actions_.end(),
std::back_inserter(currActions),
[](spAction action) { return action->IsRunning() && !action->IsDone(); }
);
// 遍历所有正在运行的动作
for (const auto& action : currActions)
action->Update(target, dt);
// 清除完成的动作
for (auto iter = actions_.begin(); iter != actions_.end();)
{
if ((*iter)->IsDone())
{
iter = actions_.erase(iter);
}
else
{
++iter;
}
}
}
void ActionManager::RunAction(spAction const& action)
{
E2D_WARNING_IF(!action, "Action NULL pointer exception!");
if (action)
{
auto iter = std::find(actions_.begin(), actions_.end(), action);
if (iter == actions_.end())
{
action->Start();
actions_.push_back(action);
}
}
}
void ActionManager::ResumeAllActions()
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
action->Resume();
}
}
void ActionManager::PauseAllActions()
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
action->Pause();
}
}
void ActionManager::StopAllActions()
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
action->Stop();
}
}
const Actions& ActionManager::GetAllActions() const
{
return actions_;
}
}

View File

@ -19,33 +19,34 @@
// THE SOFTWARE.
#pragma once
#include "../base/BaseTypes.h"
#include "../base/Size.h"
#include "Matrix.hpp"
#include "Action.hpp"
namespace easy2d
{
namespace math
class ActionManager
{
class Transform
{
public:
Point position; // 坐标
Size size; // 大小
float scale_x; // 横向缩放
float scale_y; // 纵向缩放
float rotation; // 旋转
float skew_x; // 横向倾斜角度
float skew_y; // 纵向倾斜角度
float pivot_x; // 支点横坐标
float pivot_y; // 支点纵坐标
public:
// 执行动作
void RunAction(
spAction const& action
);
public:
Transform();
// 继续所有暂停动作
void ResumeAllActions();
Matrix ToMatrix() const;
// 暂停所有动作
void PauseAllActions();
bool operator== (const Transform& other) const;
};
}
// 停止所有动作
void StopAllActions();
// 获取所有动作
const Actions& GetAllActions() const;
protected:
void UpdateActions(Node* target, Duration const& dt);
protected:
Actions actions_;
};
}

View File

@ -19,6 +19,7 @@
// THE SOFTWARE.
#include "Animation.h"
#include "Image.h"
#include "Sprite.h"
namespace easy2d
@ -70,9 +71,9 @@ namespace easy2d
}
}
void Animate::Update(Node* target)
void Animate::Update(Node* target, Duration const& dt)
{
Action::Update(target);
Action::Update(target, dt);
if (!animation_)
{
@ -80,7 +81,8 @@ namespace easy2d
return;
}
while ((time::Now() - started_).Seconds() >= animation_->GetInterval())
delta_ += dt;
while (delta_ >= animation_->GetInterval())
{
auto& frames = animation_->GetFrames();
auto sprite_target = dynamic_cast<Sprite*>(target);
@ -90,7 +92,7 @@ namespace easy2d
sprite_target->Load(frames[frame_index_]);
}
started_ += time::Second * animation_->GetInterval();
delta_ -= animation_->GetInterval();
++frame_index_;
if (frame_index_ == frames.size())
@ -101,11 +103,6 @@ namespace easy2d
}
}
void Animate::ResetTime()
{
Action::ResetTime();
}
void Animate::Reset()
{
Action::Reset();
@ -150,12 +147,12 @@ namespace easy2d
this->Add(frames);
}
Animation::Animation(float interval)
Animation::Animation(Duration const& interval)
: interval_(interval)
{
}
Animation::Animation(float interval, const Images& frames)
Animation::Animation(Duration const& interval, const Images& frames)
: interval_(interval)
{
this->Add(frames);
@ -165,9 +162,9 @@ namespace easy2d
{
}
void Animation::SetInterval(float interval)
void Animation::SetInterval(Duration const& interval)
{
interval_ = std::max(interval, 0.f);
interval_ = interval;
}
void Animation::Add(spImage const& frame)
@ -187,7 +184,7 @@ namespace easy2d
}
}
float Animation::GetInterval() const
Duration const& Animation::GetInterval() const
{
return interval_;
}

View File

@ -20,7 +20,6 @@
#pragma once
#include "Action.hpp"
#include "Image.h"
namespace easy2d
{
@ -34,16 +33,16 @@ namespace easy2d
Animation();
explicit Animation(
const Images& frames /* 关键帧数组 */
const Images& frames /* 关键帧数组 */
);
explicit Animation(
float interval /* 帧间隔(秒) */
Duration const& interval /* 帧间隔(秒) */
);
explicit Animation(
float interval, /* 帧间隔(秒) */
const Images& frames /* 关键帧数组 */
Duration const& interval, /* 帧间隔(秒) */
const Images& frames /* 关键帧数组 */
);
virtual ~Animation();
@ -59,14 +58,14 @@ namespace easy2d
);
// 获取帧间隔
float GetInterval() const;
Duration const& GetInterval() const;
// 获取关键帧
const Images& GetFrames() const;
// 设置每一帧的时间间隔
void SetInterval(
float interval /* 帧间隔(秒) */
Duration const& interval /* 帧间隔(秒) */
);
// 获取帧动画的拷贝对象
@ -76,8 +75,8 @@ namespace easy2d
spAnimation Reverse() const;
protected:
float interval_;
Images frames_;
Duration interval_;
Images frames_;
};
@ -118,13 +117,11 @@ namespace easy2d
virtual void Init(Node* target) override;
// 更新动作
virtual void Update(Node* target) override;
// 重置动作时间
virtual void ResetTime() override;
virtual void Update(Node* target, Duration const& dt) override;
protected:
UINT frame_index_;
size_t frame_index_;
Duration delta_;
spAnimation animation_;
};
}

View File

@ -41,7 +41,7 @@ namespace easy2d
{
}
void CallFunc::Update(Node*)
void CallFunc::Update(Node*, Duration const&)
{
callback_();
this->Stop();

View File

@ -48,7 +48,7 @@ namespace easy2d
virtual void Init(Node*) override;
// 更新动作
virtual void Update(Node*) override;
virtual void Update(Node*, Duration const&) override;
protected:
Callback callback_;

View File

@ -19,17 +19,15 @@
// THE SOFTWARE.
#include "Game.h"
#include "Node.h"
#include "Scene.h"
#include "Transition.h"
#include "Image.h"
#include "time.h"
#include "../utils/Player.h"
#include "../math/Matrix.hpp"
#include "render.h"
#include "input.h"
#include "audio.h"
#include "modules.h"
#include "../utils/Player.h"
#include "../math/Matrix.hpp"
#include <thread>
namespace easy2d
@ -131,7 +129,7 @@ namespace easy2d
if (dur.Milliseconds() > min_interval)
{
float dt = (now - last).Seconds();
const auto dt = now - last;
last = now;
devices::Input::Instance().Update(
@ -168,18 +166,27 @@ namespace easy2d
quit_ = true;
}
void Game::EnterScene(spScene const& scene, spTransition const& transition)
bool Game::EnterScene(spScene const & scene)
{
if (!scene)
{
E2D_WARNING("Next scene is null pointer!");
return;
return false;
}
if (curr_scene_ == scene) { return; }
if (curr_scene_ == scene ||
next_scene_ == scene)
return false;
next_scene_ = scene;
return true;
}
bool Game::EnterScene(spScene const& scene, spTransition const& transition)
{
if (!EnterScene(scene))
return false;
if (transition)
{
if (transition_)
@ -189,6 +196,7 @@ namespace easy2d
transition_ = transition;
transition_->Init(curr_scene_, next_scene_);
}
return true;
}
spScene const& Game::GetCurrentScene()
@ -196,32 +204,21 @@ namespace easy2d
return curr_scene_;
}
bool Game::IsTransitioning() const
void Game::UpdateScene(Duration const& dt)
{
return transition_;
}
void Game::UpdateScene(float dt)
{
auto update = [&](spScene const& scene) -> void
if (curr_scene_)
{
if (scene)
{
scene->OnUpdate(dt);
spNode const& root = scene->GetRoot();
if (root)
{
root->UpdateChildren(dt);
}
}
};
curr_scene_->Update(dt);
}
update(curr_scene_);
update(next_scene_);
if (next_scene_)
{
next_scene_->Update(dt);
}
if (transition_)
{
transition_->Update();
transition_->Update(dt);
if (transition_->IsDone())
{
@ -247,6 +244,24 @@ namespace easy2d
}
}
void Game::Dispatch(MouseEvent const & e)
{
if (transition_)
return;
if (curr_scene_)
curr_scene_->Dispatch(e, false);
}
void Game::Dispatch(KeyEvent const & e)
{
if (transition_)
return;
if (curr_scene_)
curr_scene_->Dispatch(e, false);
}
void Game::DrawScene()
{
auto& graphics = devices::Graphics::Instance();
@ -258,22 +273,22 @@ namespace easy2d
}
else if (curr_scene_)
{
curr_scene_->Draw();
curr_scene_->Visit();
}
if (debug_enabled_)
{
if (curr_scene_ && curr_scene_->GetRoot())
if (curr_scene_)
{
graphics.SetTransform(math::Matrix());
graphics.SetBrushOpacity(1.f);
curr_scene_->GetRoot()->DrawBorder();
curr_scene_->DrawBorder();
}
if (next_scene_ && next_scene_->GetRoot())
if (next_scene_)
{
graphics.SetTransform(math::Matrix());
graphics.SetBrushOpacity(1.f);
next_scene_->GetRoot()->DrawBorder();
next_scene_->DrawBorder();
}
graphics.DrawDebugInfo();

View File

@ -21,8 +21,9 @@
#pragma once
#include "base.h"
#include "window.h"
#include "Scene.h"
#include "Transition.h"
#include "time.h"
#include "KeyEvent.h"
#include "MouseEvent.h"
namespace easy2d
{
@ -76,20 +77,31 @@ namespace easy2d
void Quit();
// Çл»³¡¾°
void EnterScene(
spScene const& scene, /* 场景 */
spTransition const& transition = nullptr /* 场景动画 */
bool EnterScene(
spScene const& scene /* 场景 */
);
// 切换场景
bool EnterScene(
spScene const& scene, /* 场景 */
spTransition const& transition /* 场景动画 */
);
// »ñÈ¡µ±Ç°³¡¾°
spScene const& GetCurrentScene();
bool IsTransitioning() const;
void DrawScene();
void UpdateScene(
float dt
Duration const& dt
);
void Dispatch(
MouseEvent const& e
);
void Dispatch(
KeyEvent const& e
);
private:

View File

@ -22,7 +22,6 @@
#include "Scene.h"
#include "Task.h"
#include "Action.hpp"
#include "time.h"
#include "render.h"
#include <iterator>
@ -41,8 +40,6 @@ namespace easy2d
, display_opacity_(1.f)
, real_opacity_(1.f)
, children_()
, actions_()
, tasks_()
, initial_matrix_()
, final_matrix_()
, border_color_(Color::Red, 0.6f)
@ -112,13 +109,13 @@ namespace easy2d
}
}
void Node::UpdateChildren(float dt)
void Node::Update(Duration const& dt)
{
if (children_.empty())
{
OnUpdate(dt);
UpdateActions();
UpdateTasks();
UpdateActions(this, dt);
UpdateTasks(dt);
UpdateTransform();
}
else
@ -130,7 +127,7 @@ namespace easy2d
// 访问 Order 小于零的节点
if (child->GetOrder() < 0)
{
child->UpdateChildren(dt);
child->Update(dt);
}
else
{
@ -139,13 +136,13 @@ namespace easy2d
}
OnUpdate(dt);
UpdateActions();
UpdateTasks();
UpdateActions(this, dt);
UpdateTasks(dt);
UpdateTransform();
// 访问剩余节点
for (; i < children_.size(); ++i)
children_[i]->UpdateChildren(dt);
children_[i]->Update(dt);
}
}
@ -176,8 +173,8 @@ namespace easy2d
// 根据自身支点计算 Initial 矩阵,子节点将根据这个矩阵进行变换
auto pivot = Point(
transform_.size.width * transform_.pivot_x,
transform_.size.height * transform_.pivot_y
transform_.size.width * transform_.pivot.x,
transform_.size.height * transform_.pivot.y
);
initial_matrix_ = final_matrix_ * math::Matrix::Translation(pivot);
@ -243,38 +240,6 @@ namespace easy2d
}
}
void Node::UpdateActions()
{
if (actions_.empty())
return;
std::vector<spAction> currActions;
currActions.reserve(actions_.size());
std::copy_if(
actions_.begin(),
actions_.end(),
std::back_inserter(currActions),
[](spAction action) { return action->IsRunning() && !action->IsDone(); }
);
// 遍历所有正在运行的动作
for (const auto& action : currActions)
action->Update(this);
// 清除完成的动作
for (auto iter = actions_.begin(); iter != actions_.end();)
{
if ((*iter)->IsDone())
{
iter = actions_.erase(iter);
}
else
{
++iter;
}
}
}
bool Node::IsVisible() const
{
return visible_;
@ -297,12 +262,12 @@ namespace easy2d
float Node::GetWidth() const
{
return transform_.size.width * transform_.scale_x;
return transform_.size.width * transform_.scale.x;
}
float Node::GetHeight() const
{
return transform_.size.height * transform_.scale_y;
return transform_.size.height * transform_.scale.y;
}
float Node::GetRealWidth() const
@ -322,12 +287,12 @@ namespace easy2d
float Node::GetPivotX() const
{
return transform_.pivot_x;
return transform_.pivot.x;
}
float Node::GetPivotY() const
{
return transform_.pivot_y;
return transform_.pivot.y;
}
Size Node::GetSize() const
@ -337,22 +302,22 @@ namespace easy2d
float Node::GetScaleX() const
{
return transform_.scale_x;
return transform_.scale.x;
}
float Node::GetScaleY() const
{
return transform_.scale_y;
return transform_.scale.y;
}
float Node::GetSkewX() const
{
return transform_.skew_x;
return transform_.skew.x;
}
float Node::GetSkewY() const
{
return transform_.skew_y;
return transform_.skew.y;
}
float Node::GetRotation() const
@ -360,11 +325,6 @@ namespace easy2d
return transform_.rotation;
}
const math::Transform & Node::GetTransform() const
{
return transform_;
}
float Node::GetOpacity() const
{
return real_opacity_;
@ -429,12 +389,12 @@ namespace easy2d
void Node::SetScaleX(float scale_x)
{
this->SetScale(scale_x, transform_.scale_y);
this->SetScale(scale_x, transform_.scale.y);
}
void Node::SetScaleY(float scale_y)
{
this->SetScale(transform_.scale_x, scale_y);
this->SetScale(transform_.scale.x, scale_y);
}
void Node::SetScale(float scale)
@ -444,31 +404,31 @@ namespace easy2d
void Node::SetScale(float scale_x, float scale_y)
{
if (transform_.scale_x == scale_x && transform_.scale_y == scale_y)
if (transform_.scale.x == scale_x && transform_.scale.y == scale_y)
return;
transform_.scale_x = scale_x;
transform_.scale_y = scale_y;
transform_.scale.x = scale_x;
transform_.scale.y = scale_y;
dirty_transform_ = true;
}
void Node::SetSkewX(float skew_x)
{
this->SetSkew(skew_x, transform_.skew_y);
this->SetSkew(skew_x, transform_.skew.y);
}
void Node::SetSkewY(float skew_y)
{
this->SetSkew(transform_.skew_x, skew_y);
this->SetSkew(transform_.skew.x, skew_y);
}
void Node::SetSkew(float skew_x, float skew_y)
{
if (transform_.skew_x == skew_x && transform_.skew_y == skew_y)
if (transform_.skew.x == skew_x && transform_.skew.y == skew_y)
return;
transform_.skew_x = skew_x;
transform_.skew_y = skew_y;
transform_.skew.x = skew_x;
transform_.skew.y = skew_y;
dirty_transform_ = true;
}
@ -493,21 +453,21 @@ namespace easy2d
void Node::SetPivotX(float pivot_x)
{
this->SetPivot(pivot_x, transform_.pivot_y);
this->SetPivot(pivot_x, transform_.pivot.y);
}
void Node::SetPivotY(float pivot_y)
{
this->SetPivot(transform_.pivot_x, pivot_y);
this->SetPivot(transform_.pivot.x, pivot_y);
}
void Node::SetPivot(float pivot_x, float pivot_y)
{
if (transform_.pivot_x == pivot_x && transform_.pivot_y == pivot_y)
if (transform_.pivot.x == pivot_x && transform_.pivot.y == pivot_y)
return;
transform_.pivot_x = pivot_x;
transform_.pivot_y = pivot_y;
transform_.pivot.x = pivot_x;
transform_.pivot.y = pivot_y;
dirty_transform_ = true;
}
@ -536,7 +496,12 @@ namespace easy2d
this->SetSize(size.width, size.height);
}
void Node::SetTransform(const math::Transform & transform)
math::Transform const& Node::GetTransform() const
{
return transform_;
}
void Node::SetTransform(math::Transform const& transform)
{
transform_ = transform;
dirty_transform_ = true;
@ -695,63 +660,6 @@ namespace easy2d
children_.clear();
}
void Node::RunAction(spAction const& action)
{
E2D_WARNING_IF(!action, "Action NULL pointer exception!");
if (action)
{
auto iter = std::find(actions_.begin(), actions_.end(), action);
if (iter == actions_.end())
{
action->Start();
actions_.push_back(action);
}
}
}
void Node::ResumeAction(const String& name)
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
if (action->GetName() == name)
{
action->Resume();
}
}
}
void Node::PauseAction(const String& name)
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
if (action->GetName() == name)
{
action->Pause();
}
}
}
void Node::StopAction(const String& name)
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
if (action->GetName() == name)
{
action->Stop();
}
}
}
bool Node::ContainsPoint(const Point& point)
{
if (transform_.size.width == 0.f || transform_.size.height == 0.f)
@ -792,169 +700,6 @@ namespace easy2d
relation != D2D1_GEOMETRY_RELATION_DISJOINT;
}
void Node::ResumeAllActions()
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
action->Resume();
}
}
void Node::PauseAllActions()
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
action->Pause();
}
}
void Node::StopAllActions()
{
if (actions_.empty())
return;
for (const auto& action : actions_)
{
action->Stop();
}
}
const Actions& Node::GetAllActions() const
{
return actions_;
}
void Node::AddTask(spTask const& task)
{
if (task)
{
auto iter = std::find(tasks_.begin(), tasks_.end(), task);
if (iter == tasks_.end())
{
task->last_time_ = time::Now();
tasks_.push_back(task);
}
}
}
void Node::StopTasks(const String& name)
{
for (const auto& task : tasks_)
{
if (task->GetName() == name)
{
task->Stop();
}
}
}
void Node::StartTasks(const String& name)
{
for (const auto& task : tasks_)
{
if (task->GetName() == name)
{
task->Start();
}
}
}
void Node::RemoveTasks(const String& name)
{
for (const auto& task : tasks_)
{
if (task->GetName() == name)
{
task->stopped_ = true;
}
}
}
void Node::StopAllTasks()
{
for (const auto& task : tasks_)
{
task->Stop();
}
}
void Node::StartAllTasks()
{
for (const auto& task : tasks_)
{
task->Start();
}
}
void Node::RemoveAllTasks()
{
for (const auto& task : tasks_)
{
task->stopped_ = true;
}
}
const Tasks & Node::GetAllTasks() const
{
return tasks_;
}
void Node::UpdateTasks()
{
if (tasks_.empty())
return;
std::vector<spTask> currTasks;
currTasks.reserve(tasks_.size());
std::copy_if(
tasks_.begin(),
tasks_.end(),
std::back_inserter(currTasks),
[](spTask const& task) { return task->IsReady() && !task->stopped_; }
);
// 遍历就绪的任务
for (const auto& task : currTasks)
task->Update();
// 清除结束的任务
for (auto iter = tasks_.begin(); iter != tasks_.end();)
{
if ((*iter)->stopped_)
{
iter = tasks_.erase(iter);
}
else
{
++iter;
}
}
}
void Node::UpdateTime()
{
for (const auto& action : actions_)
{
action->ResetTime();
}
for (const auto& task : tasks_)
{
task->ResetTime();
}
for (const auto& child : children_)
{
child->UpdateTime();
}
}
void Node::SetVisible(bool val)
{
visible_ = val;

View File

@ -20,24 +20,27 @@
#pragma once
#include "base.h"
#include "time.h"
#include "ActionManager.h"
#include "TaskManager.h"
#include "KeyEvent.h"
#include "MouseEvent.h"
#include "../math/Transform.h"
#include "../math/Transform.hpp"
#include "../math/Matrix.hpp"
namespace easy2d
{
class Game;
class Scene;
class Action;
class Task;
// 节点
class Node
: public RefCounter
, public ActionManager
, public TaskManager
{
friend class Game;
friend class Scene;
friend class Transition;
E2D_DISABLE_COPY(Node);
@ -50,7 +53,7 @@ namespace easy2d
virtual void OnDraw() const {}
// 更新节点
virtual void OnUpdate(float dt) {}
virtual void OnUpdate(Duration const& dt) {}
// 获取节点显示状态
bool IsVisible() const;
@ -106,9 +109,6 @@ namespace easy2d
// 获取节点旋转角度
float GetRotation() const;
// 获取二维转换矩阵
const math::Transform& GetTransform() const;
// 获取节点透明度
float GetOpacity() const;
@ -129,108 +129,108 @@ namespace easy2d
);
// 设置节点横坐标
virtual void SetPositionX(
void SetPositionX(
float x
);
// 设置节点纵坐标
virtual void SetPositionY(
void SetPositionY(
float y
);
// 设置节点坐标
virtual void SetPosition(
void SetPosition(
const Point & point
);
// 设置节点坐标
virtual void SetPosition(
void SetPosition(
float x,
float y
);
// 移动节点
virtual void MoveBy(
void MoveBy(
float x,
float y
);
// 移动节点
virtual void MoveBy(
void MoveBy(
const Point & vector
);
// 设置节点绘图顺序
// 默认为 0
virtual void SetOrder(
void SetOrder(
int order
);
// 设置横向缩放比例
// 默认为 1.0
virtual void SetScaleX(
void SetScaleX(
float scale_x
);
// 设置纵向缩放比例
// 默认为 1.0
virtual void SetScaleY(
void SetScaleY(
float scale_y
);
// 设置缩放比例
// 默认为 (1.0, 1.0)
virtual void SetScale(
void SetScale(
float scale_x,
float scale_y
);
// 设置缩放比例
// 默认为 1.0
virtual void SetScale(
void SetScale(
float scale
);
// 设置横向倾斜角度
// 默认为 0
virtual void SetSkewX(
void SetSkewX(
float skew_x
);
// 设置纵向倾斜角度
// 默认为 0
virtual void SetSkewY(
void SetSkewY(
float skew_y
);
// 设置倾斜角度
// 默认为 (0, 0)
virtual void SetSkew(
void SetSkew(
float skew_x,
float skew_y
);
// 设置旋转角度
// 默认为 0
virtual void SetRotation(
void SetRotation(
float rotation
);
// 设置透明度
// 默认为 1.0, 范围 [0, 1]
virtual void SetOpacity(
void SetOpacity(
float opacity
);
// 设置支点的横向位置
// 默认为 0, 范围 [0, 1]
virtual void SetPivotX(
void SetPivotX(
float pivot_x
);
// 设置支点的纵向位置
// 默认为 0, 范围 [0, 1]
virtual void SetPivotY(
void SetPivotY(
float pivot_y
);
@ -247,36 +247,37 @@ namespace easy2d
);
// 修改节点高度
virtual void SetHeight(
void SetHeight(
float height
);
// 修改节点大小
virtual void SetSize(
void SetSize(
float width,
float height
);
// 修改节点大小
virtual void SetSize(
void SetSize(
const Size & size
);
// 设置二维转换
virtual void SetTransform(
const math::Transform& transform
);
// 启用或关闭渲染区域裁剪
virtual void SetClipEnabled(
void SetClipEnabled(
bool enabled
);
// 设置节点边缘颜色
virtual void SetBorderColor(
void SetBorderColor(
const Color& color
);
math::Transform const& GetTransform() const;
void SetTransform(
math::Transform const& transform
);
// 判断点是否在节点内
bool ContainsPoint(
const Point& point
@ -331,109 +332,29 @@ namespace easy2d
// 从父节点移除
void RemoveFromParent();
// 执行动作
void RunAction(
spAction const& action
);
// 继续动作
void ResumeAction(
const String& name
);
// 暂停动作
void PauseAction(
const String& name
);
// 停止动作
void StopAction(
const String& name
);
// 继续所有暂停动作
void ResumeAllActions();
// 暂停所有动作
void PauseAllActions();
// 停止所有动作
void StopAllActions();
// 获取所有动作
const Actions& GetAllActions() const;
// 添加任务
void AddTask(
spTask const& task
);
// 启动任务
void StartTasks(
const String& task_name
);
// 停止任务
void StopTasks(
const String& task_name
);
// 移除任务
void RemoveTasks(
const String& task_name
);
// 启动所有任务
void StartAllTasks();
// 停止所有任务
void StopAllTasks();
// 移除所有任务
void RemoveAllTasks();
// 获取所有任务
const Tasks& GetAllTasks() const;
protected:
// 遍历节点
virtual void Visit();
// 分发鼠标消息
virtual bool Dispatch(
const MouseEvent& e,
bool handled
);
// 分发按键消息
virtual bool Dispatch(
const KeyEvent& e,
bool handled
);
private:
// 渲染节点边缘
protected:
void DrawBorder();
// 更新子节点
void UpdateChildren(float dt);
void Update(Duration const& dt);
// 更新转换矩阵
void UpdateTransform();
// 更新节点透明度
void UpdateOpacity();
// 更新动作
void UpdateActions();
// 更新任务
void UpdateTasks();
// 更新节点时间
void UpdateTime();
private:
protected:
String name_;
size_t hash_name_;
float display_opacity_;
@ -445,8 +366,6 @@ namespace easy2d
bool dirty_transform_;
Node* parent_;
Color border_color_;
Actions actions_;
Tasks tasks_;
Nodes children_;
ID2D1Geometry* border_;
math::Transform transform_;

View File

@ -24,83 +24,10 @@
namespace easy2d
{
Scene::Scene()
: root_(nullptr)
, transform_()
{
}
Scene::Scene(spNode const& root)
: root_(nullptr)
, transform_()
{
this->SetRoot(root);
}
Scene::~Scene()
{
}
void Scene::SetRoot(spNode const& root)
{
if (root_ == root)
return;
root_ = root;
}
spNode const& Scene::GetRoot() const
{
return root_;
}
void Scene::Draw()
{
if (root_)
{
root_->Visit();
}
}
void Scene::Dispatch(const MouseEvent & e)
{
auto handler = dynamic_cast<MouseEventHandler*>(this);
if (handler)
{
handler->Handle(e);
}
if (root_)
{
root_->Dispatch(e, false);
}
}
void Scene::Dispatch(const KeyEvent & e)
{
auto handler = dynamic_cast<KeyEventHandler*>(this);
if (handler)
{
handler->Handle(e);
}
if (root_)
{
root_->Dispatch(e, false);
}
}
void Scene::SetTransform(const math::Matrix& matrix)
{
transform_ = matrix;
if (root_)
{
root_->dirty_transform_ = true;
}
}
const math::Matrix& Scene::GetTransform() const
{
return transform_;
}
}

View File

@ -19,28 +19,19 @@
// THE SOFTWARE.
#pragma once
#include "base.h"
#include "KeyEvent.h"
#include "MouseEvent.h"
#include "../math/Matrix.hpp"
#include "Node.h"
namespace easy2d
{
class Node;
// 场景
class Scene
: public RefCounter
: public Node
{
E2D_DISABLE_COPY(Scene);
public:
Scene();
explicit Scene(
spNode const& root
);
virtual ~Scene();
// 进入场景
@ -48,41 +39,5 @@ namespace easy2d
// 退出场景
virtual void OnExit() {}
// 更新场景
virtual void OnUpdate(float dt) {}
// 设置根节点
void SetRoot(
spNode const& root
);
// 获取根节点
spNode const& GetRoot() const;
// 渲染场景
void Draw();
// 分发鼠标消息
virtual void Dispatch(
const MouseEvent& e
);
// 分发按键消息
virtual void Dispatch(
const KeyEvent& e
);
// 设置转换矩阵
void SetTransform(
const math::Matrix& matrix
);
// 获取转换矩阵
const math::Matrix& GetTransform() const;
private:
spNode root_;
math::Matrix transform_;
};
}

View File

@ -35,13 +35,14 @@ namespace easy2d
, delay_(delay)
, callback_(func)
, name_(name)
, delta_()
{
}
void Task::Start()
{
running_ = true;
last_time_ = time::Now();
delta_ = Duration{};
}
void Task::Stop()
@ -49,16 +50,25 @@ namespace easy2d
running_ = false;
}
void Task::Update()
void Task::Update(Duration const& dt)
{
if (!running_)
return;
if (total_times_ == 0)
{
stopped_ = true;
return;
}
if (!delay_.IsZero())
{
delta_ += dt;
if (delta_ < delay_)
return;
}
++run_times_;
last_time_ += delay_;
if (callback_)
{
@ -72,25 +82,9 @@ namespace easy2d
}
}
void Task::ResetTime()
void Task::Reset()
{
last_time_ = time::Now();
}
bool Task::IsReady() const
{
if (running_)
{
if (delay_.Milliseconds() == 0)
{
return true;
}
if (time::Now() - last_time_ >= delay_)
{
return true;
}
}
return false;
delta_ = Duration{};
}
bool Task::IsRunning() const

View File

@ -25,11 +25,13 @@
namespace easy2d
{
class TaskManager;
// 定时任务
class Task
: public RefCounter
{
friend class Node;
friend class TaskManager;
typedef std::function<void()> Callback;
@ -59,11 +61,9 @@ namespace easy2d
const String& GetName() const;
protected:
bool IsReady() const;
void Update(Duration const& dt);
void Update();
void ResetTime();
void Reset();
private:
bool running_;
@ -72,7 +72,7 @@ namespace easy2d
int total_times_;
String name_;
Duration delay_;
TimePoint last_time_;
Duration delta_;
Callback callback_;
};
}

131
core/base/TaskManager.cpp Normal file
View File

@ -0,0 +1,131 @@
// Copyright (c) 2016-2018 Easy2D - 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.
#include "TaskManager.h"
namespace easy2d
{
void TaskManager::AddTask(spTask const& task)
{
if (task)
{
auto iter = std::find(tasks_.begin(), tasks_.end(), task);
if (iter == tasks_.end())
{
task->Reset();
tasks_.push_back(task);
}
}
}
void TaskManager::StopTasks(const String& name)
{
for (const auto& task : tasks_)
{
if (task->GetName() == name)
{
task->Stop();
}
}
}
void TaskManager::StartTasks(const String& name)
{
for (const auto& task : tasks_)
{
if (task->GetName() == name)
{
task->Start();
}
}
}
void TaskManager::RemoveTasks(const String& name)
{
for (const auto& task : tasks_)
{
if (task->GetName() == name)
{
task->stopped_ = true;
}
}
}
void TaskManager::StopAllTasks()
{
for (const auto& task : tasks_)
{
task->Stop();
}
}
void TaskManager::StartAllTasks()
{
for (const auto& task : tasks_)
{
task->Start();
}
}
void TaskManager::RemoveAllTasks()
{
for (const auto& task : tasks_)
{
task->stopped_ = true;
}
}
const Tasks & TaskManager::GetAllTasks() const
{
return tasks_;
}
void TaskManager::UpdateTasks(Duration const& dt)
{
if (tasks_.empty())
return;
std::vector<spTask> currTasks;
currTasks.reserve(tasks_.size());
std::copy_if(
tasks_.begin(),
tasks_.end(),
std::back_inserter(currTasks),
[](spTask const& task) { return !task->stopped_; }
);
// 遍历就绪的任务
for (const auto& task : currTasks)
task->Update(dt);
// 清除结束的任务
for (auto iter = tasks_.begin(); iter != tasks_.end();)
{
if ((*iter)->stopped_)
{
iter = tasks_.erase(iter);
}
else
{
++iter;
}
}
}
}

View File

@ -18,45 +18,50 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "Transform.h"
#pragma once
#include "Task.h"
namespace easy2d
{
namespace math
class TaskManager
{
Transform::Transform()
: position()
, size()
, scale_x(1.f)
, scale_y(1.f)
, rotation(0)
, skew_x(0)
, skew_y(0)
, pivot_x(0)
, pivot_y(0)
{
}
public:
// 添加任务
void AddTask(
spTask const& task
);
Matrix Transform::ToMatrix() const
{
auto pivot = Vector2(size.width * pivot_x, size.height * pivot_y);
return Matrix().Scale(scale_x, scale_y, pivot)
.Skew(skew_x, skew_y, pivot)
.Rotate(rotation, pivot)
.Translate(position - pivot);
}
// 启动任务
void StartTasks(
const String& task_name
);
bool Transform::operator==(const Transform & other) const
{
return position == other.position &&
size == other.size &&
scale_x == other.scale_x &&
scale_y == other.scale_y &&
skew_x == other.skew_x &&
skew_y == other.skew_y &&
rotation == other.rotation &&
pivot_x == other.pivot_x &&
pivot_y == other.pivot_y;
}
}
}
// 停止任务
void StopTasks(
const String& task_name
);
// 移除任务
void RemoveTasks(
const String& task_name
);
// 启动所有任务
void StartAllTasks();
// 停止所有任务
void StopAllTasks();
// 移除所有任务
void RemoveAllTasks();
// 获取所有任务
const Tasks& GetAllTasks() const;
protected:
void UpdateTasks(Duration const& dt);
protected:
Tasks tasks_;
};
}

View File

@ -23,7 +23,6 @@
#include "Scene.h"
#include "window.h"
#include "render.h"
#include "../math/Matrix.hpp"
namespace easy2d
{
@ -31,9 +30,10 @@ namespace easy2d
// Transition
//-------------------------------------------------------
Transition::Transition(float duration)
Transition::Transition(Duration const& duration)
: done_(false)
, started_()
, duration_(duration)
, delta_()
, process_(0)
, window_size_()
, out_scene_(nullptr)
@ -43,7 +43,6 @@ namespace easy2d
, out_layer_prop_()
, in_layer_prop_()
{
duration_ = std::max(duration, 0.f);
}
Transition::~Transition()
@ -59,7 +58,9 @@ namespace easy2d
void Transition::Init(spScene const& prev, spScene const& next)
{
started_ = time::Now();
process_ = 0;
delta_ = Duration{};
out_scene_ = prev;
in_scene_ = next;
@ -81,16 +82,16 @@ namespace easy2d
out_layer_prop_ = in_layer_prop_ = LayerProperties{ Rect(Point(), window_size_),1.f };
}
void Transition::Update()
void Transition::Update(Duration const& dt)
{
if (duration_ == 0)
if (duration_.IsZero())
{
process_ = 1;
}
else
{
process_ = (time::Now() - started_).Seconds() / duration_;
process_ = std::min(process_, 1.f);
delta_ += dt;
process_ = std::min(delta_ / duration_, 1.f);
}
if (process_ >= 1)
@ -101,32 +102,34 @@ namespace easy2d
void Transition::Draw()
{
auto& graphics = devices::Graphics::Instance();
if (out_scene_)
{
devices::Graphics::Instance().PushClip(
out_scene_->GetTransform(),
graphics.PushClip(
out_scene_->GetTransform().ToMatrix(),
window_size_
);
devices::Graphics::Instance().PushLayer(out_layer_, out_layer_prop_);
graphics.PushLayer(out_layer_, out_layer_prop_);
out_scene_->Draw();
out_scene_->Visit();
devices::Graphics::Instance().PopLayer();
devices::Graphics::Instance().PopClip();
graphics.PopLayer();
graphics.PopClip();
}
if (in_scene_)
{
devices::Graphics::Instance().PushClip(
in_scene_->GetTransform(),
graphics.PushClip(
in_scene_->GetTransform().ToMatrix(),
window_size_
);
devices::Graphics::Instance().PushLayer(in_layer_, in_layer_prop_);
graphics.PushLayer(in_layer_, in_layer_prop_);
in_scene_->Draw();
in_scene_->Visit();
devices::Graphics::Instance().PopLayer();
devices::Graphics::Instance().PopClip();
graphics.PopLayer();
graphics.PopClip();
}
}
@ -140,7 +143,7 @@ namespace easy2d
// BoxTransition
//-------------------------------------------------------
BoxTransition::BoxTransition(float duration)
BoxTransition::BoxTransition(Duration const& duration)
: Transition(duration)
{
}
@ -152,9 +155,9 @@ namespace easy2d
in_layer_prop_.opacity = 0;
}
void BoxTransition::Update()
void BoxTransition::Update(Duration const& dt)
{
Transition::Update();
Transition::Update(dt);
if (process_ < .5f)
{
@ -182,7 +185,7 @@ namespace easy2d
// EmergeTransition
//-------------------------------------------------------
EmergeTransition::EmergeTransition(float duration)
EmergeTransition::EmergeTransition(Duration const& duration)
: Transition(duration)
{
}
@ -195,9 +198,9 @@ namespace easy2d
in_layer_prop_.opacity = 0;
}
void EmergeTransition::Update()
void EmergeTransition::Update(Duration const& dt)
{
Transition::Update();
Transition::Update(dt);
out_layer_prop_.opacity = 1 - process_;
in_layer_prop_.opacity = process_;
@ -207,7 +210,7 @@ namespace easy2d
// FadeTransition
//-------------------------------------------------------
FadeTransition::FadeTransition(float duration)
FadeTransition::FadeTransition(Duration const& duration)
: Transition(duration)
{
}
@ -220,9 +223,9 @@ namespace easy2d
in_layer_prop_.opacity = 0;
}
void FadeTransition::Update()
void FadeTransition::Update(Duration const& dt)
{
Transition::Update();
Transition::Update(dt);
if (process_ < 0.5)
{
@ -240,7 +243,7 @@ namespace easy2d
// MoveTransition
//-------------------------------------------------------
MoveTransition::MoveTransition(float duration, Direction direction)
MoveTransition::MoveTransition(Duration const& duration, Direction direction)
: Transition(duration)
, direction_(direction)
{
@ -272,44 +275,33 @@ namespace easy2d
if (out_scene_)
{
out_scene_->SetTransform(math::Matrix());
out_scene_->SetTransform(math::Transform{});
}
if (in_scene_)
{
in_scene_->SetTransform(
math::Matrix::Translation(
start_pos_.x,
start_pos_.y
)
);
auto transform = math::Transform{};
transform.position = start_pos_;
in_scene_->SetTransform(transform);
}
}
void MoveTransition::Update()
void MoveTransition::Update(Duration const& dt)
{
Transition::Update();
Transition::Update(dt);
if (out_scene_)
{
auto translation = pos_delta_ * process_;
out_scene_->SetTransform(
math::Matrix::Translation(
translation.x,
translation.y
)
);
auto transform = math::Transform{};
transform.position = pos_delta_ * process_;
out_scene_->SetTransform(transform);
}
if (in_scene_)
{
auto translation = start_pos_ + pos_delta_ * process_;
in_scene_->SetTransform(
math::Matrix::Translation(
translation.x,
translation.y
)
);
auto transform = math::Transform{};
transform.position = start_pos_ + pos_delta_ * process_;
in_scene_->SetTransform(transform);
}
}
@ -317,12 +309,12 @@ namespace easy2d
{
if (out_scene_)
{
out_scene_->SetTransform(math::Matrix());
out_scene_->SetTransform(math::Transform{});
}
if (in_scene_)
{
in_scene_->SetTransform(math::Matrix());
in_scene_->SetTransform(math::Transform{});
}
}
@ -330,7 +322,7 @@ namespace easy2d
// RotationTransition
//-------------------------------------------------------
RotationTransition::RotationTransition(float duration, float rotation)
RotationTransition::RotationTransition(Duration const& duration, float rotation)
: Transition(duration)
, rotation_(rotation)
{
@ -340,42 +332,35 @@ namespace easy2d
{
Transition::Init(prev, next);
auto transform = math::Transform{};
transform.pivot = Point{ 0.5f, 0.5f };
transform.position = Point{ window_size_.width / 2, window_size_.height / 2 };
if (out_scene_)
{
out_scene_->SetTransform(math::Matrix());
out_scene_->SetTransform(transform);
}
if (in_scene_)
{
in_scene_->SetTransform(math::Matrix());
in_scene_->SetTransform(transform);
}
in_layer_prop_.opacity = 0;
}
void RotationTransition::Update()
void RotationTransition::Update(Duration const& dt)
{
Transition::Update();
auto center_pos = math::Vector2(
window_size_.width / 2,
window_size_.height / 2
);
Transition::Update(dt);
if (process_ < .5f)
{
if (out_scene_)
{
out_scene_->SetTransform(
math::Matrix::Scaling(
(.5f - process_) * 2,
(.5f - process_) * 2,
center_pos
) * math::Matrix::Rotation(
rotation_ * (.5f - process_) * 2,
center_pos
)
);
auto transform = out_scene_->GetTransform();
transform.scale = Point{ (.5f - process_) * 2, (.5f - process_) * 2 };
transform.rotation = rotation_ * (.5f - process_) * 2;
out_scene_->SetTransform(transform);
}
}
else
@ -385,16 +370,11 @@ namespace easy2d
out_layer_prop_.opacity = 0;
in_layer_prop_.opacity = 1;
in_scene_->SetTransform(
math::Matrix::Scaling(
(process_ - .5f) * 2,
(process_ - .5f) * 2,
center_pos
) * math::Matrix::Rotation(
rotation_ * (process_ - .5f) * 2,
center_pos
)
);
auto transform = in_scene_->GetTransform();
transform.scale = Point{ (process_ - .5f) * 2, (process_ - .5f) * 2 };
transform.rotation = rotation_ * (process_ - .5f) * 2;
in_scene_->SetTransform(transform);
}
}
}
@ -403,12 +383,12 @@ namespace easy2d
{
if (out_scene_)
{
out_scene_->SetTransform(math::Matrix());
out_scene_->SetTransform(math::Transform{});
}
if (in_scene_)
{
in_scene_->SetTransform(math::Matrix());
in_scene_->SetTransform(math::Transform{});
}
}
}

View File

@ -34,38 +34,32 @@ namespace easy2d
public:
explicit Transition(
float duration
Duration const& duration
);
virtual ~Transition();
// 场景过渡动画是否结束
bool IsDone();
protected:
// 初始化场景过渡动画
virtual void Init(
spScene const& prev,
spScene const& next
);
// 更新场景过渡动画
virtual void Update();
virtual void Update(Duration const& dt);
// 渲染场景过渡动画
virtual void Draw();
// 停止场景过渡动画
virtual void Stop();
// 重置场景过渡动画
virtual void Reset() { };
protected:
bool done_;
float duration_;
float process_;
TimePoint started_;
Duration duration_;
Duration delta_;
Size window_size_;
spScene out_scene_;
spScene in_scene_;
@ -82,12 +76,12 @@ namespace easy2d
{
public:
explicit FadeTransition(
float duration /* 动画持续时长 */
Duration const& duration /* 动画持续时长 */
);
protected:
// ¸üж¯»­
virtual void Update() override;
virtual void Update(Duration const& dt) override;
virtual void Init(
spScene const& prev,
@ -102,11 +96,11 @@ namespace easy2d
{
public:
explicit EmergeTransition(
float duration /* 动画持续时长 */
Duration const& duration /* 动画持续时长 */
);
protected:
virtual void Update() override;
virtual void Update(Duration const& dt) override;
virtual void Init(
spScene const& prev,
@ -121,11 +115,11 @@ namespace easy2d
{
public:
explicit BoxTransition(
float duration /* 动画持续时长 */
Duration const& duration /* 动画持续时长 */
);
protected:
virtual void Update() override;
virtual void Update(Duration const& dt) override;
virtual void Init(
spScene const& prev,
@ -140,12 +134,12 @@ namespace easy2d
{
public:
explicit MoveTransition(
float moveDuration, /* 动画持续时长 */
Direction direction = Direction::Left /* 移动方向 */
Duration const& moveDuration, /* 动画持续时长 */
Direction direction /* 移动方向 */
);
protected:
virtual void Update() override;
virtual void Update(Duration const& dt) override;
virtual void Init(
spScene const& prev,
@ -167,12 +161,12 @@ namespace easy2d
{
public:
explicit RotationTransition(
float moveDuration, /* 动画持续时长 */
float rotation = 360 /* 旋转度数 */
Duration const& moveDuration, /* 动画持续时长 */
float rotation = 360 /* 旋转度数 */
);
protected:
virtual void Update() override;
virtual void Update(Duration const& dt) override;
virtual void Init(
spScene const& prev,

View File

@ -56,16 +56,6 @@ namespace easy2d
{
}
time_t TimePoint::GetTimeStamp() const
{
return static_cast<time_t>(dur_since_epoch_.Seconds());
}
bool TimePoint::IsZero() const
{
return !!dur_since_epoch_.Milliseconds();
}
const TimePoint TimePoint::operator+(const Duration & dur) const
{
return TimePoint(dur_since_epoch_ + dur);
@ -145,11 +135,6 @@ namespace easy2d
{
}
int64_t Duration::Milliseconds() const
{
return milliseconds_;
}
float Duration::Seconds() const
{
int64_t sec = milliseconds_ / Second.milliseconds_;
@ -173,7 +158,7 @@ namespace easy2d
std::wstring easy2d::time::Duration::ToString() const
{
if (milliseconds_ == 0LL)
if (IsZero())
{
return std::wstring(L"0s");
}
@ -246,6 +231,11 @@ namespace easy2d
return milliseconds_ <= other.milliseconds_;
}
float easy2d::time::Duration::operator/(const Duration & other) const
{
return static_cast<float>(milliseconds_) / other.milliseconds_;
}
const Duration Duration::operator+(const Duration & other) const
{
return Duration(milliseconds_ + other.milliseconds_);

View File

@ -49,7 +49,7 @@ namespace easy2d
);
// 转化为毫秒
int64_t Milliseconds() const;
inline int64_t Milliseconds() const { return milliseconds_; }
// 转化为秒
float Seconds() const;
@ -60,6 +60,9 @@ namespace easy2d
// 转化为小时
float Hours() const;
// 时长是否是零
inline bool IsZero() const { return milliseconds_ == 0LL; }
// 转为字符串
std::wstring ToString() const;
@ -70,6 +73,8 @@ namespace easy2d
bool operator< (const Duration &) const;
bool operator<= (const Duration &) const;
float operator / (const Duration &) const;
const Duration operator + (const Duration &) const;
const Duration operator - (const Duration &) const;
const Duration operator - () const;
@ -155,11 +160,13 @@ namespace easy2d
TimePoint&& other
);
inline Duration const& SinceEpoch() const { return dur_since_epoch_; }
// 获取时间戳
time_t GetTimeStamp() const;
inline time_t GetTimeStamp() const { return static_cast<time_t>(dur_since_epoch_.Seconds()); }
// 是否是零时
bool IsZero() const;
inline bool IsZero() const { return dur_since_epoch_.IsZero(); }
const TimePoint operator + (const Duration &) const;
const TimePoint operator - (const Duration &) const;

View File

@ -21,7 +21,6 @@
#include "window.h"
#include "render.h"
#include "Game.h"
#include "Scene.h"
#include "KeyEvent.h"
#include "MouseEvent.h"
#include "../math/scalar.hpp"
@ -284,14 +283,7 @@ namespace easy2d
case WM_MOUSEMOVE:
case WM_MOUSEWHEEL:
{
if (game->IsTransitioning())
break;
auto curr_scene = game->GetCurrentScene();
if (curr_scene)
{
curr_scene->Dispatch(MouseEvent(msg, w_param, l_param));
}
game->Dispatch(MouseEvent(msg, w_param, l_param));
}
result = 0;
was_handled = true;
@ -301,14 +293,7 @@ namespace easy2d
case WM_KEYDOWN:
case WM_KEYUP:
{
if (game->IsTransitioning())
break;
auto curr_scene = game->GetCurrentScene();
if (curr_scene)
{
curr_scene->Dispatch(KeyEvent(msg, w_param, l_param));
}
game->Dispatch(KeyEvent(msg, w_param, l_param));
}
result = 0;
was_handled = true;

View File

@ -76,7 +76,7 @@
#include "math/scalar.hpp"
#include "math/vector.hpp"
#include "math/Matrix.hpp"
#include "math/Transform.h"
#include "math/Transform.hpp"
#include "math/rand.h"

69
core/math/Transform.hpp Normal file
View File

@ -0,0 +1,69 @@
// Copyright (c) 2016-2018 Easy2D - 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 "../base/BaseTypes.h"
#include "Matrix.hpp"
namespace easy2d
{
namespace math
{
class Transform
{
public:
Size size; // 大小
float rotation; // 旋转
math::Vector2 position; // 坐标
math::Vector2 scale; // 缩放
math::Vector2 skew; // 错切角度
math::Vector2 pivot; // 支点
public:
Transform()
: position()
, size()
, rotation(0)
, scale(1.f, 1.f)
, skew(0.f, 0.f)
, pivot(0.f, 0.f)
{}
inline Matrix ToMatrix() const
{
auto center = Vector2{ size.width * pivot.x, size.height * pivot.y };
return Matrix{}.Scale(scale.x, scale.y, center)
.Skew(skew.x, skew.y, center)
.Rotate(rotation, center)
.Translate(position - center);
}
bool operator== (const Transform& other) const
{
return position == other.position &&
size == other.size &&
scale == other.scale &&
skew == other.skew &&
rotation == other.rotation &&
pivot == other.pivot;
}
};
}
}

View File

@ -73,22 +73,22 @@ namespace easy2d
);
// 设置一般情况下显示的按钮
virtual void SetNormal(
void SetNormal(
spNode const& normal
);
// 设置鼠标移入按钮时显示的按钮
virtual void SetMouseOver(
void SetMouseOver(
spNode const& mouseover
);
// 设置鼠标按下按钮时显示的按钮
virtual void SetSelected(
void SetSelected(
spNode const& selected
);
// 设置按钮被禁用时显示的按钮
virtual void SetDisabled(
void SetDisabled(
spNode const& disabled
);

View File

@ -22,6 +22,7 @@
<ClInclude Include="..\..\core\base\Action.hpp" />
<ClInclude Include="..\..\core\base\ActionCombined.h" />
<ClInclude Include="..\..\core\base\ActionFiniteTime.h" />
<ClInclude Include="..\..\core\base\ActionManager.h" />
<ClInclude Include="..\..\core\base\Animation.h" />
<ClInclude Include="..\..\core\base\audio.h" />
<ClInclude Include="..\..\core\base\base.h" />
@ -50,6 +51,7 @@
<ClInclude Include="..\..\core\base\Size.h" />
<ClInclude Include="..\..\core\base\Sprite.h" />
<ClInclude Include="..\..\core\base\Task.h" />
<ClInclude Include="..\..\core\base\TaskManager.h" />
<ClInclude Include="..\..\core\base\Text.h" />
<ClInclude Include="..\..\core\base\TextRenderer.h" />
<ClInclude Include="..\..\core\base\time.h" />
@ -59,7 +61,7 @@
<ClInclude Include="..\..\core\math\Matrix.hpp" />
<ClInclude Include="..\..\core\math\rand.h" />
<ClInclude Include="..\..\core\math\scalar.hpp" />
<ClInclude Include="..\..\core\math\Transform.h" />
<ClInclude Include="..\..\core\math\Transform.hpp" />
<ClInclude Include="..\..\core\math\vector.hpp" />
<ClInclude Include="..\..\core\ui\Button.h" />
<ClInclude Include="..\..\core\ui\Menu.h" />
@ -72,6 +74,7 @@
<ItemGroup>
<ClCompile Include="..\..\core\base\ActionCombined.cpp" />
<ClCompile Include="..\..\core\base\ActionFiniteTime.cpp" />
<ClCompile Include="..\..\core\base\ActionManager.cpp" />
<ClCompile Include="..\..\core\base\Animation.cpp" />
<ClCompile Include="..\..\core\base\audio.cpp" />
<ClCompile Include="..\..\core\base\CallFunc.cpp" />
@ -92,13 +95,13 @@
<ClCompile Include="..\..\core\base\Size.cpp" />
<ClCompile Include="..\..\core\base\Sprite.cpp" />
<ClCompile Include="..\..\core\base\Task.cpp" />
<ClCompile Include="..\..\core\base\TaskManager.cpp" />
<ClCompile Include="..\..\core\base\Text.cpp" />
<ClCompile Include="..\..\core\base\TextRenderer.cpp" />
<ClCompile Include="..\..\core\base\time.cpp" />
<ClCompile Include="..\..\core\base\Transition.cpp" />
<ClCompile Include="..\..\core\base\window.cpp" />
<ClCompile Include="..\..\core\math\rand.cpp" />
<ClCompile Include="..\..\core\math\Transform.cpp" />
<ClCompile Include="..\..\core\ui\Button.cpp" />
<ClCompile Include="..\..\core\ui\Menu.cpp" />
<ClCompile Include="..\..\core\utils\Data.cpp" />

View File

@ -104,9 +104,6 @@
<ClInclude Include="..\..\core\math\scalar.hpp">
<Filter>math</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Transform.h">
<Filter>math</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\vector.hpp">
<Filter>math</Filter>
</ClInclude>
@ -146,6 +143,15 @@
<ClInclude Include="..\..\core\base\Action.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\ActionManager.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\TaskManager.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Transform.hpp">
<Filter>math</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="base">
@ -243,9 +249,6 @@
<ClCompile Include="..\..\core\math\rand.cpp">
<Filter>math</Filter>
</ClCompile>
<ClCompile Include="..\..\core\math\Transform.cpp">
<Filter>math</Filter>
</ClCompile>
<ClCompile Include="..\..\core\utils\Data.cpp">
<Filter>utils</Filter>
</ClCompile>
@ -270,5 +273,11 @@
<ClCompile Include="..\..\core\base\Music.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\..\core\base\TaskManager.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\..\core\base\ActionManager.cpp">
<Filter>base</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -22,6 +22,7 @@
<ClInclude Include="..\..\core\base\Action.hpp" />
<ClInclude Include="..\..\core\base\ActionCombined.h" />
<ClInclude Include="..\..\core\base\ActionFiniteTime.h" />
<ClInclude Include="..\..\core\base\ActionManager.h" />
<ClInclude Include="..\..\core\base\Animation.h" />
<ClInclude Include="..\..\core\base\audio.h" />
<ClInclude Include="..\..\core\base\base.h" />
@ -50,6 +51,7 @@
<ClInclude Include="..\..\core\base\Size.h" />
<ClInclude Include="..\..\core\base\Sprite.h" />
<ClInclude Include="..\..\core\base\Task.h" />
<ClInclude Include="..\..\core\base\TaskManager.h" />
<ClInclude Include="..\..\core\base\Text.h" />
<ClInclude Include="..\..\core\base\TextRenderer.h" />
<ClInclude Include="..\..\core\base\time.h" />
@ -59,7 +61,7 @@
<ClInclude Include="..\..\core\math\Matrix.hpp" />
<ClInclude Include="..\..\core\math\rand.h" />
<ClInclude Include="..\..\core\math\scalar.hpp" />
<ClInclude Include="..\..\core\math\Transform.h" />
<ClInclude Include="..\..\core\math\Transform.hpp" />
<ClInclude Include="..\..\core\math\vector.hpp" />
<ClInclude Include="..\..\core\ui\Button.h" />
<ClInclude Include="..\..\core\ui\Menu.h" />
@ -72,6 +74,7 @@
<ItemGroup>
<ClCompile Include="..\..\core\base\ActionCombined.cpp" />
<ClCompile Include="..\..\core\base\ActionFiniteTime.cpp" />
<ClCompile Include="..\..\core\base\ActionManager.cpp" />
<ClCompile Include="..\..\core\base\Animation.cpp" />
<ClCompile Include="..\..\core\base\audio.cpp" />
<ClCompile Include="..\..\core\base\CallFunc.cpp" />
@ -92,13 +95,13 @@
<ClCompile Include="..\..\core\base\Size.cpp" />
<ClCompile Include="..\..\core\base\Sprite.cpp" />
<ClCompile Include="..\..\core\base\Task.cpp" />
<ClCompile Include="..\..\core\base\TaskManager.cpp" />
<ClCompile Include="..\..\core\base\Text.cpp" />
<ClCompile Include="..\..\core\base\TextRenderer.cpp" />
<ClCompile Include="..\..\core\base\time.cpp" />
<ClCompile Include="..\..\core\base\Transition.cpp" />
<ClCompile Include="..\..\core\base\window.cpp" />
<ClCompile Include="..\..\core\math\rand.cpp" />
<ClCompile Include="..\..\core\math\Transform.cpp" />
<ClCompile Include="..\..\core\ui\Button.cpp" />
<ClCompile Include="..\..\core\ui\Menu.cpp" />
<ClCompile Include="..\..\core\utils\Data.cpp" />

View File

@ -104,9 +104,6 @@
<ClInclude Include="..\..\core\math\scalar.hpp">
<Filter>math</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Transform.h">
<Filter>math</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\vector.hpp">
<Filter>math</Filter>
</ClInclude>
@ -146,6 +143,15 @@
<ClInclude Include="..\..\core\base\Action.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\ActionManager.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\TaskManager.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Transform.hpp">
<Filter>math</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="base">
@ -243,9 +249,6 @@
<ClCompile Include="..\..\core\math\rand.cpp">
<Filter>math</Filter>
</ClCompile>
<ClCompile Include="..\..\core\math\Transform.cpp">
<Filter>math</Filter>
</ClCompile>
<ClCompile Include="..\..\core\utils\Data.cpp">
<Filter>utils</Filter>
</ClCompile>
@ -270,5 +273,11 @@
<ClCompile Include="..\..\core\base\Music.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\..\core\base\TaskManager.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\..\core\base\ActionManager.cpp">
<Filter>base</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -22,6 +22,7 @@
<ClInclude Include="..\..\core\base\Action.hpp" />
<ClInclude Include="..\..\core\base\ActionCombined.h" />
<ClInclude Include="..\..\core\base\ActionFiniteTime.h" />
<ClInclude Include="..\..\core\base\ActionManager.h" />
<ClInclude Include="..\..\core\base\Animation.h" />
<ClInclude Include="..\..\core\base\audio.h" />
<ClInclude Include="..\..\core\base\base.h" />
@ -50,6 +51,7 @@
<ClInclude Include="..\..\core\base\Size.h" />
<ClInclude Include="..\..\core\base\Sprite.h" />
<ClInclude Include="..\..\core\base\Task.h" />
<ClInclude Include="..\..\core\base\TaskManager.h" />
<ClInclude Include="..\..\core\base\Text.h" />
<ClInclude Include="..\..\core\base\TextRenderer.h" />
<ClInclude Include="..\..\core\base\time.h" />
@ -59,7 +61,7 @@
<ClInclude Include="..\..\core\math\Matrix.hpp" />
<ClInclude Include="..\..\core\math\rand.h" />
<ClInclude Include="..\..\core\math\scalar.hpp" />
<ClInclude Include="..\..\core\math\Transform.h" />
<ClInclude Include="..\..\core\math\Transform.hpp" />
<ClInclude Include="..\..\core\math\vector.hpp" />
<ClInclude Include="..\..\core\ui\Button.h" />
<ClInclude Include="..\..\core\ui\Menu.h" />
@ -72,6 +74,7 @@
<ItemGroup>
<ClCompile Include="..\..\core\base\ActionCombined.cpp" />
<ClCompile Include="..\..\core\base\ActionFiniteTime.cpp" />
<ClCompile Include="..\..\core\base\ActionManager.cpp" />
<ClCompile Include="..\..\core\base\Animation.cpp" />
<ClCompile Include="..\..\core\base\audio.cpp" />
<ClCompile Include="..\..\core\base\CallFunc.cpp" />
@ -92,13 +95,13 @@
<ClCompile Include="..\..\core\base\Size.cpp" />
<ClCompile Include="..\..\core\base\Sprite.cpp" />
<ClCompile Include="..\..\core\base\Task.cpp" />
<ClCompile Include="..\..\core\base\TaskManager.cpp" />
<ClCompile Include="..\..\core\base\Text.cpp" />
<ClCompile Include="..\..\core\base\TextRenderer.cpp" />
<ClCompile Include="..\..\core\base\time.cpp" />
<ClCompile Include="..\..\core\base\Transition.cpp" />
<ClCompile Include="..\..\core\base\window.cpp" />
<ClCompile Include="..\..\core\math\rand.cpp" />
<ClCompile Include="..\..\core\math\Transform.cpp" />
<ClCompile Include="..\..\core\ui\Button.cpp" />
<ClCompile Include="..\..\core\ui\Menu.cpp" />
<ClCompile Include="..\..\core\utils\Data.cpp" />
@ -197,7 +200,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>false</SDLCheck>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<DebugInformationFormat>None</DebugInformationFormat>
<MinimalRebuild>false</MinimalRebuild>
<TreatWarningAsError>true</TreatWarningAsError>
</ClCompile>

View File

@ -104,9 +104,6 @@
<ClInclude Include="..\..\core\math\scalar.hpp">
<Filter>math</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Transform.h">
<Filter>math</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\vector.hpp">
<Filter>math</Filter>
</ClInclude>
@ -146,6 +143,15 @@
<ClInclude Include="..\..\core\base\Action.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\ActionManager.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\TaskManager.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Transform.hpp">
<Filter>math</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="base">
@ -243,9 +249,6 @@
<ClCompile Include="..\..\core\math\rand.cpp">
<Filter>math</Filter>
</ClCompile>
<ClCompile Include="..\..\core\math\Transform.cpp">
<Filter>math</Filter>
</ClCompile>
<ClCompile Include="..\..\core\utils\Data.cpp">
<Filter>utils</Filter>
</ClCompile>
@ -270,5 +273,11 @@
<ClCompile Include="..\..\core\base\Music.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\..\core\base\TaskManager.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\..\core\base\ActionManager.cpp">
<Filter>base</Filter>
</ClCompile>
</ItemGroup>
</Project>