diff --git a/core/e2dcomponent.h b/core/e2dcomponent.h index 21a607e7..6f5e9645 100644 --- a/core/e2dcomponent.h +++ b/core/e2dcomponent.h @@ -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_; diff --git a/core/e2dobject.h b/core/e2dobject.h index 145a6f21..eded1957 100644 --- a/core/e2dobject.h +++ b/core/e2dobject.h @@ -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_; diff --git a/core/e2dtransition.h b/core/e2dtransition.h index a2f2a713..98171602 100644 --- a/core/e2dtransition.h +++ b/core/e2dtransition.h @@ -48,6 +48,7 @@ namespace e2d float duration_; float delta_; Time started_; + Size window_size_; Scene* out_scene_; Scene* in_scene_; ID2D1Layer * out_layer_; diff --git a/core/objects/Node.cpp b/core/objects/Node.cpp index 997080aa..c5191016 100644 --- a/core/objects/Node.cpp +++ b/core/objects/Node.cpp @@ -90,10 +90,10 @@ void e2d::Node::Visit() UpdateActions(); UpdateTasks(); - auto updatableNode = dynamic_cast(this); - if (updatableNode) + auto updatable_node = dynamic_cast(this); + if (updatable_node) { - updatableNode->Update(); + updatable_node->Update(); } } @@ -112,11 +112,11 @@ void e2d::Node::Visit() if (children_.empty()) { - auto drawableNode = dynamic_cast(this); - if (drawableNode) + auto drawable_node = dynamic_cast(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(this); - if (drawableNode) + auto drawable_node = dynamic_cast(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; } diff --git a/core/objects/Scene.cpp b/core/objects/Scene.cpp index 170b4d71..a543d9d1 100644 --- a/core/objects/Scene.cpp +++ b/core/objects/Scene.cpp @@ -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_; +} diff --git a/core/transitions/MoveTransition.cpp b/core/transitions/MoveTransition.cpp index 8135f857..a8d7818c 100644 --- a/core/transitions/MoveTransition.cpp +++ b/core/transitions/MoveTransition.cpp @@ -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()); } } diff --git a/core/transitions/Transition.cpp b/core/transitions/Transition.cpp index 26efef54..7374903f 100644 --- a/core/transitions/Transition.cpp +++ b/core/transitions/Transition.cpp @@ -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();