From 2aff5bf2f8f268530ac2dcda0b1b72dda0abaed0 Mon Sep 17 00:00:00 2001 From: Lveyou <1339484752@qq.com> Date: Mon, 7 Sep 2026 14:55:46 +0800 Subject: [PATCH] =?UTF-8?q?ui=5Fsprite=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dl/ui/dl_ui_sprite.cpp | 27 +++++++++++++++++++++++---- dl/ui/dl_ui_sprite.h | 9 ++++++++- dl/ui/dl_ui_text.h | 2 ++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/dl/ui/dl_ui_sprite.cpp b/dl/ui/dl_ui_sprite.cpp index 5ea7d6e2..c6a4cb8a 100644 --- a/dl/ui/dl_ui_sprite.cpp +++ b/dl/ui/dl_ui_sprite.cpp @@ -69,15 +69,16 @@ void Sprite::SetMode(AutoSize auto_size, FillMode mode) _cptElemData._size = _spr->GetSize(); } -void Sprite::SetElementData(const Align::Direction2& hv) +void Sprite::SetElementData(const Align::Direction2& hv, const Position& pos) { _cptElemData._size = GetSize(); _cptElemData._anchor = {}; _cptElemData._hv = hv; + _cptElemData._pos = pos; - //在组内则更新位置 - //if (_panel) - // _panel->OnChangeElementData(&_cpt); + // 在组内则更新位置 + if (_panel) + _panel->OnChangeElementData(&_cpt); } void Sprite::SetEDOrderOffset(int order_offset) @@ -85,6 +86,24 @@ void Sprite::SetEDOrderOffset(int order_offset) _cptElemData._orderOffset = order_offset; } +void Sprite::SetSprite(gcSprite spr) +{ + // 复用创建时的逻辑:为新精灵创建独立Coor并设置UI标记 + if (!spr->IsOwnCoor()) + { + Coor* coor = Coor::Create(spr->GetCoor()); + spr->SetCoor(coor, true); + } + // 沿用原有绘制层级 + spr->SetOrder(_spr->GetOrder()); + _spr = spr; + _spr->SetUI(true); + SetMode(_autoSize, _fillMode); + // 已加入面板时,重新定位新精灵的Coor(原Coor随旧精灵被替换,AddCpt不会再次处理) + if (_panel) + _panel->OnChangeElementData(&_cpt); +} + } #endif \ No newline at end of file diff --git a/dl/ui/dl_ui_sprite.h b/dl/ui/dl_ui_sprite.h index 04615bb9..3dfeb387 100644 --- a/dl/ui/dl_ui_sprite.h +++ b/dl/ui/dl_ui_sprite.h @@ -95,6 +95,13 @@ public: Coor* GetCoor() { return _spr->GetCoor(); } gcSprite GetSprite() { return _spr; } + /** + * @brief 更换显示的精灵 + * @param[in] spr 新的精灵 + * @note 复用创建时的逻辑设置Coor与UI标记,并沿用当前的AutoSize/FillMode与绘制层级 + */ + void SetSprite(gcSprite spr); + /** * @brief 设置显示模式 * @note 注释参考Create @@ -108,7 +115,7 @@ public: return _spr->GetSize(); } - void SetElementData(const Align::Direction2& hv); + void SetElementData(const Align::Direction2& hv, const Position& pos = {}); void SetEDOrderOffset(int order_offset); void SetVisible(bool visible) diff --git a/dl/ui/dl_ui_text.h b/dl/ui/dl_ui_text.h index dc3ac9d5..63671733 100644 --- a/dl/ui/dl_ui_text.h +++ b/dl/ui/dl_ui_text.h @@ -83,6 +83,8 @@ public: gcText GetText() { return _txt; } void SetElementData(const Align::Direction2& hv, const Position& pos = {}); + + Components* GetCpt() { return &_cpt; } private: Text() :