2026-02-11 19:40:26 +08:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
2026-02-25 06:23:53 +08:00
|
|
|
|
#include <core/math_types.h>
|
|
|
|
|
|
#include <core/types.h>
|
|
|
|
|
|
#include <graphics/texture.h>
|
2026-02-11 19:40:26 +08:00
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
namespace extra2d {
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
// SpriteFrame - 精灵帧(纹理 + 区域 + 偏移的中间抽象)
|
|
|
|
|
|
// 借鉴 Cocos2d-x SpriteFrame:解耦纹理物理存储与逻辑帧
|
|
|
|
|
|
// 一个纹理图集可包含多个 SpriteFrame,减少纹理切换提升渲染性能
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
class SpriteFrame {
|
|
|
|
|
|
public:
|
|
|
|
|
|
SpriteFrame() = default;
|
|
|
|
|
|
|
|
|
|
|
|
SpriteFrame(Ptr<Texture> texture, const Rect &rect)
|
|
|
|
|
|
: texture_(std::move(texture)), rect_(rect), originalSize_(rect.size) {}
|
|
|
|
|
|
|
|
|
|
|
|
SpriteFrame(Ptr<Texture> texture, const Rect &rect, const Vec2 &offset,
|
|
|
|
|
|
const Size &originalSize)
|
|
|
|
|
|
: texture_(std::move(texture)), rect_(rect), offset_(offset),
|
|
|
|
|
|
originalSize_(originalSize) {}
|
|
|
|
|
|
|
|
|
|
|
|
// ------ 静态创建 ------
|
|
|
|
|
|
static Ptr<SpriteFrame> create(Ptr<Texture> texture, const Rect &rect) {
|
|
|
|
|
|
return makePtr<SpriteFrame>(std::move(texture), rect);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static Ptr<SpriteFrame> create(Ptr<Texture> texture, const Rect &rect,
|
|
|
|
|
|
const Vec2 &offset, const Size &originalSize) {
|
|
|
|
|
|
return makePtr<SpriteFrame>(std::move(texture), rect, offset, originalSize);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ------ 纹理信息 ------
|
|
|
|
|
|
void setTexture(Ptr<Texture> texture) { texture_ = std::move(texture); }
|
|
|
|
|
|
Ptr<Texture> getTexture() const { return texture_; }
|
|
|
|
|
|
|
|
|
|
|
|
// ------ 矩形区域(在纹理图集中的位置)------
|
|
|
|
|
|
void setRect(const Rect &rect) { rect_ = rect; }
|
|
|
|
|
|
const Rect &getRect() const { return rect_; }
|
|
|
|
|
|
|
|
|
|
|
|
// ------ 偏移(图集打包时的裁剪偏移)------
|
|
|
|
|
|
void setOffset(const Vec2 &offset) { offset_ = offset; }
|
|
|
|
|
|
const Vec2 &getOffset() const { return offset_; }
|
|
|
|
|
|
|
|
|
|
|
|
// ------ 原始尺寸(裁剪前的完整尺寸)------
|
|
|
|
|
|
void setOriginalSize(const Size &size) { originalSize_ = size; }
|
|
|
|
|
|
const Size &getOriginalSize() const { return originalSize_; }
|
|
|
|
|
|
|
|
|
|
|
|
// ------ 旋转标志(图集工具可能旋转90度)------
|
|
|
|
|
|
void setRotated(bool rotated) { rotated_ = rotated; }
|
|
|
|
|
|
bool isRotated() const { return rotated_; }
|
|
|
|
|
|
|
|
|
|
|
|
// ------ 名称(用于缓存索引)------
|
|
|
|
|
|
void setName(const std::string &name) { name_ = name; }
|
|
|
|
|
|
const std::string &getName() const { return name_; }
|
|
|
|
|
|
|
|
|
|
|
|
// ------ 有效性检查 ------
|
|
|
|
|
|
bool isValid() const { return texture_ != nullptr; }
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
Ptr<Texture> texture_;
|
|
|
|
|
|
Rect rect_;
|
|
|
|
|
|
Vec2 offset_;
|
|
|
|
|
|
Size originalSize_;
|
|
|
|
|
|
bool rotated_ = false;
|
|
|
|
|
|
std::string name_;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace extra2d
|