From 3c0743eb64e5bf345267a67e596f4c9f593409ed Mon Sep 17 00:00:00 2001 From: ChestnutYueyue <952134128@qq.com> Date: Mon, 16 Mar 2026 21:24:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(sprite=5Frenderer):=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=8A=82=E7=82=B9=E5=B0=BA=E5=AF=B8=E4=BB=A5?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=BA=B9=E7=90=86=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 SpriteRenderer 的 onAttach 和 setTexture 方法中添加逻辑,当节点尺寸为默认值 (100x100) 且纹理有效时,自动将节点尺寸设置为纹理的宽高。同时移除示例中多余的纹理加载状态检查和调试输出,简化代码逻辑。 --- examples/image_display_demo/main.cpp | 13 ------- src/scene/components/sprite_renderer.cpp | 43 ++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/examples/image_display_demo/main.cpp b/examples/image_display_demo/main.cpp index ff96804..3117abf 100644 --- a/examples/image_display_demo/main.cpp +++ b/examples/image_display_demo/main.cpp @@ -14,9 +14,6 @@ public: void update(float dt) override { Scene::update(dt); - if (textureLoaded_) { - return; - } auto *rhiModule = RHIModule::get(); if (!rhiModule || !rhiModule->getDevice()) { return; @@ -28,11 +25,7 @@ public: auto texture = assets->load("assets/test.png"); if (texture.isValid()) { spriteRenderer_->setTexture(texture); - printf("图片加载成功: assets/test.png\n"); - } else { - printf("图片加载失败: assets/test.png\n"); } - textureLoaded_ = true; } private: @@ -40,7 +33,6 @@ private: auto cameraNode = makePtr(); cameraNode->setName("MainCamera"); cameraNode->setPosition(0.0f, 0.0f); - auto camera = makePtr(); camera->setOrtho(0.0f, 1280.0f, 720.0f, 0.0f, -1.0f, 1.0f); cameraNode->addComponent(camera); @@ -52,17 +44,12 @@ private: auto spriteNode = makePtr(); spriteNode->setName("ImageSprite"); spriteNode->setPosition(640.0f, 360.0f); - // spriteNode->setSize(384.0f, 384.0f); spriteNode->setAnchor(0.5f, 0.5f); - spriteRenderer_ = makePtr(); - // spriteRenderer_->setColor(Color::White); spriteNode->addComponent(spriteRenderer_); addChild(spriteNode); } - Ptr spriteRenderer_; - bool textureLoaded_ = false; }; int main(int argc, char **argv) { diff --git a/src/scene/components/sprite_renderer.cpp b/src/scene/components/sprite_renderer.cpp index 3ec7f65..a1a93a9 100644 --- a/src/scene/components/sprite_renderer.cpp +++ b/src/scene/components/sprite_renderer.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -9,13 +10,51 @@ namespace extra2d { SpriteRenderer::SpriteRenderer() { } -void SpriteRenderer::onAttach(Node *owner) { Component::onAttach(owner); } +void SpriteRenderer::onAttach(Node *owner) { + Component::onAttach(owner); + if (!texture_.isValid() || !owner_) { + return; + } + Vec2 nodeSize = owner_->getSize(); + if (nodeSize.x != 100.0f || nodeSize.y != 100.0f) { + return; + } + auto *assets = getAssets(); + if (!assets) { + return; + } + Texture *tex = assets->get(texture_); + if (!tex) { + return; + } + owner_->setSize(static_cast(tex->getWidth()), + static_cast(tex->getHeight())); +} void SpriteRenderer::setMaterial(Handle material) { material_ = material; } -void SpriteRenderer::setTexture(Handle texture) { texture_ = texture; } +void SpriteRenderer::setTexture(Handle texture) { + texture_ = texture; + if (!owner_ || !texture_.isValid()) { + return; + } + Vec2 nodeSize = owner_->getSize(); + if (nodeSize.x != 100.0f || nodeSize.y != 100.0f) { + return; + } + auto *assets = getAssets(); + if (!assets) { + return; + } + Texture *tex = assets->get(texture_); + if (!tex) { + return; + } + owner_->setSize(static_cast(tex->getWidth()), + static_cast(tex->getHeight())); +} void SpriteRenderer::setColor(const Color &color) { color_ = color; }