dl
dl_sprite9.h
浏览该文件的文档.
1
15#pragma once
16
17#include "dl_type.h"
18#include "render/dl_factory.h"
19
20
21namespace dl
22{
25{
26public:
33 static Sprite9* Create(std::string_view spr_name)
34 {
35 Sprite9* ret = new Sprite9;
36 ret->_create(spr_name);
37 return ret;
38 }
39
41 {
42 Sprite9* ret = new Sprite9(*this);
43 ret->_coor = _coor->Clone();
44 for (size_t i = 0; i < 9; ++i)
45 {
46 ret->_spr[i] = g_factory->CloneSprite(_spr[i]);
47 ret->_spr[i]->SetCoor(ret->_coor);
48 }
49 return ret;
50 }
51
55 void Render()
56 {
57 for (auto& iter : _spr)
58 iter->Render();
59 }
60
64 void SetOrder(float order)
65 {
66 for (auto& iter : _spr)
67 iter->SetOrder(order);
68 }
69
70 void SetColor(const Color& color)
71 {
72 for (auto& iter : _spr)
73 iter->SetColor(color);
74 }
75
80 {
81 return _coor;
82 }
83
87 std::array<gcSprite, 9>& GetSpriteAll()
88 {
89 return _spr;
90 }
91
96 void SetRect(const Rect& rect)
97 {
98 _sizePut = toSizeNeg2Zero(Align::GetSize(rect));
99
100 std::array<unsigned, 4> px;
101 std::array<unsigned, 4> py;
102
103 if (true)
104 {
105 if (_sizePut.w >= _sizeMin.w)
106 px = { 0, _size[0][0], _sizePut[0] - _size[1][0], _sizePut[0] };
107 else
108 px = { 0, _sizePut.w / 3, _sizePut.w * 2 / 3, _sizePut.w };
109
110 if (_sizePut.h >= _sizeMin.h)
111 py = { 0, _size[0][1], _sizePut[1] - _size[1][1], _sizePut[1] };
112 else
113 py = { 0, _sizePut.h / 3, _sizePut.h * 2 / 3, _sizePut.h };
114 }
115
116
117
118
119 for (int i = 0; i != 9; ++i)
120 {
121 int x = i % 3;
122 int y = i / 3;
123 _spr[i]->SetQuad(createQuad(toPosition(px[x], py[y]), toPosition(px[x + 1], py[y + 1]))
124 + toPosition(Align::GetLT(rect))
125 - _anchor);
126 }
127
128 }
129
134 {
135 return _sizePut;
136 }
138 {
139 return _anchor;
140 }
141
142 void SetUI(bool ui, bool change_sampler = true)
143 {
144 for (auto& iter : _spr)
145 iter->SetUI(ui, change_sampler);
146 }
147
148 float GetOrder() { return _spr[0]->GetOrder(); }
149
150 bool IsPickup()
151 {
152 return Any::Yes(_spr, [](gcSprite spr)
153 {
154 return spr->IsPickup();
155 });
156 }
157
159 {
160 delete _coor;
161 }
162private:
163 void _create(std::string_view spr_name)
164 {
165 _coor = Coor::Create();
166
167 if (!spr_name.empty())
168 {
169 _anchor = g_factory->GetSpriteAnchor(g_factory->GetSpriteId(spr_name, 0));
170 for (int i = 0; i != 9; ++i)
171 {
172 _spr[i] = g_factory->CreateSprite(spr_name, i);
173 _spr[i]->SetCoor(_coor);
174 }
175 }
176 else
177 {
178 _anchor = {};
179 for (int i = 0; i != 9; ++i)
180 {
181 _spr[i] = g_factory->CreateSpriteDefault();
182 _spr[i]->SetCoor(_coor);
183 }
184 }
185
186
187 _size[0] = g_factory->GetSpriteTexSize(_spr[0]);
188 _size[1] = g_factory->GetSpriteTexSize(_spr[8]);
189
190 _sizeMin = _size[0] + _size[1];
191
192 SetRect(createRect({}, _sizeMin));
193 }
194
195 std::array<gcSprite, 9> _spr;
196 Coor* _coor;
197
198 Size _size[2];// 0号与8号的大小
199 Size _sizeMin;// 正常显示的最小大小
200 Size _sizePut;// 当前大小
201 Position _anchor;
202};
203}
2d坐标系
Coor * Clone()
static Coor * Create(Coor *parent=nullptr)
Size GetSpriteTexSize(const SpriteID &spr_id)
返回精灵的纹理大小
gcSprite CreateSpriteDefault(const Color &col=ColorDef::WHITE)
创建默认精灵
九图精灵
static Sprite9 * Create(std::string_view spr_name)
创建一个九图精灵
Coor * GetCoor()
返回坐标系
Size GetSize()
返回大小
void Render()
绘制
void SetOrder(float order)
设置绘制顺序
void SetColor(const Color &color)
void SetUI(bool ui, bool change_sampler=true)
Position GetAnchor()
std::array< gcSprite, 9 > & GetSpriteAll()
返回精灵,用于批量操作
Sprite9 * Clone()
void SetRect(const Rect &rect)
设置大小
void SetCoor(Coor *coor, bool own=false)
bool IsPickup()
是否被鼠标选中
资源工厂
通用类型
constexpr Array< T, 2 > GetSize(const Array< T, 4 > &rect)
计算返回 矩形 宽和高
constexpr Array< T, 2 > GetLT(const Array< T, 4 > &rect)
bool Yes(const C &container, F func)
判断容器任意元素满足条件
Position2 Position
constexpr Array< Position::value_type, N > toPosition(const Array< T, N > &a)
转换到Position,已知长度
Factory * g_factory
constexpr Rect createRect(const Size &size)
创建一个Rect,依据大小
constexpr Array< Size::value_type, N > toSizeNeg2Zero(const Array< T, N > &a)
转换到Size,出现负数时转为0
GC< Sprite > gcSprite
Array< float, 4 > Color
Point4 Rect
constexpr Quad createQuad(const Position &p0, const Position &p1, const Position &p2, const Position &p3)
创建一个Quad
PointU Size