From 913cd966b325b8ccd96240d05d607367d10be60b Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Sat, 28 Mar 2026 04:36:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(sprite):=20=E6=B7=BB=E5=8A=A0=E5=81=8F?= =?UTF-8?q?=E7=A7=BB=E9=87=8F=E6=94=AF=E6=8C=81=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?NPK=E7=B2=BE=E7=81=B5=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加Sprite类的偏移量属性,支持设置和获取偏移量 修改NPK精灵创建逻辑,自动设置帧偏移量 注释掉main.cpp中不必要的锚点设置 --- Frostbite2D/include/frostbite2D/2d/sprite.h | 5 ++++ Frostbite2D/src/frostbite2D/2d/sprite.cpp | 24 ++++++++++++++++++-- Game/assets/ImagePacks2/!HUD_CW.NPK | Bin 447242 -> 447242 bytes Game/src/main.cpp | 2 +- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Frostbite2D/include/frostbite2D/2d/sprite.h b/Frostbite2D/include/frostbite2D/2d/sprite.h index dee3ade..d12a8e2 100644 --- a/Frostbite2D/include/frostbite2D/2d/sprite.h +++ b/Frostbite2D/include/frostbite2D/2d/sprite.h @@ -45,6 +45,10 @@ public: void SetSizeToTexture(); + const Vec2& GetOffset() const { return offset_; } + void SetOffset(const Vec2& offset); + void SetOffset(float x, float y); + private: void updateTransform(); Shader* getActiveShader() const; @@ -57,6 +61,7 @@ private: bool flippedX_ = false; bool flippedY_ = false; BlendMode blendMode_ = BlendMode::Normal; + Vec2 offset_ = Vec2::Zero(); Transform2D transform_; static constexpr const char* DEFAULT_SHADER = "sprite"; diff --git a/Frostbite2D/src/frostbite2D/2d/sprite.cpp b/Frostbite2D/src/frostbite2D/2d/sprite.cpp index 7d0987b..74d3026 100644 --- a/Frostbite2D/src/frostbite2D/2d/sprite.cpp +++ b/Frostbite2D/src/frostbite2D/2d/sprite.cpp @@ -90,7 +90,12 @@ void Sprite::Render() { shader->use(); } - renderer.getBatch().submitQuad(quad, GetWorldTransform(), texture_, shader, blendMode_); + Transform2D worldTransform = GetWorldTransform(); + if (offset_ != Vec2::Zero()) { + worldTransform = Transform2D::translation(offset_.x, offset_.y) * worldTransform; + } + + renderer.getBatch().submitQuad(quad, worldTransform, texture_, shader, blendMode_); RenderChildren(); } @@ -137,6 +142,15 @@ void Sprite::SetSizeToTexture() { } } +void Sprite::SetOffset(const Vec2& offset) { + offset_ = offset; +} + +void Sprite::SetOffset(float x, float y) { + offset_.x = x; + offset_.y = y; +} + void Sprite::updateTransform() { Vec2 pos = GetPosition(); float rotation = GetRotation(); @@ -223,12 +237,18 @@ Ptr Sprite::createFromNpk(const std::string& imgPath, size_t frameIndex) convertedData[i + 3] = a; } - return createFromMemory( + auto sprite = createFromMemory( convertedData.data(), frame.width, frame.height, 4 ); + + if (sprite) { + sprite->SetOffset(static_cast(frame.xPos), static_cast(frame.yPos)); + } + + return sprite; } } diff --git a/Game/assets/ImagePacks2/!HUD_CW.NPK b/Game/assets/ImagePacks2/!HUD_CW.NPK index 4fc7a81c82143b511986c4ddf371db5f67f28c6a..b93b3627d2de2f2f0d632bc8def061e1f289bb76 100644 GIT binary patch delta 40 pcmeBLCf&76dP4;hBSUi~Q+p*7BM^gVW*}w(V%F`IOl%V`000L)3~~Sf delta 40 pcmeBLCf&76dP4;hSetAnchor(Vec2(0.5f, 0.5f)); + // ani->SetAnchor(Vec2(0.5f, 0.5f)); ani->SetPosition(640, 360); menuScene->AddChild(ani); }