refactoring: MoveTransition
This commit is contained in:
		
							parent
							
								
									6f489a77fe
								
							
						
					
					
						commit
						a626e488de
					
				|  | @ -77,15 +77,6 @@ namespace e2d | |||
| 			float anchor_y | ||||
| 		) override; | ||||
| 
 | ||||
| 		// 分发鼠标消息
 | ||||
| 		virtual bool Dispatch( | ||||
| 			const MouseEvent& e, | ||||
| 			bool handled | ||||
| 		) override; | ||||
| 
 | ||||
| 		// 遍历节点
 | ||||
| 		virtual void Visit() override; | ||||
| 
 | ||||
| 	protected: | ||||
| 		E2D_DISABLE_COPY(Button); | ||||
| 
 | ||||
|  | @ -100,6 +91,15 @@ namespace e2d | |||
| 		// 刷新按钮显示
 | ||||
| 		virtual void UpdateVisible(); | ||||
| 
 | ||||
| 		// 分发鼠标消息
 | ||||
| 		virtual bool Dispatch( | ||||
| 			const MouseEvent& e, | ||||
| 			bool handled | ||||
| 		) override; | ||||
| 
 | ||||
| 		// 遍历节点
 | ||||
| 		virtual void Visit() override; | ||||
| 
 | ||||
| 	protected: | ||||
| 		Node * normal_; | ||||
| 		Node *		mouseover_; | ||||
|  |  | |||
|  | @ -169,13 +169,22 @@ namespace e2d | |||
| 			bool handled | ||||
| 		) override; | ||||
| 
 | ||||
| 		// 设置转换矩阵
 | ||||
| 		void SetTransform( | ||||
| 			const D2D1::Matrix3x2F& matrix | ||||
| 		); | ||||
| 
 | ||||
| 		// 获取转换矩阵
 | ||||
| 		const D2D1::Matrix3x2F& GetTransform() const; | ||||
| 
 | ||||
| 	protected: | ||||
| 		E2D_DISABLE_COPY(Scene); | ||||
| 
 | ||||
| 	protected: | ||||
| 		Node * root_; | ||||
| 		Node*	root_; | ||||
| 		bool	border_visible_; | ||||
| 		bool	collider_visible_; | ||||
| 		D2D1::Matrix3x2F transform_; | ||||
| 	}; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -410,6 +419,7 @@ namespace e2d | |||
| 		: public Ref | ||||
| 		, public EventTarget | ||||
| 	{ | ||||
| 		friend class Game; | ||||
| 		friend class Scene; | ||||
| 		friend class Collider; | ||||
| 
 | ||||
|  | @ -799,9 +809,6 @@ namespace e2d | |||
| 		// 获取所有任务
 | ||||
| 		const Tasks& GetAllTasks() const; | ||||
| 
 | ||||
| 		// 更新节点时间
 | ||||
| 		void UpdateTime(); | ||||
| 
 | ||||
| 		// 分发鼠标消息
 | ||||
| 		virtual bool Dispatch( | ||||
| 			const MouseEvent& e, | ||||
|  | @ -814,12 +821,12 @@ namespace e2d | |||
| 			bool handled | ||||
| 		) override; | ||||
| 
 | ||||
| 		// 遍历节点
 | ||||
| 		virtual void Visit(); | ||||
| 
 | ||||
| 	protected: | ||||
| 		E2D_DISABLE_COPY(Node); | ||||
| 
 | ||||
| 		// 遍历节点
 | ||||
| 		virtual void Visit(); | ||||
| 
 | ||||
| 		// 渲染节点边缘
 | ||||
| 		void DrawBorder(); | ||||
| 
 | ||||
|  | @ -843,6 +850,9 @@ namespace e2d | |||
| 		// 更新任务
 | ||||
| 		void UpdateTasks(); | ||||
| 
 | ||||
| 		// 更新节点时间
 | ||||
| 		void UpdateTime(); | ||||
| 
 | ||||
| 	protected: | ||||
| 		String		name_; | ||||
| 		size_t		hash_name_; | ||||
|  |  | |||
|  | @ -48,6 +48,7 @@ namespace e2d | |||
| 		float	duration_; | ||||
| 		float	delta_; | ||||
| 		Time	started_; | ||||
| 		Size	window_size_; | ||||
| 		Scene*	out_scene_; | ||||
| 		Scene*	in_scene_; | ||||
| 		ID2D1Layer * out_layer_; | ||||
|  |  | |||
|  | @ -90,10 +90,10 @@ void e2d::Node::Visit() | |||
| 		UpdateActions(); | ||||
| 		UpdateTasks(); | ||||
| 
 | ||||
| 		auto updatableNode = dynamic_cast<Updatable*>(this); | ||||
| 		if (updatableNode) | ||||
| 		auto updatable_node = dynamic_cast<Updatable*>(this); | ||||
| 		if (updatable_node) | ||||
| 		{ | ||||
| 			updatableNode->Update(); | ||||
| 			updatable_node->Update(); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -112,11 +112,11 @@ void e2d::Node::Visit() | |||
| 
 | ||||
| 	if (children_.empty()) | ||||
| 	{ | ||||
| 		auto drawableNode = dynamic_cast<Drawable*>(this); | ||||
| 		if (drawableNode) | ||||
| 		auto drawable_node = dynamic_cast<Drawable*>(this); | ||||
| 		if (drawable_node) | ||||
| 		{ | ||||
| 			render_target->SetTransform(final_matrix_); | ||||
| 			drawableNode->Draw(); | ||||
| 			drawable_node->Draw(); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
|  | @ -148,11 +148,11 @@ void e2d::Node::Visit() | |||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		auto drawableNode = dynamic_cast<Drawable*>(this); | ||||
| 		if (drawableNode) | ||||
| 		auto drawable_node = dynamic_cast<Drawable*>(this); | ||||
| 		if (drawable_node) | ||||
| 		{ | ||||
| 			render_target->SetTransform(final_matrix_); | ||||
| 			drawableNode->Draw(); | ||||
| 			drawable_node->Draw(); | ||||
| 		} | ||||
| 
 | ||||
| 		// 访问剩余节点
 | ||||
|  | @ -229,11 +229,19 @@ void e2d::Node::UpdateTransform() | |||
| 	); | ||||
| 	// 根据自身锚点变换 Final 矩阵
 | ||||
| 	final_matrix_ = initial_matrix_ * D2D1::Matrix3x2F::Translation(-anchor.x, -anchor.y); | ||||
| 	// ºÍ¸¸½Úµã¾ØÕóÏà³Ë
 | ||||
| 	if (!fixed_position_ && parent_) | ||||
| 
 | ||||
| 	if (parent_) | ||||
| 	{ | ||||
| 		initial_matrix_ = initial_matrix_ * parent_->initial_matrix_; | ||||
| 		final_matrix_ = final_matrix_ * parent_->initial_matrix_; | ||||
| 		if (!fixed_position_) | ||||
| 		{ | ||||
| 			initial_matrix_ = initial_matrix_ * parent_->initial_matrix_; | ||||
| 			final_matrix_ = final_matrix_ * parent_->initial_matrix_; | ||||
| 		} | ||||
| 	} | ||||
| 	else if (parent_scene_) | ||||
| 	{ | ||||
| 		initial_matrix_ = initial_matrix_ * parent_scene_->GetTransform(); | ||||
| 		final_matrix_ = final_matrix_ * parent_scene_->GetTransform(); | ||||
| 	} | ||||
| 
 | ||||
| 	// 重新构造轮廓
 | ||||
|  | @ -613,8 +621,8 @@ void e2d::Node::SetAnchor(float anchor_x, float anchor_y) | |||
| 	if (anchor_.x == anchor_x && anchor_.y == anchor_y) | ||||
| 		return; | ||||
| 
 | ||||
| 	anchor_.x = std::min(std::max(anchor_x, 0.f), 1.f); | ||||
| 	anchor_.y = std::min(std::max(anchor_y, 0.f), 1.f); | ||||
| 	anchor_.x = anchor_x; | ||||
| 	anchor_.y = anchor_y; | ||||
| 	dirty_transform_ = true; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ e2d::Scene::Scene() | |||
| 	: root_(nullptr) | ||||
| 	, border_visible_(false) | ||||
| 	, collider_visible_(false) | ||||
| 	, transform_(D2D1::Matrix3x2F::Identity()) | ||||
| { | ||||
| } | ||||
| 
 | ||||
|  | @ -12,6 +13,7 @@ e2d::Scene::Scene(Node * root) | |||
| 	: root_(nullptr) | ||||
| 	, border_visible_(false) | ||||
| 	, collider_visible_(false) | ||||
| 	, transform_(D2D1::Matrix3x2F::Identity()) | ||||
| { | ||||
| 	this->SetRoot(root); | ||||
| } | ||||
|  | @ -98,3 +100,18 @@ bool e2d::Scene::Dispatch(const KeyEvent & e, bool handled) | |||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| void e2d::Scene::SetTransform(const D2D1::Matrix3x2F& matrix) | ||||
| { | ||||
| 	transform_ = matrix; | ||||
| 
 | ||||
| 	if (root_) | ||||
| 	{ | ||||
| 		root_->dirty_transform_ = true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| const D2D1::Matrix3x2F & e2d::Scene::GetTransform() const | ||||
| { | ||||
| 	return transform_; | ||||
| } | ||||
|  |  | |||
|  | @ -12,44 +12,67 @@ void e2d::MoveTransition::Init(Scene * prev, Scene * next) | |||
| { | ||||
| 	Transition::Init(prev, next); | ||||
| 	 | ||||
| 	auto size = Window::GetInstance()->GetSize(); | ||||
| 	if (direction_ == Direction::Up) | ||||
| 	{ | ||||
| 		pos_delta_ = Point(0, -size.height); | ||||
| 		start_pos_ = Point(0, size.height); | ||||
| 		pos_delta_ = Point(0, -window_size_.height); | ||||
| 		start_pos_ = Point(0, window_size_.height); | ||||
| 	} | ||||
| 	else if (direction_ == Direction::Down) | ||||
| 	{ | ||||
| 		pos_delta_ = Point(0, size.height); | ||||
| 		start_pos_ = Point(0, -size.height); | ||||
| 		pos_delta_ = Point(0, window_size_.height); | ||||
| 		start_pos_ = Point(0, -window_size_.height); | ||||
| 	} | ||||
| 	else if (direction_ == Direction::Left) | ||||
| 	{ | ||||
| 		pos_delta_ = Point(-size.width, 0); | ||||
| 		start_pos_ = Point(size.width, 0); | ||||
| 		pos_delta_ = Point(-window_size_.width, 0); | ||||
| 		start_pos_ = Point(window_size_.width, 0); | ||||
| 	} | ||||
| 	else if (direction_ == Direction::Right) | ||||
| 	{ | ||||
| 		pos_delta_ = Point(size.width, 0); | ||||
| 		start_pos_ = Point(-size.width, 0); | ||||
| 		pos_delta_ = Point(window_size_.width, 0); | ||||
| 		start_pos_ = Point(-window_size_.width, 0); | ||||
| 	} | ||||
| 
 | ||||
| 	if (out_scene_ && out_scene_->GetRoot()) out_scene_->GetRoot()->SetPos(0, 0); | ||||
| 	if (in_scene_->GetRoot()) in_scene_->GetRoot()->SetPos(start_pos_); | ||||
| 	if (out_scene_) | ||||
| 	{ | ||||
| 		out_scene_->SetTransform(D2D1::Matrix3x2F::Identity()); | ||||
| 	} | ||||
| 	 | ||||
| 	if (in_scene_) | ||||
| 	{ | ||||
| 		in_scene_->SetTransform( | ||||
| 			D2D1::Matrix3x2F::Translation( | ||||
| 				start_pos_.x, | ||||
| 				start_pos_.y | ||||
| 			) | ||||
| 		); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::MoveTransition::Update() | ||||
| { | ||||
| 	Transition::Update(); | ||||
| 
 | ||||
| 	if (out_scene_ && out_scene_->GetRoot()) | ||||
| 	if (out_scene_) | ||||
| 	{ | ||||
| 		out_scene_->GetRoot()->SetPos(pos_delta_ * delta_); | ||||
| 		auto translation = pos_delta_ * delta_; | ||||
| 		out_scene_->SetTransform( | ||||
| 			D2D1::Matrix3x2F::Translation( | ||||
| 				translation.x, | ||||
| 				translation.y | ||||
| 			) | ||||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	if (in_scene_->GetRoot()) | ||||
| 	if (in_scene_) | ||||
| 	{ | ||||
| 		in_scene_->GetRoot()->SetPos(start_pos_ + pos_delta_ * delta_); | ||||
| 		auto translation = start_pos_ + pos_delta_ * delta_; | ||||
| 		in_scene_->SetTransform( | ||||
| 			D2D1::Matrix3x2F::Translation( | ||||
| 				translation.x, | ||||
| 				translation.y | ||||
| 			) | ||||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	if (delta_ >= 1) | ||||
|  | @ -60,13 +83,13 @@ void e2d::MoveTransition::Update() | |||
| 
 | ||||
| void e2d::MoveTransition::Reset() | ||||
| { | ||||
| 	if (out_scene_ && out_scene_->GetRoot()) | ||||
| 	if (out_scene_) | ||||
| 	{ | ||||
| 		out_scene_->GetRoot()->SetPos(0, 0); | ||||
| 		out_scene_->SetTransform(D2D1::Matrix3x2F::Identity()); | ||||
| 	} | ||||
| 	 | ||||
| 	if (in_scene_->GetRoot()) | ||||
| 	if (in_scene_) | ||||
| 	{ | ||||
| 		in_scene_->GetRoot()->SetPos(0, 0); | ||||
| 		in_scene_->SetTransform(D2D1::Matrix3x2F::Identity()); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ e2d::Transition::Transition(float duration) | |||
| 	: done_(false) | ||||
| 	, started_() | ||||
| 	, delta_(0) | ||||
| 	, window_size_() | ||||
| 	, out_scene_(nullptr) | ||||
| 	, in_scene_(nullptr) | ||||
| 	, out_layer_(nullptr) | ||||
|  | @ -56,8 +57,14 @@ void e2d::Transition::Init(Scene * prev, Scene * next) | |||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	window_size_ = Window::GetInstance()->GetSize(); | ||||
| 	out_layer_param_ = in_layer_param_ = D2D1::LayerParameters( | ||||
| 		D2D1::InfiniteRect(), | ||||
| 		D2D1::RectF( | ||||
| 			0.f, | ||||
| 			0.f, | ||||
| 			window_size_.width, | ||||
| 			window_size_.height | ||||
| 		), | ||||
| 		nullptr, | ||||
| 		D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, | ||||
| 		D2D1::Matrix3x2F::Identity(), | ||||
|  | @ -83,19 +90,19 @@ void e2d::Transition::Update() | |||
| void e2d::Transition::Draw() | ||||
| { | ||||
| 	auto render_target = Renderer::GetInstance()->GetRenderTarget(); | ||||
| 	auto size = Window::GetInstance()->GetSize(); | ||||
| 
 | ||||
| 	if (out_scene_ && out_scene_->GetRoot()) | ||||
| 	if (out_scene_) | ||||
| 	{ | ||||
| 		auto root_pos = out_scene_->GetRoot()->GetPos(); | ||||
| 		auto clip_rect = D2D1::RectF( | ||||
| 			std::max(root_pos.x, 0.f), | ||||
| 			std::max(root_pos.y, 0.f), | ||||
| 			std::min(root_pos.x + size.width, size.width), | ||||
| 			std::min(root_pos.y + size.height, size.height) | ||||
| 		render_target->SetTransform(out_scene_->GetTransform()); | ||||
| 		render_target->PushAxisAlignedClip( | ||||
| 			D2D1::RectF( | ||||
| 				0.f, | ||||
| 				0.f, | ||||
| 				window_size_.width, | ||||
| 				window_size_.height | ||||
| 			), | ||||
| 			D2D1_ANTIALIAS_MODE_PER_PRIMITIVE | ||||
| 		); | ||||
| 		render_target->SetTransform(D2D1::Matrix3x2F::Identity()); | ||||
| 		render_target->PushAxisAlignedClip(clip_rect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); | ||||
| 		render_target->PushLayer(out_layer_param_, out_layer_); | ||||
| 
 | ||||
| 		out_scene_->Draw(); | ||||
|  | @ -104,17 +111,18 @@ void e2d::Transition::Draw() | |||
| 		render_target->PopAxisAlignedClip(); | ||||
| 	} | ||||
| 
 | ||||
| 	if (in_scene_ && in_scene_->GetRoot()) | ||||
| 	if (in_scene_) | ||||
| 	{ | ||||
| 		Point root_pos = in_scene_->GetRoot()->GetPos(); | ||||
| 		auto clip_rect = D2D1::RectF( | ||||
| 			std::max(root_pos.x, 0.f), | ||||
| 			std::max(root_pos.y, 0.f), | ||||
| 			std::min(root_pos.x + size.width, size.width), | ||||
| 			std::min(root_pos.y + size.height, size.height) | ||||
| 		render_target->SetTransform(in_scene_->GetTransform()); | ||||
| 		render_target->PushAxisAlignedClip( | ||||
| 			D2D1::RectF( | ||||
| 				0.f, | ||||
| 				0.f, | ||||
| 				window_size_.width, | ||||
| 				window_size_.height | ||||
| 			), | ||||
| 			D2D1_ANTIALIAS_MODE_PER_PRIMITIVE | ||||
| 		); | ||||
| 		render_target->SetTransform(D2D1::Matrix3x2F::Identity()); | ||||
| 		render_target->PushAxisAlignedClip(clip_rect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); | ||||
| 		render_target->PushLayer(in_layer_param_, in_layer_); | ||||
| 
 | ||||
| 		in_scene_->Draw(); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue