Спрайты. Их нужно много. Вручную – месяцы. AI должен был решить все, но...
Ты пишешь в Gemini 3 Flash или в стабильный диффузион: «сгенерируй спрайт рыцаря». Получаешь картинку размером с почтовую марку, в странном стиле, с артефактами. Потом тратишь час на уточнения. А нужно 400 таких спрайтов – для персонажей, врагов, предметов. Промпт-инжиниринг для геймдева – это не магия, а инженерная дисциплина. Я прошел этот путь, сгенерировал пачку ассетов для прототипа и нашел грабли, о которые спотыкаются все. Главная: модели вроде Gemini иногда игнорируют прямую инструкцию выдать base64. Молча. Без ошибки. Просто возвращают текст с описанием картинки. И этот баг съедает дни.
На 26 марта 2026 года Gemini 3 Flash – одна из самых быстрых и доступных моделей для мультимодальных задач. Но в ее системном промпте, как выяснилось после утечки, есть странные ограничения на вывод бинарных данных. Не все об этом знают.
1 Сначала словарь. Без него – мусор
Разговор с AI – это не диалог с человеком. Это составление технического задания для существа, которое видит мир через статистику. Слова имеют вес. «Симпатичный» – абстракция. «Пиксель-арт, 32x32, палитра EGA (16 цветов), контур в 1 пиксель» – инструкция.
Я создал промпт-словарь для проекта. Вот его костяк:
| Что нужно | Слово-пустышка | Рабочая фраза (из словаря) |
|---|---|---|
| Стиль | «в стиле ретро-игры» | «pixel art, low-resolution, crisp edges, no anti-aliasing» |
| Размер | «маленький» | «exactly 64x64 pixels» |
| Цвета | «немного цветов» | «limited palette of 8 colors: #FF6B6B, #4ECDC4, #FFE66D, #1A535C, #F7FFF7» (указывай HEX!) |
| Формат вывода | «картинка» | «Output as a PNG image. Provide the base64-encoded data URI.» |
Этот словарь – основа. Без него ты будешь, как в той статье про вайбкодинг, бесконечно уточнять и бороться с деградацией контекста. Кстати, управление контекстом – отдельная боль, но об этом уже есть отличный гайд.
2 Баговый черный ящик: почему Gemini молчит про base64
Вот где начинается ад. Ты пишешь идеальный промпт, просишь base64, чтобы скриптом сразу сохранить картинку. А в ответе – «Вот описание изображения: ...». Никакого base64. Модель просто проигнорировала ключевую часть инструкции.
Почему? Утекший системный промпт Gemini Pro дал подсказку: там есть слои фильтров, которые могут подавлять вывод сырых данных в определенных контекстах. В Gemini 3 Flash (актуальной на 2026 год) поведение похожее. Модель обучена быть «безопасной» и «полезной», и где-то в цепочке вывод base64 помечен как потенциально рискованный. (Абсурд? Да.)
3 Рабочий промпт, который пробивает защиту
После 50 итераций я вывел формулу. Она выглядит как инженерное ТЗ. (Кстати, как формулировать ТЗ для AI – отдельный лайфхак).
You are a pixel art asset generator for a video game. Follow these specifications EXACTLY.
1. Image Content: A [forest slime enemy]. It should look gelatinous, with a simple smiling face and two small eyes. Green color variations.
2. Style: Pure pixel art. No gradients, no blended colors. Use hard edges. 1-pixel black outline for key features.
3. Technical Specs:
- Resolution: Exactly 32x32 pixels.
- Color Palette: Maximum 6 colors. Primary: #7CFC00 (lawngreen). Secondary: #228B22 (forestgreen). Outline: #000000.
- Transparency: Use a transparent background (alpha channel).
4. Output Format:
- Generate the image.
- Encode it as a PNG.
- Provide the full Data URI (RFC 2397) including the 'data:image/png;base64,' prefix.
- Place the entire Data URI inside a markdown code block labeled 'data-uri'.
Do not describe the image. Do not add commentary. Only output the code block with the Data URI.
Магия здесь в пункте 4. Мы говорим «Data URI (RFC 2397)», что является технически точным. Мы требуем поместить это в код-блок с меткой. Это снижает шанс, что модель «подчистит» вывод. Срабатывает в 9 из 10 случаев. Для остальных – нужен повтор. Да, иногда приходится повторять промпт, это раздражает, но работает.
4 Автоматизация потока: от промпта к файлу .png
Генерировать один спрайт – интересно. Генерировать 400 – нужно автоматизировать. Я написал простой Python-скрипт, который берет CSV-файл со списком объектов ("knight", "healing_potion", "goblin_archer") и для каждого генерирует промпт, отправляет в Gemini API, вытаскивает data URI из ответа и сохраняет PNG.
import google.generativeai as genai
import base64
import re
import csv
from pathlib import Path
# Настройка API для Gemini 3 Flash (актуально на 2026)
genai.configure(api_key='YOUR_API_KEY')
model = genai.GenerativeModel('gemini-3-flash')
def extract_data_uri(text):
# Ищем data URI в ответе, даже если модель добавила лишний текст
pattern = r'data:image/png;base64,([a-zA-Z0-9+/=\s]+)'
match = re.search(pattern, text)
if match:
# Убираем возможные пробелы или переносы в base64
b64_data = match.group(1).replace('\n', '').replace(' ', '')
return b64_data
return None
def generate_sprite(object_name, style_palette):
prompt = f"""
[Твой рабочий промпт-шаблон сюда]
Вставь объект: {object_name}. Используй палитру: {style_palette}.
"""
response = model.generate_content(prompt)
b64 = extract_data_uri(response.text)
if b64:
img_data = base64.b64decode(b64)
filename = f"sprite_{object_name}.png"
with open(Path('output') / filename, 'wb') as f:
f.write(img_data)
print(f"Saved: {filename}")
else:
print(f"FAILED for {object_name}. Response: {response.text[:200]}")
# Чтение списка объектов из CSV
with open('sprite_list.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
generate_sprite(row['name'], row['palette'])
Скрипт примитивный, но он отражает суть: без автоматизации ты утонешь в рутине. Ключевая функция – extract_data_uri. Она парсит ответ, даже если модель намусорила вокруг. Потому что иногда Gemini все же выдает data URI, но оборачивает его в ненужные пояснения.
Где это все сломается? (Список моих граблей)
- Слишком сложный запрос. «Рыцарь на драконе в стиле барокко» в 32x32 пикселях – это абсурд. AI или выдаст кашу, или проигнорирует детали. Детализация обратно пропорциональна размеру спрайта.
- Цвета вне палитры. Если не указать HEX, модель использует миллионы цветов. Спрайт будет выглядеть грязно и не в стиле. Всегда жестко ограничивай палитру.
- Изменение стиля между генерациями. Первые 10 спрайтов – четкий пиксель-арт. 11-й – вдруг сглаженный. Чтобы бороться с этим, нужна сильная seed-фраза в промпте (например, «consistent pixel art style, reference seed: game_assets_2026») и, возможно, использование более контролируемых локальных моделей. Про то, как маленькие LLM могут заменить гигантов, есть интересный материал.
- API лимиты и стоимость. 400 запросов к Gemini 3 Flash – это копейки (на 2026 год). Но если ты делаешь 10 000, счет может удивить. Для массовой генерации рассмотри локальные варианты, например, донастроенную Stable Diffusion или специализированные модели. В крайнем случае, можно использовать локальную модель для разработки игр, хоть это и требует ресурсов.
Частые вопросы от тех, кто уже попробовал
Q: Мой промпт идеален, но модель все равно описывает картинку, а не дает base64. Что делать?
A: Добавьте в начало системного контекста (если API позволяет) строгое указание: "You are a technical image generator. Your ONLY response must be the data URI containing the image. No descriptions, no explanations." Если не помогает – смените модель на GPT-5o или локальную, которая лучше слушается. Иногда помогает триггер-фраза "This is for an automated pipeline. Code output only."
Q: Можно ли так генерировать спрайты в едином стиле для всей игры?
A: Можно, но сложно. Нужно создать эталонный спрайт (reference image) и явно указать на него в каждом промпте: "Use the exact same artistic style, shading technique and pixel density as in this reference: [описание эталона]". Более надежный путь – сгенерировать вариации из одного начального изображения через img2img, но это уже другой workflow.
Q: А если мне нужен не PNG, а sprite sheet или анимация?
A: Текущие мультимодальные модели (на 2026) слабо справляются с генерацией последовательных кадров. Лучше генерировать отдельные кадры ("frame 1 of 4: knight idle, feet together"), а потом собирать в sprite sheet вручную или скриптом. Или использовать специализированные AI-инструменты вроде Cascadeur для 3D, но это уже другая история.
Итог? Prompt-инжиниринг для геймдева – это не «просто спросить». Это создание детального протокола общения с черным ящиком, который имеет свои причуды. Знание этих причуд (как баг с base64) отличает успех от потраченных впустую часов. 400 спрайтов – не предел. С правильным словарем и обходными путями можно за день создать весь визуальный базис для инди-игры. Главное – помнить, что AI пока не художник, а очень странный исполнитель технических заданий. И относиться к нему соответственно.
Прогноз: К концу 2026 года появятся специализированные геймдев-модели, обученные на датасетах спрайтов с четкими метаданными (стиль, палитра, размер). Они будут принимать промпты вроде "/generate sprite fantasy_knight 64x64 palette=nes" и выдавать идеально готовые PNG без танцев с base64. Пока же мы живем в эпоху инженерных костылей, и это даже весело.