Слим или классика: решают 24 пикселя, и вы точно узнаете, какие именно
Скин считается «слим», если менее 6 из 24 пикселей в области (46,20)–(47,31) непрозрачны. А также полная UV-карта, почему старые скины 64×32 зеркалируются и почему скины Бедрока 128×128 никогда не загрузятся в Java.
В PNG-файле скина нет никаких указаний на то, что он «слим». Нет ни флага, ни метаданных, ни соглашений об именовании файлов — модель определяется по самому изображению, путём проверки определённого прямоугольника размером 2 × 12 пикселей и подсчёта количества фактически присутствующих пикселей.
Проверка
sample x 46–47, y 20–31 — 2 wide, 12 tall = 24 pixels
count pixels with alpha > 0
slim if fewer than 6 are opaque
Классические руки имеют ширину 4 пикселя; слим-руки — 3 пикселя. Таким образом, слим-скин оставляет четвёртый столбец руки пустым, и именно над этим столбцом находится область проверки. Двадцать четыре пикселя определяют, какую модель будет носить ваш персонаж.
Порог составляет 6 из 24, а не 1 — четверть столбца должна быть заполнена, прежде чем он будет считаться классическим. Этот допуск важен: слим-скин с несколькими случайными пикселями в «мёртвом» столбце всё равно будет распознан как слим, что и требуется, потому что эти случайные пиксели почти всегда являются ошибкой редактирования, а не намерением.
Это также означает, что сбой происходит незаметно. Если вы рисуете классический скин, но лишь слегка используете четвёртый столбец — тонкий контур, пара пикселей затенения — вы можете оказаться ниже 6 пикселей и быть автоматически распознаны как слим, потеряв пиксель ширины руки без объяснения причин. Если скин отображается с неправильной моделью, этот столбец — то место, куда следует посмотреть.
Полная UV-карта
Каждая часть скина представляет собой фиксированный прямоугольник, и каждая имеет слой наложения (overlay layer) в другом месте на листе:
| часть | основа | наложение | смещение | размер |
|---|---|---|---|---|
| голова | (8, 8) | шляпа (40, 8) | 32 вправо | 8 × 8 |
| тело | (20, 20) | куртка (20, 36) | 16 вниз | 8 × 12 |
| правая рука | (44, 20) | рукав (44, 36) | 16 вниз | 4 × 12 |
| правая нога | (4, 20) | штаны (4, 36) | 16 вниз | 4 × 12 |
| левая рука | (36, 52) | рукав (52, 52) | 16 вправо | 4 × 12 |
| левая нога | (20, 52) | штаны (4, 52) | 16 влево | 4 × 12 |
Пять из шести слоёв наложения расположены ровно на 16 пикселей от своей основы — но не в одном и том же направлении. Три исходные части смещаются на 16 вниз. Левая рука и левая нога, добавленные позже и втиснутые в нижнюю половину, где не было места под ними, смещаются на 16 вбок — и в противоположных направлениях друг от друга.
Шляпа — единственная, которая вообще не находится на расстоянии 16 пикселей: она находится на 32 пикселя вправо, в той же строке, что и голова.
Таким образом, правило «наложение находится под основой» применимо ровно к половине листа. Копирование базового прямоугольника и его смещение вниз для поиска наложения работает для тела, правой руки и правой ноги, но незаметно приводит к неправильной части для остальных трёх.
На слим-скине каждый прямоугольник руки шириной 4 пикселя вместо этого читается как 3 пикселя в ширину. Прямоугольники не перемещаются; меняется только ширина, считываемая из них.
Устаревшие скины 64 × 32 вообще не имеют левой стороны
Скин до версии 1.8 имеет размер 64 × 32 — нижняя половина листа просто не существует, а именно там находятся левая рука и левая нога. Их не из чего рисовать.
Решение — зеркалирование: правая нога (0, 16) копируется в (16, 48), а правая рука (40, 16) — в (32, 48), обе отражаются по горизонтали. Вот почему старые скины идеально симметричны, а современным не обязательно быть такими — асимметрия — это единственное, что формат 64 × 32 не может выразить, и любой старый скин, который вы конвертируете, получает навязанную ему симметрию, хочет он того или нет.
Скины Бедрока 128 × 128 — это другой формат, а не просто больший
Java принимает 64 × 64 или устаревшие 64 × 32. Бедрок принимает 128 × 128 и ничего больше. Просмотрщик ни одной из версий не может отображать файл другой — это не разница в разрешении, которая масштабируется, это другая UV-разметка другого размера.
Это скорее непреодолимая стена, чем неудобство. Скин Java не «масштабируется» до Бедрока, а скин Бедрока, загруженный в просмотрщик Java, не отображается в половинном размере — он отклоняется. Редактор на этой странице рассматривает эти две версии как отдельные сборки именно по этой причине.