feat(sprite_renderer): 自动调整节点尺寸以匹配纹理大小

在 SpriteRenderer 的 onAttach 和 setTexture 方法中添加逻辑,当节点尺寸为默认值 (100x100) 且纹理有效时,自动将节点尺寸设置为纹理的宽高。同时移除示例中多余的纹理加载状态检查和调试输出,简化代码逻辑。
This commit is contained in:
ChestnutYueyue 2026-03-16 21:24:08 +08:00
parent dcb3162525
commit 3c0743eb64
2 changed files with 41 additions and 15 deletions

View File

@ -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<Texture>("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<Node>();
cameraNode->setName("MainCamera");
cameraNode->setPosition(0.0f, 0.0f);
auto camera = makePtr<CameraComponent>();
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<Node>();
spriteNode->setName("ImageSprite");
spriteNode->setPosition(640.0f, 360.0f);
// spriteNode->setSize(384.0f, 384.0f);
spriteNode->setAnchor(0.5f, 0.5f);
spriteRenderer_ = makePtr<SpriteRenderer>();
// spriteRenderer_->setColor(Color::White);
spriteNode->addComponent(spriteRenderer_);
addChild(spriteNode);
}
Ptr<SpriteRenderer> spriteRenderer_;
bool textureLoaded_ = false;
};
int main(int argc, char **argv) {

View File

@ -1,5 +1,6 @@
#include <assets/assets_module.h>
#include <event/events.h>
#include <renderer/texture.h>
#include <scene/components/sprite_renderer.h>
#include <scene/node.h>
#include <utils/logger.h>
@ -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<float>(tex->getWidth()),
static_cast<float>(tex->getHeight()));
}
void SpriteRenderer::setMaterial(Handle<Material> material) {
material_ = material;
}
void SpriteRenderer::setTexture(Handle<Texture> texture) { texture_ = texture; }
void SpriteRenderer::setTexture(Handle<Texture> 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<float>(tex->getWidth()),
static_cast<float>(tex->getHeight()));
}
void SpriteRenderer::setColor(const Color &color) { color_ = color; }