@jjlmoya/utils-games-development 1.47.0 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/tests/locale_completeness.test.ts +1 -20
  5. package/src/tests/tool_validation.test.ts +2 -3
  6. package/src/tool/itchioGameTester/client.ts +12 -23
  7. package/src/tool/itchioGameTester/component.astro +0 -7
  8. package/src/tool/itchioGameTester/i18n/de.ts +0 -2
  9. package/src/tool/itchioGameTester/i18n/en.ts +0 -2
  10. package/src/tool/itchioGameTester/i18n/es.ts +0 -2
  11. package/src/tool/itchioGameTester/i18n/fr.ts +0 -2
  12. package/src/tool/itchioGameTester/i18n/id.ts +0 -2
  13. package/src/tool/itchioGameTester/i18n/it.ts +0 -2
  14. package/src/tool/itchioGameTester/i18n/ja.ts +0 -2
  15. package/src/tool/itchioGameTester/i18n/ko.ts +0 -2
  16. package/src/tool/itchioGameTester/i18n/nl.ts +0 -2
  17. package/src/tool/itchioGameTester/i18n/pl.ts +0 -2
  18. package/src/tool/itchioGameTester/i18n/pt.ts +0 -2
  19. package/src/tool/itchioGameTester/i18n/ru.ts +0 -2
  20. package/src/tool/itchioGameTester/i18n/sv.ts +0 -2
  21. package/src/tool/itchioGameTester/i18n/tr.ts +0 -2
  22. package/src/tool/itchioGameTester/i18n/zh.ts +0 -2
  23. package/src/tool/itchioGameTester/ui.ts +0 -2
  24. package/src/tool/spriteSheetPacker/app-client.ts +248 -0
  25. package/src/tool/spriteSheetPacker/bibliography.astro +6 -0
  26. package/src/tool/spriteSheetPacker/bibliography.ts +12 -0
  27. package/src/tool/spriteSheetPacker/component.astro +229 -0
  28. package/src/tool/spriteSheetPacker/dropzone-client.ts +55 -0
  29. package/src/tool/spriteSheetPacker/entry.ts +28 -0
  30. package/src/tool/spriteSheetPacker/exporter.ts +116 -0
  31. package/src/tool/spriteSheetPacker/extractor-client.ts +127 -0
  32. package/src/tool/spriteSheetPacker/flipbook-client.ts +60 -0
  33. package/src/tool/spriteSheetPacker/i18n/de.ts +270 -0
  34. package/src/tool/spriteSheetPacker/i18n/en.ts +275 -0
  35. package/src/tool/spriteSheetPacker/i18n/es.ts +275 -0
  36. package/src/tool/spriteSheetPacker/i18n/fr.ts +270 -0
  37. package/src/tool/spriteSheetPacker/i18n/id.ts +270 -0
  38. package/src/tool/spriteSheetPacker/i18n/it.ts +270 -0
  39. package/src/tool/spriteSheetPacker/i18n/ja.ts +270 -0
  40. package/src/tool/spriteSheetPacker/i18n/ko.ts +270 -0
  41. package/src/tool/spriteSheetPacker/i18n/nl.ts +270 -0
  42. package/src/tool/spriteSheetPacker/i18n/pl.ts +270 -0
  43. package/src/tool/spriteSheetPacker/i18n/pt.ts +270 -0
  44. package/src/tool/spriteSheetPacker/i18n/ru.ts +266 -0
  45. package/src/tool/spriteSheetPacker/i18n/sv.ts +270 -0
  46. package/src/tool/spriteSheetPacker/i18n/tr.ts +270 -0
  47. package/src/tool/spriteSheetPacker/i18n/zh.ts +270 -0
  48. package/src/tool/spriteSheetPacker/index.ts +11 -0
  49. package/src/tool/spriteSheetPacker/logic.test.ts +155 -0
  50. package/src/tool/spriteSheetPacker/logic.ts +32 -0
  51. package/src/tool/spriteSheetPacker/packer-core.ts +121 -0
  52. package/src/tool/spriteSheetPacker/packer-ui.ts +86 -0
  53. package/src/tool/spriteSheetPacker/seo.astro +15 -0
  54. package/src/tool/spriteSheetPacker/sprite-sheet-packer.css +542 -0
  55. package/src/tool/spriteSheetPacker/types.ts +89 -0
  56. package/src/tool/spriteSheetPacker/ui.ts +42 -0
  57. package/src/tools.ts +2 -0
@@ -0,0 +1,270 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { SpriteSheetPackerUI } from '../ui';
3
+
4
+ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
5
+ slug: 'empacotador-e-extrator-de-sprite-sheet',
6
+ title: 'Empacotador e Extrator de Sprite Sheet',
7
+ description:
8
+ 'Otimize o desempenho de jogos 2D alinhando frames de animação em atlas de textura ou extraindo sprites de folhas existentes.',
9
+ ui: {
10
+ packerTab: 'Estúdio de Empacotamento',
11
+ extractorTab: 'Extrator de Sprites',
12
+ dropZoneTitle: 'Arraste e Solte os Frames',
13
+ dropZoneSubtitle: 'Envie imagens PNG ou WebP para gerar seu atlas de textura otimizado',
14
+ selectFilesButton: 'Selecionar Imagens',
15
+ clearAllButton: 'Limpar Área de Trabalho',
16
+ downloadZipButton: 'Baixar Pacote (ZIP)',
17
+ copyJsonButton: 'Copiar JSON do Atlas',
18
+ downloadSheetPngButton: 'Baixar Textura PNG',
19
+ paddingLabel: 'Espaçamento de Frames (px)',
20
+ borderExtrusionLabel: 'Extrusão de Borda (px)',
21
+ maxTextureSizeLabel: 'Dimensão Máxima da Textura',
22
+ powerOfTwoLabel: 'Forçar Potência de 2 (POT)',
23
+ trimTransparencyLabel: 'Cortar Transparência',
24
+ exportFormatLabel: 'Formato do Motor Alvo',
25
+ presetPixelArt: 'Preset Pixel Art 16x16',
26
+ presetHdUi: 'Preset Atlas HD UI 1024',
27
+ presetMobile: 'Preset Mobile WebGL 2048',
28
+ formatGenericHash: 'JSON Genérico (Hash)',
29
+ formatGenericArray: 'JSON Genérico (Array)',
30
+ formatUnity: 'Motor Unity 2D',
31
+ formatGodot: 'Motor Godot 2D',
32
+ formatPhaser: 'Motor Phaser / PixiJS',
33
+ formatCss: 'CSS Web Frontend',
34
+ previewTitle: 'Pré-visualização do Atlas de Textura',
35
+ efficiencyBadge: 'Eficiência da Textura',
36
+ drawCallsBadge: 'Redução de Draw Calls',
37
+ totalFramesBadge: 'Frames Empacotados',
38
+ textureSizeBadge: 'Dimensão do Atlas',
39
+ flipbookTitle: 'Reprodutor Flipbook de Animação',
40
+ flipbookFpsLabel: 'Velocidade da Animação (FPS)',
41
+ playAnimation: 'Iniciar Sequência',
42
+ pauseAnimation: 'Pausar Sequência',
43
+ extractorModeGrid: 'Corte por Grade Fixa',
44
+ extractorModeAlpha: 'Corte Automático por Canal Alfa',
45
+ frameWidthLabel: 'Largura do Frame (px)',
46
+ frameHeightLabel: 'Altura do Frame (px)',
47
+ marginLabel: 'Margem Externa (px)',
48
+ spacingLabel: 'Espaçamento da Grade (px)',
49
+ extractFramesButton: 'Extrair Imagens',
50
+ extractedCountLabel: 'Sprites Extraídos',
51
+ codeSnippetTitle: 'Código de Integração do Motor',
52
+ copySnippetButton: 'Copiar Código',
53
+ copiedToast: 'Copiado para a Área de Transferência',
54
+ },
55
+ seo: [
56
+ {
57
+ type: 'title',
58
+ level: 2,
59
+ text: 'Otimização de Renderização e Draw Calls em Motores de Jogos 2D',
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: 'Agrupar múltiplos frames individuais em um único atlas de textura reduz drasticamente o número de instruções draw calls enviadas do processador para a placa gráfica GPU.',
64
+ },
65
+ {
66
+ type: 'stats',
67
+ columns: 4,
68
+ items: [
69
+ { value: '95%', label: 'Redução de Draw Calls' },
70
+ { value: '4x', label: 'Processamento GPU Mais Rápido' },
71
+ { value: '60 FPS', label: 'Meta Estável em Dispositivos Móveis' },
72
+ { value: '100%', label: 'Processamento Local no Navegador' },
73
+ ],
74
+ },
75
+ {
76
+ type: 'title',
77
+ level: 2,
78
+ text: 'Comparativo entre Imagens Avulsas e Atlas de Textura',
79
+ },
80
+ {
81
+ type: 'comparative',
82
+ columns: 2,
83
+ items: [
84
+ {
85
+ title: 'Arquivos de Frames Avulsos',
86
+ description: 'Arquivos PNG ou WebP armazenados separadamente',
87
+ points: [
88
+ 'Gera uma instrução draw call separada para cada frame exibido na tela',
89
+ 'Provoca trocas frequentes de contexto na placa de vídeo GPU',
90
+ 'Aumenta o número de requisições HTTP em jogos para web',
91
+ 'Queda de taxa de quadros em dispositivos móveis',
92
+ ],
93
+ },
94
+ {
95
+ title: 'Atlas de Textura Empacotado',
96
+ description: 'Imagem PNG única combinada com dados de coordenadas JSON',
97
+ points: [
98
+ 'Agrupa centenas de sprites em uma única instrução draw call da GPU',
99
+ 'Maximiza a largura de banda da memória VRAM e a velocidade de renderização',
100
+ 'Reduz requisições agrupando textura e dados em um único download',
101
+ 'Garante 60 FPS fluídos em todas as plataformas',
102
+ ],
103
+ },
104
+ ],
105
+ },
106
+ {
107
+ type: 'title',
108
+ level: 2,
109
+ text: 'Matemática da Extrusão de Bordas e Movimento Subpixel',
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Aplicar 1 a 2 pixels de extrusão de borda duplica os pixels externos da imagem, evitando linhas visíveis quando a câmera se move em subpixels.',
114
+ },
115
+ {
116
+ type: 'tip',
117
+ title: 'Estratégia de Extrusão de Bordas',
118
+ html: 'Utilize extrusão de bordas para impedir que pixels vizinhos vazem ao movimentar a câmera 2D.',
119
+ },
120
+ {
121
+ type: 'title',
122
+ level: 2,
123
+ text: 'Dimensões Recomendadas de Textura por Plataforma',
124
+ },
125
+ {
126
+ type: 'table',
127
+ headers: ['Plataforma Alvo', 'Tamanho Máximo Recomendado', 'Requisito Potência de 2', 'Perfil de Memória'],
128
+ rows: [
129
+ ['Navegadores Móveis', '2048 x 2048 px', 'Obrigatório em WebGL 1.0', 'Baixa Largura de Banda'],
130
+ ['PC / Consoles', '4096 x 4096 px', 'Recomendado', 'Alta Capacidade de GPU'],
131
+ ['Consoles Portáteis Retro', '1024 x 1024 px', 'Requisito Estrito', 'Limites de VRAM Rigorosos'],
132
+ ],
133
+ },
134
+ {
135
+ type: 'proscons',
136
+ items: [
137
+ {
138
+ pro: 'Garante 100% de compatibilidade com drivers antigos e WebGL 1.0',
139
+ con: 'Pode deixar espaço transparente não utilizado com poucos sprites',
140
+ },
141
+ {
142
+ pro: 'Suporta geração automática de mipmaps por hardware',
143
+ con: 'Exige ajuste fino de margem em formatos irregulares',
144
+ },
145
+ {
146
+ pro: 'Otimiza a alocação de memória VRAM na placa gráfica',
147
+ con: 'Aumenta ligeiramente a área de textura inicial',
148
+ },
149
+ ],
150
+ },
151
+ {
152
+ type: 'title',
153
+ level: 2,
154
+ text: 'Termos Chave no Empacotamento de Sprites',
155
+ },
156
+ {
157
+ type: 'glossary',
158
+ items: [
159
+ {
160
+ term: 'Draw Call',
161
+ definition: 'Instrução enviada pelo processador para a placa gráfica desenhar geometrias e texturas.',
162
+ },
163
+ {
164
+ term: 'Bin Packing',
165
+ definition: 'Técnica algorítmica para organizar elementos retangulares de forma otimizada em espaço mínimo.',
166
+ },
167
+ {
168
+ term: 'Border Extrusion',
169
+ definition: 'Duplicação dos pixels da borda para fora evitando imperfeições ao mover a câmera.',
170
+ },
171
+ {
172
+ term: 'Flipbook Animation',
173
+ definition: 'Reprodução sequencial rápida de quadros estáticos para simular movimento contínuo.',
174
+ },
175
+ ],
176
+ },
177
+ {
178
+ type: 'title',
179
+ level: 2,
180
+ text: 'Lista de Controle de Desempenho',
181
+ },
182
+ {
183
+ type: 'diagnostic',
184
+ variant: 'info',
185
+ title: 'Regras de Produção',
186
+ html: 'Agrupe animações em atlas compartilhados e utilize potências de dois para builds em WebGL.',
187
+ },
188
+ ],
189
+ faq: [
190
+ {
191
+ question: 'O que é um sprite sheet e por que é essencial em jogos 2D?',
192
+ answer:
193
+ 'Um sprite sheet é um arquivo de imagem composto contendo múltiplos frames de animação. Isso permite desenhar vários elementos em uma única instrução da GPU.',
194
+ },
195
+ {
196
+ question: 'Como funciona o processamento local nesta ferramenta?',
197
+ answer:
198
+ 'Suas imagens são processadas localmente no seu navegador através da API Canvas HTML5 sem enviar dados a servidores externos.',
199
+ },
200
+ {
201
+ question: 'Posso extrair frames de uma folha de sprites existente?',
202
+ answer:
203
+ 'Sim. Mude para o modo Extrator, envie sua folha e ajuste o tamanho da grade para recortar cada imagem.',
204
+ },
205
+ ],
206
+ howTo: [
207
+ {
208
+ name: 'Enviar Imagens',
209
+ text: 'Arraste e solte seus arquivos PNG ou WebP na área de carregamento.',
210
+ },
211
+ {
212
+ name: 'Ajustar Configurações',
213
+ text: 'Configure o espaçamento, a extrusão de borda e a dimensão máxima da textura.',
214
+ },
215
+ {
216
+ name: 'Pré-visualizar e Baixar',
217
+ text: 'Verifique a animação no reprodutor flipbook e baixe seu arquivo ZIP.',
218
+ },
219
+ ],
220
+ schemas: [
221
+ {
222
+ '@context': 'https://schema.org',
223
+ '@type': 'SoftwareApplication',
224
+ name: 'Empacotador e Extrator de Sprite Sheet',
225
+ applicationCategory: 'DeveloperApplication',
226
+ operatingSystem: 'Any',
227
+ offers: {
228
+ '@type': 'Offer',
229
+ price: '0',
230
+ priceCurrency: 'USD',
231
+ },
232
+ },
233
+ {
234
+ '@context': 'https://schema.org',
235
+ '@type': 'FAQPage',
236
+ mainEntity: [
237
+ {
238
+ '@type': 'Question',
239
+ name: 'O que é um sprite sheet e por que é essencial em jogos 2D?',
240
+ acceptedAnswer: {
241
+ '@type': 'Answer',
242
+ text: 'Um sprite sheet é um arquivo de imagem composto contendo múltiplos frames de animação que permite desenhar vários elementos em uma única instrução da GPU.',
243
+ },
244
+ },
245
+ ],
246
+ },
247
+ {
248
+ '@context': 'https://schema.org',
249
+ '@type': 'HowTo',
250
+ name: 'Como empacotar e extrair sprite sheets',
251
+ step: [
252
+ {
253
+ '@type': 'HowToStep',
254
+ name: 'Enviar Imagens',
255
+ text: 'Arraste e solte seus arquivos PNG ou WebP na área de carregamento.',
256
+ },
257
+ ],
258
+ },
259
+ ],
260
+ bibliography: [
261
+ {
262
+ name: 'Godot Engine 2D Sprite Sheets Documentation',
263
+ url: 'https://docs.godotengine.org/en/stable/tutorials/2d/2d_sprite_animation.html',
264
+ },
265
+ {
266
+ name: 'Unity Sprite Atlas Manual',
267
+ url: 'https://docs.unity3d.com/Manual/class-SpriteAtlas.html',
268
+ },
269
+ ],
270
+ };
@@ -0,0 +1,266 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { SpriteSheetPackerUI } from '../ui';
3
+
4
+ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
5
+ slug: 'upakovshchik-i-ekstraktor-sprajt-shitov',
6
+ title: 'Упаковщик и Экстрактор Спрайт Шитов',
7
+ description:
8
+ 'Оптимизируйте производительность 2D игр объединяя отдельные кадры анимации в атласы текстур или извлекая спрайты из готовых листов.',
9
+ ui: {
10
+ packerTab: 'Студия Упаковки',
11
+ extractorTab: 'Экстрактор Спрайтов',
12
+ dropZoneTitle: 'Перетащите Кадры Сюда',
13
+ dropZoneSubtitle: 'Загрузите изображения PNG или WebP для создания оптимизированного атласа текстур',
14
+ selectFilesButton: 'Выбрать Файлы Изображений',
15
+ clearAllButton: 'Очистить Рабочую Область',
16
+ downloadZipButton: 'Скачать Архив (ZIP)',
17
+ copyJsonButton: 'Копировать JSON Атласа',
18
+ downloadSheetPngButton: 'Скачать Текстуру PNG',
19
+ paddingLabel: 'Отступ Кадров (px)',
20
+ borderExtrusionLabel: 'Экструзия Краев (px)',
21
+ maxTextureSizeLabel: 'Максимальный Размер Текстуры',
22
+ powerOfTwoLabel: 'Степень Двойки (POT)',
23
+ exportFormatLabel: 'Формат Игрового Движка',
24
+ presetPixelArt: 'Пресет Пиксель Арт 16x16',
25
+ presetHdUi: 'Пресет HD UI Atlas 1024',
26
+ presetMobile: 'Пресет Mobile WebGL 2048',
27
+ formatGenericHash: 'Общий JSON (Hash)',
28
+ formatGenericArray: 'Общий JSON (Array)',
29
+ formatUnity: 'Движок Unity 2D',
30
+ formatGodot: 'Движок Godot 2D',
31
+ formatPhaser: 'Движок Phaser / PixiJS',
32
+ formatCss: 'CSS Web Frontend',
33
+ previewTitle: 'Предпросмотр Атласа Текстур',
34
+ efficiencyBadge: 'Эффективность Упаковки',
35
+ drawCallsBadge: 'Сокращение Draw Calls',
36
+ totalFramesBadge: 'Упаковано Кадров',
37
+ textureSizeBadge: 'Разрешение Атласа',
38
+ flipbookTitle: 'Анимационный Плеер Флипбук',
39
+ flipbookFpsLabel: 'Скорость Анимации (FPS)',
40
+ playAnimation: 'Запустить',
41
+ pauseAnimation: 'Пауза',
42
+ frameWidthLabel: 'Ширина Кадра (px)',
43
+ frameHeightLabel: 'Высота Кадра (px)',
44
+ marginLabel: 'Внешний Отступ (px)',
45
+ spacingLabel: 'Шаг Сетки (px)',
46
+ extractedCountLabel: 'Извлечено Спрайтов',
47
+ codeSnippetTitle: 'Код Интеграции с Движком',
48
+ copySnippetButton: 'Копировать Код',
49
+ copiedToast: 'Скопировано в Буфер Обмена',
50
+ },
51
+ seo: [
52
+ {
53
+ type: 'title',
54
+ level: 2,
55
+ text: 'Оптимизация Вызовов Отрисовки Draw Calls и Батчинг GPU в 2D Движках',
56
+ },
57
+ {
58
+ type: 'paragraph',
59
+ html: 'Объединение отдельных изображений кадров в единый атлас текстур уменьшает количество команд отрисовки draw calls отправляемых процессором на видеокарту.',
60
+ },
61
+ {
62
+ type: 'stats',
63
+ columns: 4,
64
+ items: [
65
+ { value: '95%', label: 'Сокращение Draw Calls' },
66
+ { value: '4x', label: 'Ускорение Обработки GPU' },
67
+ { value: '60 FPS', label: 'Стабильная Цель на Мобильных' },
68
+ { value: '100%', label: 'Локальная Обработка в Браузере' },
69
+ ],
70
+ },
71
+ {
72
+ type: 'title',
73
+ level: 2,
74
+ text: 'Сравнение Отдельных Файлов и Упакованных Атласов Текстур',
75
+ },
76
+ {
77
+ type: 'comparative',
78
+ columns: 2,
79
+ items: [
80
+ {
81
+ title: 'Отдельные Файлы Кадров',
82
+ description: 'Отдельно сохраненные файлы PNG или WebP',
83
+ points: [
84
+ 'Генерирует отдельный вызов отрисовки для каждого кадра на экране',
85
+ 'Вызывает частые переключения контекста на видеокарте GPU',
86
+ 'Увеличивает количество HTTP запросов в браузерных играх',
87
+ 'Падение производительности на мобильных устройствах',
88
+ ],
89
+ },
90
+ {
91
+ title: 'Упакованный Атлас Текстур',
92
+ description: 'Единое PNG изображение с JSON метаданными',
93
+ points: [
94
+ 'Объединяет сотни спрайтов в один вызов отрисовки GPU',
95
+ 'Максимизирует пропускную способность видеопамяти',
96
+ 'Уменьшает количество сетевых запросов',
97
+ 'Обеспечивает плавные 60 FPS на любых платформах',
98
+ ],
99
+ },
100
+ ],
101
+ },
102
+ {
103
+ type: 'title',
104
+ level: 2,
105
+ text: 'Математика Экструзии Краев и Субпиксельное Движение',
106
+ },
107
+ {
108
+ type: 'paragraph',
109
+ html: 'Применение экструзии краев от 1 до 2 пикселей дублирует крайние пиксели кадров наружу исключая появление видимых швов при движении камеры.',
110
+ },
111
+ {
112
+ type: 'tip',
113
+ title: 'Стратегия Экструзии Краев',
114
+ html: 'Используйте экструзию краев для полного устранения артефактов на границах спрайтов при движении камеры.',
115
+ },
116
+ {
117
+ type: 'title',
118
+ level: 2,
119
+ text: 'Рекомендуемые Размеры Текстур для Различных Платформ',
120
+ },
121
+ {
122
+ type: 'table',
123
+ headers: ['Целевая Платформа', 'Рекомендуемый Макс Размер', 'Требование Степени 2', 'Профиль Памяти'],
124
+ rows: [
125
+ ['Мобильные Браузеры', '2048 x 2048 px', 'Обязательно для WebGL 1.0', 'Низкая Пропускная Способность'],
126
+ ['ПК / Консоли', '4096 x 4096 px', 'Рекомендуется', 'Высокая Емкость GPU'],
127
+ ['Ретро Портативные Консоли', '1024 x 1024 px', 'Строгое Требование', 'Строгие Лимиты VRAM'],
128
+ ],
129
+ },
130
+ {
131
+ type: 'proscons',
132
+ items: [
133
+ {
134
+ pro: 'Гарантирует 100% совместимость со старыми драйверами и WebGL 1.0',
135
+ con: 'Может оставлять неиспользуемое прозрачное пространство при малом числе спрайтов',
136
+ },
137
+ {
138
+ pro: 'Поддерживает автоматическую генерацию мипмапов',
139
+ con: 'Требует точной настройки отступов при нестандартных размерах',
140
+ },
141
+ {
142
+ pro: 'Оптимизирует распределение видеопамяти VRAM на GPU',
143
+ con: 'Незначительно увеличивает начальную площадь текстуры',
144
+ },
145
+ ],
146
+ },
147
+ {
148
+ type: 'title',
149
+ level: 2,
150
+ text: 'Ключевые Термины Упаковки Спрайтов',
151
+ },
152
+ {
153
+ type: 'glossary',
154
+ items: [
155
+ {
156
+ term: 'Draw Call',
157
+ definition: 'Команда от процессора видеокарте на отрисовку геометрии и текстур.',
158
+ },
159
+ {
160
+ term: 'Bin Packing',
161
+ definition: 'Алгоритм оптимальной упаковки прямоугольников разного размера в минимальную область.',
162
+ },
163
+ {
164
+ term: 'Border Extrusion',
165
+ definition: 'Дублирование крайних пикселей наружу для предотвращения визуальных швов при движении.',
166
+ },
167
+ {
168
+ term: 'Flipbook Animation',
169
+ definition: 'Быстрое последовательное воспроизведение кадров для имитации движения в 2D играх.',
170
+ },
171
+ ],
172
+ },
173
+ {
174
+ type: 'title',
175
+ level: 2,
176
+ text: 'Чек Лист Оптимизации Производительности',
177
+ },
178
+ {
179
+ type: 'diagnostic',
180
+ variant: 'info',
181
+ title: 'Правила Разработки',
182
+ html: 'Группируйте анимации в общие атласы и используйте размеры степеней двойки для WebGL сборки.',
183
+ },
184
+ ],
185
+ faq: [
186
+ {
187
+ question: 'Что такое спрайт шит и почему он важен для 2D игр?',
188
+ answer:
189
+ 'Спрайт шит это единое изображение содержащее множество кадров анимации. Это позволяет движку рисовать объекты за один вызов GPU.',
190
+ },
191
+ {
192
+ question: 'Как работает локальная обработка в этом инструменте?',
193
+ answer:
194
+ 'Все операции выполняются локально в вашем браузере через HTML5 Canvas API без отправки файлов на сервера.',
195
+ },
196
+ {
197
+ question: 'Могу ли я нарезать готовый спрайт шит на отдельные кадры?',
198
+ answer:
199
+ 'Да. Переключитесь в режим Экстрактора, загрузите лист и настройте параметры сетки.',
200
+ },
201
+ ],
202
+ howTo: [
203
+ {
204
+ name: 'Загрузите Кадры',
205
+ text: 'Перетащите файлы PNG или WebP в рабочую область.',
206
+ },
207
+ {
208
+ name: 'Настройте Параметры',
209
+ text: 'Установите отступы, экструзию краев и формат игрового движка.',
210
+ },
211
+ {
212
+ name: 'Проверьте и Скачайте',
213
+ text: 'Просмотрите анимацию в плеере флипбук и скачайте ZIP архив.',
214
+ },
215
+ ],
216
+ schemas: [
217
+ {
218
+ '@context': 'https://schema.org',
219
+ '@type': 'SoftwareApplication',
220
+ name: 'Упаковщик и Экстрактор Спрайт Шитов',
221
+ applicationCategory: 'DeveloperApplication',
222
+ operatingSystem: 'Any',
223
+ offers: {
224
+ '@type': 'Offer',
225
+ price: '0',
226
+ priceCurrency: 'USD',
227
+ },
228
+ },
229
+ {
230
+ '@context': 'https://schema.org',
231
+ '@type': 'FAQPage',
232
+ mainEntity: [
233
+ {
234
+ '@type': 'Question',
235
+ name: 'Что такое спрайт шит и почему он важен для 2D игр?',
236
+ acceptedAnswer: {
237
+ '@type': 'Answer',
238
+ text: 'Спрайт шит это единое изображение содержащее множество кадров анимации.',
239
+ },
240
+ },
241
+ ],
242
+ },
243
+ {
244
+ '@context': 'https://schema.org',
245
+ '@type': 'HowTo',
246
+ name: 'Как упаковать и нарезать спрайт шиты',
247
+ step: [
248
+ {
249
+ '@type': 'HowToStep',
250
+ name: 'Загрузите Кадры',
251
+ text: 'Перетащите файлы PNG или WebP в рабочую область.',
252
+ },
253
+ ],
254
+ },
255
+ ],
256
+ bibliography: [
257
+ {
258
+ name: 'Godot Engine 2D Sprite Sheets Documentation',
259
+ url: 'https://docs.godotengine.org/en/stable/tutorials/2d/2d_sprite_animation.html',
260
+ },
261
+ {
262
+ name: 'Unity Sprite Atlas Manual',
263
+ url: 'https://docs.unity3d.com/Manual/class-SpriteAtlas.html',
264
+ },
265
+ ],
266
+ };