移除ActionManager
This commit is contained in:
		
							parent
							
								
									8984817dd8
								
							
						
					
					
						commit
						11e9d1ce9b
					
				|  | @ -7,12 +7,10 @@ e2d::Action::Action() | ||||||
| 	, initialized_(false) | 	, initialized_(false) | ||||||
| 	, target_(nullptr) | 	, target_(nullptr) | ||||||
| { | { | ||||||
| 	ActionManager::GetInstance()->Add(this); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Action::~Action() | e2d::Action::~Action() | ||||||
| { | { | ||||||
| 	ActionManager::GetInstance()->Remove(this); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::Action::IsRunning() | bool e2d::Action::IsRunning() | ||||||
|  | @ -57,7 +55,7 @@ void e2d::Action::Reset() | ||||||
| 	started_ = Time::Now(); | 	started_ = Time::Now(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::Action::IsDone() | bool e2d::Action::IsDone() const | ||||||
| { | { | ||||||
| 	return done_; | 	return done_; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -39,7 +39,6 @@ e2d::GC::~GC() | ||||||
| { | { | ||||||
| 	// 删除所有对象
 | 	// 删除所有对象
 | ||||||
| 	Timer::GetInstance()->ClearAllTasks(); | 	Timer::GetInstance()->ClearAllTasks(); | ||||||
| 	ActionManager::GetInstance()->ClearAll(); |  | ||||||
| 
 | 
 | ||||||
| 	cleanup_ = true; | 	cleanup_ = true; | ||||||
| 	for (const auto& ref : pool_) | 	for (const auto& ref : pool_) | ||||||
|  |  | ||||||
|  | @ -47,7 +47,6 @@ void e2d::Game::Start() | ||||||
| 	auto input = Input::GetInstance(); | 	auto input = Input::GetInstance(); | ||||||
| 	auto renderer = Renderer::GetInstance(); | 	auto renderer = Renderer::GetInstance(); | ||||||
| 	auto timer = Timer::GetInstance(); | 	auto timer = Timer::GetInstance(); | ||||||
| 	auto action_manager = ActionManager::GetInstance(); |  | ||||||
| 
 | 
 | ||||||
| 	const int minInterval = 5; | 	const int minInterval = 5; | ||||||
| 	Time last = Time::Now(); | 	Time last = Time::Now(); | ||||||
|  | @ -71,7 +70,6 @@ void e2d::Game::Start() | ||||||
| 			if (!paused_) | 			if (!paused_) | ||||||
| 			{ | 			{ | ||||||
| 				timer->Update(); | 				timer->Update(); | ||||||
| 				action_manager->Update(); |  | ||||||
| 				UpdateScene(); | 				UpdateScene(); | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
|  | @ -103,7 +101,8 @@ void e2d::Game::Resume() | ||||||
| 	if (paused_ && !quit_) | 	if (paused_ && !quit_) | ||||||
| 	{ | 	{ | ||||||
| 		Timer::GetInstance()->UpdateTime(); | 		Timer::GetInstance()->UpdateTime(); | ||||||
| 		ActionManager::GetInstance()->UpdateTime(); | 		if (curr_scene_) | ||||||
|  | 			curr_scene_->UpdateActionsTime(); | ||||||
| 	} | 	} | ||||||
| 	paused_ = false; | 	paused_ = false; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,245 +0,0 @@ | ||||||
| #include "..\e2dmanager.h" |  | ||||||
| #include "..\e2daction.h" |  | ||||||
| #include "..\e2dnode.h" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| e2d::ActionManager * e2d::ActionManager::GetInstance() |  | ||||||
| { |  | ||||||
| 	static ActionManager instance; |  | ||||||
| 	return &instance; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ActionManager::ActionManager() |  | ||||||
| 	: actions_() |  | ||||||
| 	, running_actions_() |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ActionManager::~ActionManager() |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::Update() |  | ||||||
| { |  | ||||||
| 	if (running_actions_.empty()) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	std::vector<Action*> currActions; |  | ||||||
| 	currActions.reserve(running_actions_.size()); |  | ||||||
| 	std::copy_if( |  | ||||||
| 		running_actions_.begin(), |  | ||||||
| 		running_actions_.end(), |  | ||||||
| 		std::back_inserter(currActions), |  | ||||||
| 		[](Action* action) { return action->IsRunning() && !action->IsDone(); } |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 遍历所有正在运行的动作
 |  | ||||||
| 	for (const auto& action : currActions) |  | ||||||
| 		action->Update(); |  | ||||||
| 
 |  | ||||||
| 	// 清除完成的动作
 |  | ||||||
| 	for (auto iter = running_actions_.begin(); iter != running_actions_.end();) |  | ||||||
| 	{ |  | ||||||
| 		if ((*iter)->IsDone()) |  | ||||||
| 		{ |  | ||||||
| 			(*iter)->Release(); |  | ||||||
| 			(*iter)->target_ = nullptr; |  | ||||||
| 			iter = running_actions_.erase(iter); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			++iter; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::Add(Action * action) |  | ||||||
| { |  | ||||||
| 	if (action) |  | ||||||
| 	{ |  | ||||||
| 		auto iter = std::find(actions_.begin(), actions_.end(), action); |  | ||||||
| 		if (iter == actions_.end()) |  | ||||||
| 		{ |  | ||||||
| 			actions_.push_back(action); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::Remove(Action * action) |  | ||||||
| { |  | ||||||
| 	if (actions_.empty() || action == nullptr) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	auto iter = std::find(actions_.begin(), actions_.end(), action); |  | ||||||
| 	if (iter != actions_.end()) |  | ||||||
| 	{ |  | ||||||
| 		actions_.erase(iter); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::ResumeAllBindedWith(Node * target) |  | ||||||
| { |  | ||||||
| 	if (running_actions_.empty() || target == nullptr) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	for (const auto& action : running_actions_) |  | ||||||
| 	{ |  | ||||||
| 		if (action->GetTarget() == target) |  | ||||||
| 		{ |  | ||||||
| 			action->Resume(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::PauseAllBindedWith(Node * target) |  | ||||||
| { |  | ||||||
| 	if (running_actions_.empty() || target == nullptr) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	for (const auto& action : running_actions_) |  | ||||||
| 	{ |  | ||||||
| 		if (action->GetTarget() == target) |  | ||||||
| 		{ |  | ||||||
| 			action->Pause(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::StopAllBindedWith(Node * target) |  | ||||||
| { |  | ||||||
| 	if (running_actions_.empty() || target == nullptr) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	for (const auto& action : running_actions_) |  | ||||||
| 	{ |  | ||||||
| 		if (action->GetTarget() == target) |  | ||||||
| 		{ |  | ||||||
| 			action->Stop(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::Start(Action * action, Node * target, bool paused) |  | ||||||
| { |  | ||||||
| 	WARN_IF(action == nullptr, "Action NULL pointer exception!"); |  | ||||||
| 	WARN_IF(target == nullptr, "GetTarget node NULL pointer exception!"); |  | ||||||
| 
 |  | ||||||
| 	if (action && target) |  | ||||||
| 	{ |  | ||||||
| 		if (action->target_ == nullptr) |  | ||||||
| 		{ |  | ||||||
| 			auto iter = std::find(running_actions_.begin(), running_actions_.end(), action); |  | ||||||
| 			if (iter == running_actions_.end()) |  | ||||||
| 			{ |  | ||||||
| 				action->Retain(); |  | ||||||
| 				action->StartWithTarget(target); |  | ||||||
| 				action->running_ = !paused; |  | ||||||
| 				running_actions_.push_back(action); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			throw Exception("该 Action 已有执行目标"); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::Resume(const String& name) |  | ||||||
| { |  | ||||||
| 	if (running_actions_.empty() || name.IsEmpty()) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	for (const auto& action : running_actions_) |  | ||||||
| 	{ |  | ||||||
| 		if (action->GetName() == name) |  | ||||||
| 		{ |  | ||||||
| 			action->Resume(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::Pause(const String& name) |  | ||||||
| { |  | ||||||
| 	if (running_actions_.empty() || name.IsEmpty()) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	for (const auto& action : running_actions_) |  | ||||||
| 	{ |  | ||||||
| 		if (action->GetName() == name) |  | ||||||
| 		{ |  | ||||||
| 			action->Pause(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::Stop(const String& name) |  | ||||||
| { |  | ||||||
| 	if (running_actions_.empty() || name.IsEmpty()) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	for (const auto& action : running_actions_) |  | ||||||
| 	{ |  | ||||||
| 		if (action->GetName() == name) |  | ||||||
| 		{ |  | ||||||
| 			action->Stop(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::ClearAllBindedWith(Node * target) |  | ||||||
| { |  | ||||||
| 	if (target) |  | ||||||
| 	{ |  | ||||||
| 		auto iter = std::find_if( |  | ||||||
| 			running_actions_.begin(), |  | ||||||
| 			running_actions_.end(), |  | ||||||
| 			[target](Action* action) ->bool { return action->GetTarget() == target; } |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		if (iter != running_actions_.end()) |  | ||||||
| 		{ |  | ||||||
| 			(*iter)->Release(); |  | ||||||
| 			running_actions_.erase(iter); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::ClearAll() |  | ||||||
| { |  | ||||||
| 	if (!running_actions_.empty()) |  | ||||||
| 	{ |  | ||||||
| 		for (const auto& action : running_actions_) |  | ||||||
| 		{ |  | ||||||
| 			action->Release(); |  | ||||||
| 		} |  | ||||||
| 		running_actions_.clear(); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	actions_.clear(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| std::vector<e2d::Action*> e2d::ActionManager::Get(const String& name) |  | ||||||
| { |  | ||||||
| 	std::vector<Action*> actions; |  | ||||||
| 	for (const auto& action : actions_) |  | ||||||
| 	{ |  | ||||||
| 		if (action->GetName() == name) |  | ||||||
| 		{ |  | ||||||
| 			actions.push_back(action); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return std::move(actions); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const std::vector<e2d::Action*>& e2d::ActionManager::GetAll() |  | ||||||
| { |  | ||||||
| 	return actions_; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ActionManager::UpdateTime() |  | ||||||
| { |  | ||||||
| 	for (const auto& action : running_actions_) |  | ||||||
| 	{ |  | ||||||
| 		action->ResetTime(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -31,18 +31,7 @@ e2d::Node::Property e2d::Node::Property::operator-(Property const & prop) const | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| e2d::Node::Node() | e2d::Node::Node() | ||||||
| 	: order_(0) | 	: visible_(true) | ||||||
| 	, pos_() |  | ||||||
| 	, size_() |  | ||||||
| 	, scale_(1.f, 1.f) |  | ||||||
| 	, rotation_(0) |  | ||||||
| 	, skew_(0, 0) |  | ||||||
| 	, display_opacity_(1.f) |  | ||||||
| 	, real_opacity_(1.f) |  | ||||||
| 	, anchor_() |  | ||||||
| 	, initial_matrix_(D2D1::Matrix3x2F::Identity()) |  | ||||||
| 	, final_matrix_(D2D1::Matrix3x2F::Identity()) |  | ||||||
| 	, visible_(true) |  | ||||||
| 	, parent_(nullptr) | 	, parent_(nullptr) | ||||||
| 	, parent_scene_(nullptr) | 	, parent_scene_(nullptr) | ||||||
| 	, hash_name_(0) | 	, hash_name_(0) | ||||||
|  | @ -52,6 +41,19 @@ e2d::Node::Node() | ||||||
| 	, fixed_position_(false) | 	, fixed_position_(false) | ||||||
| 	, collider_(this) | 	, collider_(this) | ||||||
| 	, border_(nullptr) | 	, border_(nullptr) | ||||||
|  | 	, order_(0) | ||||||
|  | 	, pos_() | ||||||
|  | 	, size_() | ||||||
|  | 	, scale_(1.f, 1.f) | ||||||
|  | 	, rotation_(0) | ||||||
|  | 	, skew_(0, 0) | ||||||
|  | 	, display_opacity_(1.f) | ||||||
|  | 	, real_opacity_(1.f) | ||||||
|  | 	, anchor_() | ||||||
|  | 	, children_() | ||||||
|  | 	, actions_() | ||||||
|  | 	, initial_matrix_(D2D1::Matrix3x2F::Identity()) | ||||||
|  | 	, final_matrix_(D2D1::Matrix3x2F::Identity()) | ||||||
| 	, border_color_(Color::Red, 0.6f) | 	, border_color_(Color::Red, 0.6f) | ||||||
| 	, extrapolate_(Property::Origin) | 	, extrapolate_(Property::Origin) | ||||||
| { | { | ||||||
|  | @ -61,7 +63,11 @@ e2d::Node::~Node() | ||||||
| { | { | ||||||
| 	SafeRelease(border_); | 	SafeRelease(border_); | ||||||
| 
 | 
 | ||||||
| 	ActionManager::GetInstance()->ClearAllBindedWith(this); | 	for (const auto& action : actions_) | ||||||
|  | 	{ | ||||||
|  | 		GC::GetInstance()->SafeRelease(action); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for (const auto& child : children_) | 	for (const auto& child : children_) | ||||||
| 	{ | 	{ | ||||||
| 		GC::GetInstance()->SafeRelease(child); | 		GC::GetInstance()->SafeRelease(child); | ||||||
|  | @ -75,6 +81,8 @@ void e2d::Node::Visit() | ||||||
| 
 | 
 | ||||||
| 	if (!Game::GetInstance()->IsPaused()) | 	if (!Game::GetInstance()->IsPaused()) | ||||||
| 	{ | 	{ | ||||||
|  | 		UpdateActions(); | ||||||
|  | 
 | ||||||
| 		auto updatableNode = dynamic_cast<Updatable*>(this); | 		auto updatableNode = dynamic_cast<Updatable*>(this); | ||||||
| 		if (updatableNode) | 		if (updatableNode) | ||||||
| 		{ | 		{ | ||||||
|  | @ -308,6 +316,39 @@ void e2d::Node::UpdateOpacity() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void e2d::Node::UpdateActions() | ||||||
|  | { | ||||||
|  | 	if (actions_.empty()) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	std::vector<Action*> currActions; | ||||||
|  | 	currActions.reserve(actions_.size()); | ||||||
|  | 	std::copy_if( | ||||||
|  | 		actions_.begin(), | ||||||
|  | 		actions_.end(), | ||||||
|  | 		std::back_inserter(currActions), | ||||||
|  | 		[](Action* action) { return action->IsRunning() && !action->IsDone(); } | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 遍历所有正在运行的动作
 | ||||||
|  | 	for (const auto& action : currActions) | ||||||
|  | 		action->Update(); | ||||||
|  | 
 | ||||||
|  | 	// 清除完成的动作
 | ||||||
|  | 	for (auto iter = actions_.begin(); iter != actions_.end();) | ||||||
|  | 	{ | ||||||
|  | 		if ((*iter)->IsDone()) | ||||||
|  | 		{ | ||||||
|  | 			(*iter)->Release(); | ||||||
|  | 			iter = actions_.erase(iter); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			++iter; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool e2d::Node::IsVisible() const | bool e2d::Node::IsVisible() const | ||||||
| { | { | ||||||
| 	return visible_; | 	return visible_; | ||||||
|  | @ -796,15 +837,35 @@ void e2d::Node::RemoveAllChildren() | ||||||
| 
 | 
 | ||||||
| void e2d::Node::RunAction(Action * action) | void e2d::Node::RunAction(Action * action) | ||||||
| { | { | ||||||
| 	ActionManager::GetInstance()->Start(action, this, false); | 	WARN_IF(action == nullptr, "Action NULL pointer exception!"); | ||||||
|  | 
 | ||||||
|  | 	if (action) | ||||||
|  | 	{ | ||||||
|  | 		if (action->GetTarget() == nullptr) | ||||||
|  | 		{ | ||||||
|  | 			auto iter = std::find(actions_.begin(), actions_.end(), action); | ||||||
|  | 			if (iter == actions_.end()) | ||||||
|  | 			{ | ||||||
|  | 				action->Retain(); | ||||||
|  | 				action->StartWithTarget(this); | ||||||
|  | 				actions_.push_back(action); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			throw Exception("该 Action 已有执行目标"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Node::ResumeAction(const String& name) | void e2d::Node::ResumeAction(const String& name) | ||||||
| { | { | ||||||
| 	auto& actions = ActionManager::GetInstance()->Get(name); | 	if (actions_.empty()) | ||||||
| 	for (const auto& action : actions) | 		return; | ||||||
|  | 
 | ||||||
|  | 	for (const auto& action : actions_) | ||||||
| 	{ | 	{ | ||||||
| 		if (action->GetTarget() == this) | 		if (action->GetName() == name) | ||||||
| 		{ | 		{ | ||||||
| 			action->Resume(); | 			action->Resume(); | ||||||
| 		} | 		} | ||||||
|  | @ -813,10 +874,12 @@ void e2d::Node::ResumeAction(const String& name) | ||||||
| 
 | 
 | ||||||
| void e2d::Node::PauseAction(const String& name) | void e2d::Node::PauseAction(const String& name) | ||||||
| { | { | ||||||
| 	auto& actions = ActionManager::GetInstance()->Get(name); | 	if (actions_.empty()) | ||||||
| 	for (const auto& action : actions) | 		return; | ||||||
|  | 
 | ||||||
|  | 	for (const auto& action : actions_) | ||||||
| 	{ | 	{ | ||||||
| 		if (action->GetTarget() == this) | 		if (action->GetName() == name) | ||||||
| 		{ | 		{ | ||||||
| 			action->Pause(); | 			action->Pause(); | ||||||
| 		} | 		} | ||||||
|  | @ -825,10 +888,12 @@ void e2d::Node::PauseAction(const String& name) | ||||||
| 
 | 
 | ||||||
| void e2d::Node::StopAction(const String& name) | void e2d::Node::StopAction(const String& name) | ||||||
| { | { | ||||||
| 	auto& actions = ActionManager::GetInstance()->Get(name); | 	if (actions_.empty()) | ||||||
| 	for (const auto& action : actions) | 		return; | ||||||
|  | 
 | ||||||
|  | 	for (const auto& action : actions_) | ||||||
| 	{ | 	{ | ||||||
| 		if (action->GetTarget() == this) | 		if (action->GetName() == name) | ||||||
| 		{ | 		{ | ||||||
| 			action->Stop(); | 			action->Stop(); | ||||||
| 		} | 		} | ||||||
|  | @ -877,17 +942,53 @@ bool e2d::Node::Intersects(Node * node) | ||||||
| 
 | 
 | ||||||
| void e2d::Node::ResumeAllActions() | void e2d::Node::ResumeAllActions() | ||||||
| { | { | ||||||
| 	ActionManager::GetInstance()->ResumeAllBindedWith(this); | 	if (actions_.empty()) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	for (const auto& action : actions_) | ||||||
|  | 	{ | ||||||
|  | 		action->Resume(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Node::PauseAllActions() | void e2d::Node::PauseAllActions() | ||||||
| { | { | ||||||
| 	ActionManager::GetInstance()->PauseAllBindedWith(this); | 	if (actions_.empty()) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	for (const auto& action : actions_) | ||||||
|  | 	{ | ||||||
|  | 		action->Pause(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Node::StopAllActions() | void e2d::Node::StopAllActions() | ||||||
| { | { | ||||||
| 	ActionManager::GetInstance()->StopAllBindedWith(this); | 	if (actions_.empty()) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	for (const auto& action : actions_) | ||||||
|  | 	{ | ||||||
|  | 		action->Stop(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const e2d::Node::Actions & e2d::Node::GetAllActions() const | ||||||
|  | { | ||||||
|  | 	return actions_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::Node::UpdateActionsTime() | ||||||
|  | { | ||||||
|  | 	for (const auto& action : actions_) | ||||||
|  | 	{ | ||||||
|  | 		action->ResetTime(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for (const auto& child : children_) | ||||||
|  | 	{ | ||||||
|  | 		child->UpdateActionsTime(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Node::SetVisible(bool value) | void e2d::Node::SetVisible(bool value) | ||||||
|  |  | ||||||
|  | @ -59,8 +59,10 @@ public: | ||||||
| 	// 获取该动作的执行目标
 | 	// 获取该动作的执行目标
 | ||||||
| 	virtual Node * GetTarget(); | 	virtual Node * GetTarget(); | ||||||
| 
 | 
 | ||||||
| protected: | 	// 开始动作
 | ||||||
| 	E2D_DISABLE_COPY(Action); | 	virtual void StartWithTarget( | ||||||
|  | 		Node* target | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
| 	// 初始化动作
 | 	// 初始化动作
 | ||||||
| 	virtual void Init(); | 	virtual void Init(); | ||||||
|  | @ -68,16 +70,14 @@ protected: | ||||||
| 	// 更新动作
 | 	// 更新动作
 | ||||||
| 	virtual void Update(); | 	virtual void Update(); | ||||||
| 
 | 
 | ||||||
| 	// 获取动作结束状态
 |  | ||||||
| 	virtual bool IsDone(); |  | ||||||
| 
 |  | ||||||
| 	// 重置动作时间
 | 	// 重置动作时间
 | ||||||
| 	virtual void ResetTime(); | 	virtual void ResetTime(); | ||||||
| 
 | 
 | ||||||
| 	// 开始动作
 | 	// 获取动作结束状态
 | ||||||
| 	virtual void StartWithTarget( | 	virtual bool IsDone() const; | ||||||
| 		Node* target | 
 | ||||||
| 	); | protected: | ||||||
|  | 	E2D_DISABLE_COPY(Action); | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	String	name_; | 	String	name_; | ||||||
|  |  | ||||||
|  | @ -314,8 +314,6 @@ protected: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Timer; |  | ||||||
| class ActionManager; |  | ||||||
| class Scene; | class Scene; | ||||||
| class Transition; | class Transition; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,97 +7,6 @@ namespace e2d | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Node; | class Node; | ||||||
| class Action; |  | ||||||
| 
 |  | ||||||
| // 动作管理器
 |  | ||||||
| class ActionManager |  | ||||||
| { |  | ||||||
| 	friend class Action; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	// 获取动作管理器实例
 |  | ||||||
| 	static ActionManager * GetInstance(); |  | ||||||
| 
 |  | ||||||
| 	// 获取所有名称相同的动作
 |  | ||||||
| 	std::vector<Action *> Get( |  | ||||||
| 		const String& name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取所有动作
 |  | ||||||
| 	const std::vector<Action*>& GetAll(); |  | ||||||
| 
 |  | ||||||
| 	// 执行动作
 |  | ||||||
| 	void Start( |  | ||||||
| 		Action * action, |  | ||||||
| 		Node * target, |  | ||||||
| 		bool paused |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 继续名称相同的所有动作
 |  | ||||||
| 	void Resume( |  | ||||||
| 		const String& name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 暂停名称相同的所有动作
 |  | ||||||
| 	void Pause( |  | ||||||
| 		const String& name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 停止名称相同的所有动作
 |  | ||||||
| 	void Stop( |  | ||||||
| 		const String& name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 继续绑定在节点上的所有动作
 |  | ||||||
| 	void ResumeAllBindedWith( |  | ||||||
| 		Node * target |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 暂停绑定在节点上的所有动作
 |  | ||||||
| 	void PauseAllBindedWith( |  | ||||||
| 		Node * target |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 停止绑定在节点上的所有动作
 |  | ||||||
| 	void StopAllBindedWith( |  | ||||||
| 		Node * target |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 强制清除绑定在节点上的所有动作
 |  | ||||||
| 	void ClearAllBindedWith( |  | ||||||
| 		Node * target |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 强制清除所有动作
 |  | ||||||
| 	void ClearAll(); |  | ||||||
| 
 |  | ||||||
| 	// 更新动作管理器状态
 |  | ||||||
| 	void Update(); |  | ||||||
| 
 |  | ||||||
| 	// 刷新所有动作计时
 |  | ||||||
| 	void UpdateTime(); |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	ActionManager(); |  | ||||||
| 
 |  | ||||||
| 	~ActionManager(); |  | ||||||
| 
 |  | ||||||
| 	E2D_DISABLE_COPY(ActionManager); |  | ||||||
| 
 |  | ||||||
| 	// 添加动作
 |  | ||||||
| 	void Add( |  | ||||||
| 		Action * action |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 删除动作
 |  | ||||||
| 	void Remove( |  | ||||||
| 		Action * action |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	std::vector<Action*> actions_; |  | ||||||
| 	std::vector<Action*> running_actions_; |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 碰撞体管理器
 | // 碰撞体管理器
 | ||||||
|  |  | ||||||
|  | @ -79,6 +79,7 @@ public: | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
| 	typedef std::vector<Node*> Nodes; | 	typedef std::vector<Node*> Nodes; | ||||||
|  | 	typedef std::vector<Action*> Actions; | ||||||
| 
 | 
 | ||||||
| 	Node(); | 	Node(); | ||||||
| 
 | 
 | ||||||
|  | @ -409,6 +410,12 @@ public: | ||||||
| 	// 停止所有动作
 | 	// 停止所有动作
 | ||||||
| 	void StopAllActions(); | 	void StopAllActions(); | ||||||
| 
 | 
 | ||||||
|  | 	// 获取所有动作
 | ||||||
|  | 	const Actions& GetAllActions() const; | ||||||
|  | 
 | ||||||
|  | 	// 刷新动作进度
 | ||||||
|  | 	void UpdateActionsTime(); | ||||||
|  | 
 | ||||||
| 	// 分发鼠标消息
 | 	// 分发鼠标消息
 | ||||||
| 	virtual bool Dispatch( | 	virtual bool Dispatch( | ||||||
| 		const MouseEvent& e, | 		const MouseEvent& e, | ||||||
|  | @ -447,6 +454,9 @@ protected: | ||||||
| 	// 更新节点透明度
 | 	// 更新节点透明度
 | ||||||
| 	void UpdateOpacity(); | 	void UpdateOpacity(); | ||||||
| 
 | 
 | ||||||
|  | 	// 更新动作
 | ||||||
|  | 	void UpdateActions(); | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 	String		name_; | 	String		name_; | ||||||
| 	size_t		hash_name_; | 	size_t		hash_name_; | ||||||
|  | @ -469,6 +479,7 @@ protected: | ||||||
| 	Node *		parent_; | 	Node *		parent_; | ||||||
| 	Property	extrapolate_; | 	Property	extrapolate_; | ||||||
| 	Color		border_color_; | 	Color		border_color_; | ||||||
|  | 	Actions		actions_; | ||||||
| 	Nodes		children_; | 	Nodes		children_; | ||||||
| 	ID2D1Geometry*		border_; | 	ID2D1Geometry*		border_; | ||||||
| 	D2D1::Matrix3x2F	initial_matrix_; | 	D2D1::Matrix3x2F	initial_matrix_; | ||||||
|  |  | ||||||
|  | @ -79,7 +79,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Event\Collision.cpp" /> |     <ClCompile Include="..\..\core\Event\Collision.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Event\KeyEvent.cpp" /> |     <ClCompile Include="..\..\core\Event\KeyEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Event\MouseEvent.cpp" /> |     <ClCompile Include="..\..\core\Event\MouseEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Manager\CollisionManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\CollisionManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\Button.cpp" /> |     <ClCompile Include="..\..\core\Node\Button.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\Canvas.cpp" /> |     <ClCompile Include="..\..\core\Node\Canvas.cpp" /> | ||||||
|  |  | ||||||
|  | @ -154,9 +154,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Custom\VoiceCallback.cpp"> |     <ClCompile Include="..\..\core\Custom\VoiceCallback.cpp"> | ||||||
|       <Filter>Custom</Filter> |       <Filter>Custom</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp"> |  | ||||||
|       <Filter>Manager</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\Button.cpp"> |     <ClCompile Include="..\..\core\Node\Button.cpp"> | ||||||
|       <Filter>Node</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |  | ||||||
|  | @ -223,7 +223,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Event\Collision.cpp" /> |     <ClCompile Include="..\..\core\Event\Collision.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Event\KeyEvent.cpp" /> |     <ClCompile Include="..\..\core\Event\KeyEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Event\MouseEvent.cpp" /> |     <ClCompile Include="..\..\core\Event\MouseEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Manager\CollisionManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\CollisionManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\Button.cpp" /> |     <ClCompile Include="..\..\core\Node\Button.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\Canvas.cpp" /> |     <ClCompile Include="..\..\core\Node\Canvas.cpp" /> | ||||||
|  |  | ||||||
|  | @ -154,9 +154,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Custom\VoiceCallback.cpp"> |     <ClCompile Include="..\..\core\Custom\VoiceCallback.cpp"> | ||||||
|       <Filter>Custom</Filter> |       <Filter>Custom</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp"> |  | ||||||
|       <Filter>Manager</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\Button.cpp"> |     <ClCompile Include="..\..\core\Node\Button.cpp"> | ||||||
|       <Filter>Node</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |  | ||||||
|  | @ -243,7 +243,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Event\Collision.cpp" /> |     <ClCompile Include="..\..\core\Event\Collision.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Event\KeyEvent.cpp" /> |     <ClCompile Include="..\..\core\Event\KeyEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Event\MouseEvent.cpp" /> |     <ClCompile Include="..\..\core\Event\MouseEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Manager\CollisionManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\CollisionManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\Button.cpp" /> |     <ClCompile Include="..\..\core\Node\Button.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\Canvas.cpp" /> |     <ClCompile Include="..\..\core\Node\Canvas.cpp" /> | ||||||
|  |  | ||||||
|  | @ -39,9 +39,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Common\String.cpp"> |     <ClCompile Include="..\..\core\Common\String.cpp"> | ||||||
|       <Filter>Common</Filter> |       <Filter>Common</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp"> |  | ||||||
|       <Filter>Manager</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\Button.cpp"> |     <ClCompile Include="..\..\core\Node\Button.cpp"> | ||||||
|       <Filter>Node</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue